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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
什么是ADC
9 M2 J. I9 l# T6 X2 oADC,即Analog-to-Digital Converter,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。可以将真实世界的模拟信号,例如温度、压力、声音或者图像等,转换成更容易储存、处理和发射的数字形式。
7 X' C1 Y" F' P3 i" h& _4 z
1 l) I5 |% I; @+ Q. a6 _一.利用stm32cubeMX勾选ADC1的IN1' @4 I' Z0 ]. C! g
我这用的是stm32g070rb,只有ADC1。然后打开串口,通过串口来看采样数据。8 `5 V' a6 d$ w. q8 l) U" M

# Q7 p- ~& N# h0 O9 m, s0 P% L
20210428153958922.png

* `" w9 z7 t. b0 p; @' S
20210428154026962.png

6 ^- _6 p7 S' [% S; Z
4 i& m8 J! t/ t$ j+ b8 q- N8 E* R& {
20210428154327448.png
  ~% X8 _' R* Z7 U

* a8 b3 C2 g: n* r3 _! @8 j0 h2 R$ Y+ h7 n, `/ e9 [
二.编写相关代码
' }! X& h- l- a& R' m1.先写一个串口发送函数,将采样值通过串口发送出去。
5 M6 H( o# A+ k  h这里并没有使用DMA模式,也没有添加串口重定向函数,直接使用sprintf()函数将采样值储存在uint8_t str_buff[64]中,然后用HAL_UART_Transmit()发送出去(HAL库自带的)。& c. v1 w' G) q. B5 f/ p

8 O- B9 r4 T* M% ?: k2 G" @/ A8 L
  1. void UR2_Send_Info()
      \6 L- B3 n; ]; X- k9 d# p2 [, F# o9 }
  2. {- W& x/ r7 P' l3 ^9 O
  3.         sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt%100,(ADC_Volt%100)/10,ADC_Volt%10);. R! q4 z4 R, V2 }( _
  4.         HAL_UART_Transmit(&huart2,str_buff,sizeof(str_buff),10000);/ G4 q' Q4 p# ?, K
  5. }
复制代码

& Z; |! I8 j$ u+ ]2 C% P/ Z. a2.再写上AD转换函数
4 {5 t, z' U* ?$ L5 W1 K, h" t
  1. void ADC_Get_Value()1 r& z  f) [  Y+ A. Z8 L
  2. {) J  s8 d1 p6 D+ s; M: O" [' u. C4 ~
  3.         HAL_ADC_Start(&hadc1);//开启ADC1
    $ r1 l+ Q! `6 I4 j3 U7 [. t
  4.         LED_ON();//开灯2 ?. ]- C1 w4 J+ k
  5.         if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)//如果ADC收到数据* G; A* r( i5 T$ Z2 Q7 k
  6.         {' D/ ~% e9 I9 I$ \9 m; n
  7.                 //则将数据获取到并赋给ADC_Value' A2 m5 b6 O, j
  8.                 ADC_Value = HAL_ADC_GetValue(&hadc1);
    + M" @# f. N4 m7 f7 k# u) a
  9.                 //将获取到的值转换为电压值
    & r/ c; v6 @  s& h+ V/ S1 [
  10.                 ADC_Volt = ADC_Value * 330 / 4096;
    , i: i3 @0 v( I7 s- l( k+ R1 d
  11.         }
    2 W* C' j, y5 G1 R) B4 Z
  12.         UR2_Send_Info();//通过串口发送出去
    ! \1 K) f9 @9 c: O
  13.         LED_OFF();//关闭LED
    : V& g% J# G; W7 d; v
  14.         HAL_ADC_Stop(&hadc1);//停止ADC检测
    $ r5 q/ l/ N) b
  15. }
复制代码
/ ^7 T" d. d# d8 q( q: ]/ @: j
3.在主函数中编写代码0 f0 t7 q" J; o
只要在大循环中加入下列代码就好
4 Y( A0 \5 N9 {6 U1 m, ?5 J
  1. while (1)* }, C( x! a2 h6 R! o- |" |
  2.   {
    ( G5 L0 e1 h% q1 L9 T. j% G
  3.                 ADC_Get_Value();$ {9 `; l6 f4 J7 j: x0 x' m
  4.                 HAL_Delay(2000);+ c/ @+ b! N6 o8 t4 r( {8 m
  5.   }
复制代码
三.效果& {5 Y  e' B: W
每测量一次电压值,LED灯就闪烁一次,并且将测量值和转换后的电压值通过串口发送出去。在使用测水位的传感器,测锂电池的电压等场景中使用。& T; Z: Z% K3 r3 F2 s

: ?+ n. ^0 Q! @+ \) }* l# K/ K& ?$ N9 N% K: q1 O! Q
收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版