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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
什么是ADC0 L8 ~# B, |, y' I- `! R  {2 n
ADC,即Analog-to-Digital Converter,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。可以将真实世界的模拟信号,例如温度、压力、声音或者图像等,转换成更容易储存、处理和发射的数字形式。/ b, D# ]2 T7 x* T

: ^8 X* m+ U& X3 ^一.利用stm32cubeMX勾选ADC1的IN1
8 L: C# M$ l! m0 l: ]5 V2 [( s, Z我这用的是stm32g070rb,只有ADC1。然后打开串口,通过串口来看采样数据。
9 S0 y* |# d! L& d6 q. R- ]6 y; Z- j5 T" `
20210428153958922.png

' Y/ S8 h* J2 E5 z, s7 \: w* w
20210428154026962.png

2 d$ u& c, c$ l  w/ H9 h! @) l& ~2 U, h2 F0 B
20210428154327448.png
3 z; w; z1 S* G3 T1 j2 u9 l

+ N  k0 k  P8 o8 Y& N$ `3 a3 l' [% E* S  x- Y1 x2 V/ V5 D
二.编写相关代码
& u! c/ f" [# W1.先写一个串口发送函数,将采样值通过串口发送出去。2 m/ d) e7 R5 B0 y
这里并没有使用DMA模式,也没有添加串口重定向函数,直接使用sprintf()函数将采样值储存在uint8_t str_buff[64]中,然后用HAL_UART_Transmit()发送出去(HAL库自带的)。
# Q5 L& g% C* H  O* p$ A; z; R% a
5 U+ I) o, Q  z! ^+ Z
  1. void UR2_Send_Info(): m4 o2 B! Z) l& O& |
  2. {5 V* R' a3 F/ b9 `! `; w
  3.         sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt%100,(ADC_Volt%100)/10,ADC_Volt%10);% I8 B# ^; @5 z* ?* x6 ]: B
  4.         HAL_UART_Transmit(&huart2,str_buff,sizeof(str_buff),10000);3 }2 C# w6 _$ c: R
  5. }
复制代码

9 j0 Y' F7 t2 A+ v+ n2 b5 Y2.再写上AD转换函数# G' M4 c" Q/ c: |2 P- ^1 C
  1. void ADC_Get_Value()
    , m2 K3 E. M# C4 F8 P* w( p& Z# F
  2. {
    6 O* Y) b1 Z# c* o4 u
  3.         HAL_ADC_Start(&hadc1);//开启ADC13 ^, h8 w! f- E6 K5 e
  4.         LED_ON();//开灯
    ( I2 r0 p2 B0 E) u6 v: ]
  5.         if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)//如果ADC收到数据
    : N$ H; D' V3 l$ y
  6.         {* b0 A' X4 h9 `+ P8 [6 g0 g) f
  7.                 //则将数据获取到并赋给ADC_Value
    7 P1 ]& E! Z2 f% i
  8.                 ADC_Value = HAL_ADC_GetValue(&hadc1);
    0 r! _0 t- ]/ _+ O% B
  9.                 //将获取到的值转换为电压值, p) }* _5 X. x4 o9 a+ t3 W1 E
  10.                 ADC_Volt = ADC_Value * 330 / 4096;
    - h2 n3 S2 b3 k8 F/ k" ?0 m9 C' A" ~
  11.         }
    : [: k) H! p. h1 z0 U' ]3 I, o( @
  12.         UR2_Send_Info();//通过串口发送出去- y$ z2 X! d; [& M+ u" L# a
  13.         LED_OFF();//关闭LED- O& M8 D( X# r3 a
  14.         HAL_ADC_Stop(&hadc1);//停止ADC检测0 f! H- u1 V4 D1 P( M. O1 e
  15. }
复制代码
/ J; ^9 w+ {7 v# c
3.在主函数中编写代码
# F- K3 |0 e' {& k$ O只要在大循环中加入下列代码就好- O2 p5 t% O/ a' K% K
  1. while (1)
      n4 O6 m) @( l( s  k7 \* ^
  2.   {
    $ s5 P: {( f3 J
  3.                 ADC_Get_Value();
    . M! ?9 L. S8 R- H% @! q, U
  4.                 HAL_Delay(2000);( {8 @5 ~& _" |* o+ q% n
  5.   }
复制代码
三.效果4 V9 J4 ~. o$ ^1 M! ^. K
每测量一次电压值,LED灯就闪烁一次,并且将测量值和转换后的电压值通过串口发送出去。在使用测水位的传感器,测锂电池的电压等场景中使用。% g% v; e' a) V1 s7 F
2 ^" O. [0 s; C+ B- X! \9 X9 n
/ v: @" j1 H( d/ _- {+ u  p
收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版