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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
什么是ADC) {6 A% b" m5 \# i, g5 x2 o
ADC,即Analog-to-Digital Converter,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。可以将真实世界的模拟信号,例如温度、压力、声音或者图像等,转换成更容易储存、处理和发射的数字形式。
* G! W. L1 G1 D8 W& Q$ a% N
7 R4 J' z- M1 r8 U9 F# p+ Z/ j0 [  N一.利用stm32cubeMX勾选ADC1的IN1
0 `3 j  `( {) g' }我这用的是stm32g070rb,只有ADC1。然后打开串口,通过串口来看采样数据。! ~7 Z8 ]7 ^% |6 d5 k

  _0 `1 N2 }5 M- T7 P
20210428153958922.png
, W" f7 {9 e4 v# \7 V; g
20210428154026962.png
: o2 N$ w0 S8 A) o( p4 ~1 h

$ D" W" z/ }; ^, W: N' a
20210428154327448.png
6 x. l6 u: D! g: V' u& ?

* P: c5 q- K* R
. G! \) \. V$ S' I: m; {二.编写相关代码+ d, {) ?* A6 b2 ^, Y& I
1.先写一个串口发送函数,将采样值通过串口发送出去。7 [1 }6 \8 g* S$ n* r4 O% [
这里并没有使用DMA模式,也没有添加串口重定向函数,直接使用sprintf()函数将采样值储存在uint8_t str_buff[64]中,然后用HAL_UART_Transmit()发送出去(HAL库自带的)。
7 ?1 R# M2 ^; c& p! {8 ^7 R. h* h# ?; a1 {3 U7 ?6 p4 O9 L
  1. void UR2_Send_Info()
    ; L% C  v9 |) \0 T" ~; V
  2. {2 N& Y0 P" x% ~+ R/ J" X
  3.         sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt%100,(ADC_Volt%100)/10,ADC_Volt%10);- Y+ z1 n2 x( ]+ X
  4.         HAL_UART_Transmit(&huart2,str_buff,sizeof(str_buff),10000);* _* h- d- E# k& c; O
  5. }
复制代码

: w8 u) O6 H5 r5 s2.再写上AD转换函数- M2 Y6 X! a1 z8 k0 q
  1. void ADC_Get_Value()2 Q, _4 _# p% u, f
  2. {, y+ K' B; L+ h) D; K8 j
  3.         HAL_ADC_Start(&hadc1);//开启ADC1
    8 t8 I  l5 d- Q- f4 i/ _- A
  4.         LED_ON();//开灯, r. g7 t0 t9 [' _
  5.         if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)//如果ADC收到数据7 x- J/ u3 R4 P/ D7 L
  6.         {
      e1 C/ M1 J0 o0 G  Y. V* Q
  7.                 //则将数据获取到并赋给ADC_Value; j8 u( k+ d. q& S
  8.                 ADC_Value = HAL_ADC_GetValue(&hadc1);
    7 S7 K& ^) R5 g5 Y/ L0 g" ~
  9.                 //将获取到的值转换为电压值1 f1 c& A4 i& a* z* ]4 ?. k8 e) c
  10.                 ADC_Volt = ADC_Value * 330 / 4096;7 B7 L0 Q  y; _0 b7 @4 }$ ]
  11.         }
    # ^0 y% U0 W7 Q! g5 t1 x! X
  12.         UR2_Send_Info();//通过串口发送出去
    " S# h: _( [+ Y, u7 {
  13.         LED_OFF();//关闭LED
    ! v( l4 C; N7 {% r, a. F
  14.         HAL_ADC_Stop(&hadc1);//停止ADC检测* \- R8 @# P' x$ f/ X) r
  15. }
复制代码

6 }( {/ h9 K, J# k. {4 D3.在主函数中编写代码
$ g& q- V6 t1 C" \* U" g& q/ A只要在大循环中加入下列代码就好+ u, U$ K7 ?6 j6 W  q5 k" {
  1. while (1)& U# [  X9 Z6 i3 G) H9 T7 v
  2.   {
    3 S$ K$ }$ P+ b. i0 J
  3.                 ADC_Get_Value();
    ' L) y4 k4 G4 ~
  4.                 HAL_Delay(2000);& x3 B* \& k4 u" r
  5.   }
复制代码
三.效果# |9 c8 R, V' x, ~9 P5 [
每测量一次电压值,LED灯就闪烁一次,并且将测量值和转换后的电压值通过串口发送出去。在使用测水位的传感器,测锂电池的电压等场景中使用。3 a& Q! `- c- x

$ X+ N/ P' p$ e* x' C( [* P/ i5 {0 L! g
赞 收藏 评论0 发布时间:2021-11-13 00:01

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版