什么是ADC' W: r7 {0 [4 f6 b/ ^! s7 d, o
ADC,即Analog-to-Digital Converter,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。可以将真实世界的模拟信号,例如温度、压力、声音或者图像等,转换成更容易储存、处理和发射的数字形式。
3 x- R! n4 ]5 o7 T$ V& u) ^/ |: W% ?" \/ Z* H( D9 Y7 l
一.利用stm32cubeMX勾选ADC1的IN1. [2 ]. H W* G' s, Q% N7 O
我这用的是stm32g070rb,只有ADC1。然后打开串口,通过串口来看采样数据。
4 R) Q1 c8 G2 G z) R
. k6 x: O3 K9 R; J, a% g6 X) J6 F- |5 e% Y# h
/ ^0 h3 f$ z5 f3 c- `6 [: t \( J9 D6 f6 |4 `5 D
' c' Z; u0 V8 k- Z) u
; w) v% ~2 f& @; y0 N2 B( `
6 M6 V d" C& A' y
二.编写相关代码. H3 L& _$ k+ t3 }2 w9 \
1.先写一个串口发送函数,将采样值通过串口发送出去。 `7 U: X8 d" G6 C5 |
这里并没有使用DMA模式,也没有添加串口重定向函数,直接使用sprintf()函数将采样值储存在uint8_t str_buff[64]中,然后用HAL_UART_Transmit()发送出去(HAL库自带的)。
i) T* B& W. r. c
, z" i6 X) L6 x9 p; o% y$ z' u- void UR2_Send_Info()% O4 O4 x% V9 I$ B
- {
. W/ A7 S8 V+ Q- t& t - sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt%100,(ADC_Volt%100)/10,ADC_Volt%10);
6 g6 }/ R' H, c9 n - HAL_UART_Transmit(&huart2,str_buff,sizeof(str_buff),10000);
, ~2 n3 I( U; i8 Z4 K' K. D3 s - }
复制代码 4 O* [6 E+ }2 Z$ M
2.再写上AD转换函数: h* n1 C) G; b6 Z! u0 E
- void ADC_Get_Value(), n" M8 W3 u# ^; F! r0 Z
- {% I: t4 C! {: n7 k, }
- HAL_ADC_Start(&hadc1);//开启ADC1
% T- \' J- w& R" H& g: O% S0 a - LED_ON();//开灯
, r" w. \: T: q - if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)//如果ADC收到数据
K2 B! N# J* w- K# e. I - {/ T2 q4 K% Q! @1 ?
- //则将数据获取到并赋给ADC_Value, s( D+ U( q: o( ^" F
- ADC_Value = HAL_ADC_GetValue(&hadc1);
( d& E5 t* {( r8 d+ H& d+ O - //将获取到的值转换为电压值
7 C+ O1 h4 _* K - ADC_Volt = ADC_Value * 330 / 4096;
3 V! Z; z4 k3 d, K9 e! U - }
2 R! ^/ L# z; }# q3 E - UR2_Send_Info();//通过串口发送出去. j4 g- I f8 M
- LED_OFF();//关闭LED" u, J* G$ m% A4 b& @6 [* B
- HAL_ADC_Stop(&hadc1);//停止ADC检测: G* `, j6 c7 a4 s) Y: K( y/ Z+ c# W
- }
复制代码 % p Q% _4 S6 X& ^
3.在主函数中编写代码
4 K. t+ H+ C$ r0 ` }: l& q- C/ c h只要在大循环中加入下列代码就好
0 g; h+ y% I5 W* W8 ]+ O& [3 A- while (1)
, U) b+ I! d% u/ S( Y - {& `* V& Q8 z1 j0 P% G/ }" Z- {
- ADC_Get_Value();. D% R* y1 W/ Y* \
- HAL_Delay(2000);
* q3 o( C# Y0 Y M - }
复制代码 三.效果& G9 o# h2 q+ F! D4 z" a
每测量一次电压值,LED灯就闪烁一次,并且将测量值和转换后的电压值通过串口发送出去。在使用测水位的传感器,测锂电池的电压等场景中使用。 l- \- A/ G! W/ {5 t
+ b& I( L9 {! R. j1 t
; e0 ? p3 ~" ^0 B
|