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

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

[复制链接]
STMCU小助手 发布时间:2021-11-13 00:01
什么是ADC
# m+ R+ F: T3 r2 w" Z8 ]7 T0 q) c$ GADC,即Analog-to-Digital Converter,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。可以将真实世界的模拟信号,例如温度、压力、声音或者图像等,转换成更容易储存、处理和发射的数字形式。! {2 q6 V  z8 {

7 i/ ~' }9 E) ^- ~7 r' T% q一.利用stm32cubeMX勾选ADC1的IN1
7 l' F& g. e3 H* J& d" r我这用的是stm32g070rb,只有ADC1。然后打开串口,通过串口来看采样数据。
% |# v% ]' a' e+ k
+ w5 o7 w. f- J" t! M3 [7 @
20210428153958922.png

  h' e0 e: v/ f, D* E
20210428154026962.png
8 X5 J/ u, j& M

, _/ P5 S* g3 B) Q
20210428154327448.png

" P1 J5 V, H5 |7 G5 Q
9 }; _4 A- |* ]  h
( Q. x, ?! [7 u  h2 B; s二.编写相关代码
1 }$ d. L- B! `$ |  ^1.先写一个串口发送函数,将采样值通过串口发送出去。
) n% D1 V1 H/ I/ X这里并没有使用DMA模式,也没有添加串口重定向函数,直接使用sprintf()函数将采样值储存在uint8_t str_buff[64]中,然后用HAL_UART_Transmit()发送出去(HAL库自带的)。: N2 N, P7 `/ r6 p( e. u

) ?: Y7 u9 U; R# @
  1. void UR2_Send_Info()' [) z3 V7 A: b4 l9 X/ c# G9 F: O
  2. {
    7 O" i$ R- K' V: ?; n
  3.         sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt%100,(ADC_Volt%100)/10,ADC_Volt%10);+ W& ~! n+ {: A' e  s! M% W
  4.         HAL_UART_Transmit(&huart2,str_buff,sizeof(str_buff),10000);& E3 N) W2 V) g7 [! O
  5. }
复制代码
: s0 H% n4 |9 q- x1 \
2.再写上AD转换函数8 `. Q! J9 @& a2 w$ z1 v( f, O
  1. void ADC_Get_Value()0 C* @' h3 l, `+ m5 k
  2. {
    - p7 _4 a# `  }9 C7 {0 B
  3.         HAL_ADC_Start(&hadc1);//开启ADC1: s9 {" C- k8 `& A8 e& W8 o
  4.         LED_ON();//开灯
    / e; m4 B/ k8 j/ i# |/ @' w
  5.         if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)//如果ADC收到数据
    ( J4 S9 E2 ^9 N0 k# a3 |
  6.         {
    1 `  ?8 L8 l* Z" p: H
  7.                 //则将数据获取到并赋给ADC_Value
    3 d5 K4 [" B. |$ E8 k$ q
  8.                 ADC_Value = HAL_ADC_GetValue(&hadc1);( x" r9 N7 q4 i; i- w6 K7 N" c7 t
  9.                 //将获取到的值转换为电压值
    1 ^6 Z& I! m6 E- G8 @$ E5 ?
  10.                 ADC_Volt = ADC_Value * 330 / 4096;5 U! T5 {% [1 n' {: `) A
  11.         }3 y6 k# ^2 Y$ {2 b9 ]9 ^8 A$ z! x
  12.         UR2_Send_Info();//通过串口发送出去
    " [" _1 v9 L. }, Q0 |6 z
  13.         LED_OFF();//关闭LED% ]" q% Q2 s+ i
  14.         HAL_ADC_Stop(&hadc1);//停止ADC检测% z. f3 h' r, P' f  R$ r
  15. }
复制代码

6 \* j8 {" {7 t3.在主函数中编写代码
1 L5 }& y& ^( y0 X' o只要在大循环中加入下列代码就好
0 m$ _  O- r8 o, [
  1. while (1); t6 R2 C* m* d3 m( s' ?
  2.   {' \% o) d& r- D: X% h* a
  3.                 ADC_Get_Value();2 I: V0 }9 n3 J4 w8 c. V! a4 ~
  4.                 HAL_Delay(2000);
    3 J9 H" E/ \/ u3 L  G4 u
  5.   }
复制代码
三.效果
  K9 i" F% g" @每测量一次电压值,LED灯就闪烁一次,并且将测量值和转换后的电压值通过串口发送出去。在使用测水位的传感器,测锂电池的电压等场景中使用。
* {! g* N4 `7 t2 G: y5 @
) q8 K) Z% D& g  ^
1 O; G; Q$ d9 N5 i9 H
赞 收藏 评论0 发布时间:2021-11-13 00:01

举报

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