什么是ADC
$ ?( H+ h, S- n& D# J/ EADC,即Analog-to-Digital Converter,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。可以将真实世界的模拟信号,例如温度、压力、声音或者图像等,转换成更容易储存、处理和发射的数字形式。
. P* j5 ^; e3 w* |" E/ u
6 n# @6 ]# E- \7 k& f0 I, O: \一.利用stm32cubeMX勾选ADC1的IN13 j0 R7 V& ]8 `7 h; {( ^
我这用的是stm32g070rb,只有ADC1。然后打开串口,通过串口来看采样数据。" h- w5 i, L0 V' Y2 j6 D3 X
" e# w: H! ~( X; f# n/ c% [9 j
/ q0 {. B. f# {" s m. I0 |) c* C5 P3 a6 @4 d# h
7 G+ X g! ?8 K/ S
$ _0 u8 L6 J. {. W% d# T" o6 q1 |' R9 w K
! n- p1 P% K% r
二.编写相关代码; y& v7 U# M7 r4 \
1.先写一个串口发送函数,将采样值通过串口发送出去。# U( `+ ]' T. h+ A
这里并没有使用DMA模式,也没有添加串口重定向函数,直接使用sprintf()函数将采样值储存在uint8_t str_buff[64]中,然后用HAL_UART_Transmit()发送出去(HAL库自带的)。
) u( m6 _4 }( g$ H% u9 M a2 y, q* Q( e! X) ~! @% ?$ V
- void UR2_Send_Info()* l8 z: i8 S6 l9 m! `% y8 |
- {
7 H, Q- T9 D |7 U8 D* h - sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt%100,(ADC_Volt%100)/10,ADC_Volt%10);: T5 Y, D* g+ u
- HAL_UART_Transmit(&huart2,str_buff,sizeof(str_buff),10000);7 i7 d) h+ k! [" W1 b
- }
复制代码
/ D; `; O3 L; X$ d O+ x2.再写上AD转换函数; t( L }5 \3 a+ u; x% p! W
- void ADC_Get_Value(): r$ a4 |) y8 Y4 r1 R! u3 _
- {
: K/ Y, j: ?& `& ]3 F - HAL_ADC_Start(&hadc1);//开启ADC1
" d5 V6 M5 T9 e - LED_ON();//开灯
D8 @, b n, P1 h+ v& \/ l - if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)//如果ADC收到数据
, V D+ J* ?- U - {
. r9 F+ i, h" B5 H9 q6 x$ x. H7 M - //则将数据获取到并赋给ADC_Value
7 a# @: \ D9 ]7 }% o2 @ z2 Y% e - ADC_Value = HAL_ADC_GetValue(&hadc1);
/ w, T6 W/ s7 D, a/ J% U4 Q - //将获取到的值转换为电压值
) G# l$ G- M8 [, s - ADC_Volt = ADC_Value * 330 / 4096;- [7 S1 X3 E. x" Z; v0 J1 q8 c
- }
x, | A" [! Z7 m - UR2_Send_Info();//通过串口发送出去5 n( f9 _/ i B" E( |
- LED_OFF();//关闭LED8 d* X$ J. G+ u _
- HAL_ADC_Stop(&hadc1);//停止ADC检测
; u2 K% n: B; p" k8 N3 n3 r M; Z - }
复制代码
9 ~# D9 P+ A9 N X- |% C# @( w3.在主函数中编写代码7 p1 c+ A* d: Y, ?9 q0 G. N
只要在大循环中加入下列代码就好" ]0 d2 c* f" D4 E1 \( w
- while (1)
" I6 G) g$ J2 V& V - {
( T h/ V' [2 C: \ - ADC_Get_Value();
9 s; e6 g+ z6 d B3 J$ Z8 x - HAL_Delay(2000);2 e3 L5 x8 _0 i4 ^$ F# C0 L
- }
复制代码 三.效果
- M9 f! |) u! k7 ^" x& h. w, C; h2 y每测量一次电压值,LED灯就闪烁一次,并且将测量值和转换后的电压值通过串口发送出去。在使用测水位的传感器,测锂电池的电压等场景中使用。
i2 B; Y# e& c, N* j; ]: g+ q8 R% f8 l. Z/ b% q& C
) A; n5 r& `' v5 y |