请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32之ADC的使用

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
什么是ADC& i" D* W, e3 b' c' C
ADC,即Analog-to-Digital Converter,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。可以将真实世界的模拟信号,例如温度、压力、声音或者图像等,转换成更容易储存、处理和发射的数字形式。# O1 Y- c$ b7 ^1 k
. `) e& I' P9 v: T" P3 u
一.利用stm32cubeMX勾选ADC1的IN1
( F$ M, F: x: Z# H6 x: W6 I( \我这用的是stm32g070rb,只有ADC1。然后打开串口,通过串口来看采样数据。
5 j' x  ]7 P# y6 \, h
: u/ M/ N8 o2 Z8 o: g1 u1 ]5 t
20210428153958922.png

% ?1 h! g2 U, k" o( ]$ f1 a) J
20210428154026962.png
  r  @2 p  J1 }' A
+ O: _/ z; ?( @! d  [2 z, ]
20210428154327448.png

2 W# b3 v1 r) c& l1 @7 \5 `% R. I7 Y) a% e
( Q; X9 h. d, s  k$ U) }0 ~
二.编写相关代码
% r7 v$ {. O! n9 V1 z, p2 i1.先写一个串口发送函数,将采样值通过串口发送出去。  S8 r/ N' p( H0 ?: G. l0 a) x
这里并没有使用DMA模式,也没有添加串口重定向函数,直接使用sprintf()函数将采样值储存在uint8_t str_buff[64]中,然后用HAL_UART_Transmit()发送出去(HAL库自带的)。
3 K/ b0 J4 m1 k
& i7 ]- p3 H; @, k! b9 c
  1. void UR2_Send_Info()
    4 E) O9 T7 r! R* a
  2. {
    ! L, K5 \, j. L( `) i# O( L/ F
  3.         sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt%100,(ADC_Volt%100)/10,ADC_Volt%10);7 y6 T0 ?: z& G0 c; Y6 X
  4.         HAL_UART_Transmit(&huart2,str_buff,sizeof(str_buff),10000);7 h  t9 z+ n$ }! C6 ]
  5. }
复制代码

9 E! V3 o' l/ [7 j0 f2.再写上AD转换函数
7 z; P+ q$ b- R; Q+ M9 }7 F0 e
  1. void ADC_Get_Value()
    1 R7 \9 Q) Z3 w4 X( i& l
  2. {& h- ]) q/ b4 m5 x7 |
  3.         HAL_ADC_Start(&hadc1);//开启ADC1
    ; H* ^. R/ Q5 F) I( W
  4.         LED_ON();//开灯
    , a! z9 {6 O4 }% p2 `
  5.         if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)//如果ADC收到数据# a! r  W( g" x9 F5 g" S7 ^
  6.         {4 A+ f! ^% \3 x0 o1 a
  7.                 //则将数据获取到并赋给ADC_Value. q9 _- J1 G# g3 T& {8 Y
  8.                 ADC_Value = HAL_ADC_GetValue(&hadc1);; F4 S' J, Q, k+ m1 n
  9.                 //将获取到的值转换为电压值
    2 O# X& u5 W  z$ O' k
  10.                 ADC_Volt = ADC_Value * 330 / 4096;
    ' D. k4 g8 M# d5 K* B; T( {$ {
  11.         }
    " n9 v; [4 {9 v
  12.         UR2_Send_Info();//通过串口发送出去& r( w- ]5 T+ ~9 `
  13.         LED_OFF();//关闭LED! C8 t: S" ^( `, O! B4 U
  14.         HAL_ADC_Stop(&hadc1);//停止ADC检测/ \3 `% \# }! q  Z
  15. }
复制代码
- Z8 q- D7 M8 X2 y
3.在主函数中编写代码6 _9 s6 J5 A2 O9 b9 Z3 |
只要在大循环中加入下列代码就好
2 t0 Y: f7 ^  z
  1. while (1)8 `6 j( `, o% b. A2 A3 Y6 G3 A
  2.   {
    8 g, L/ R" U7 |/ ]- \8 z
  3.                 ADC_Get_Value();
    1 m1 L+ c, _" a! Y* m5 L& d3 Z
  4.                 HAL_Delay(2000);
    * X4 b7 A+ r0 L! q4 m: q! x( I
  5.   }
复制代码
三.效果- _1 A% X5 L" d; j! w. s4 z
每测量一次电压值,LED灯就闪烁一次,并且将测量值和转换后的电压值通过串口发送出去。在使用测水位的传感器,测锂电池的电压等场景中使用。
- o7 x( a% Z+ H
/ O. e# O0 |' \$ N9 V/ H
) ?5 N. P; C- i3 `
收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版