什么是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, W" f7 {9 e4 v# \7 V; g
: o2 N$ w0 S8 A) o( p4 ~1 h
$ D" W" z/ }; ^, W: N' a6 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
- void UR2_Send_Info()
; L% C v9 |) \0 T" ~; V - {2 N& Y0 P" x% ~+ R/ J" X
- 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
- HAL_UART_Transmit(&huart2,str_buff,sizeof(str_buff),10000);* _* h- d- E# k& c; O
- }
复制代码
: w8 u) O6 H5 r5 s2.再写上AD转换函数- M2 Y6 X! a1 z8 k0 q
- void ADC_Get_Value()2 Q, _4 _# p% u, f
- {, y+ K' B; L+ h) D; K8 j
- HAL_ADC_Start(&hadc1);//开启ADC1
8 t8 I l5 d- Q- f4 i/ _- A - LED_ON();//开灯, r. g7 t0 t9 [' _
- if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)//如果ADC收到数据7 x- J/ u3 R4 P/ D7 L
- {
e1 C/ M1 J0 o0 G Y. V* Q - //则将数据获取到并赋给ADC_Value; j8 u( k+ d. q& S
- ADC_Value = HAL_ADC_GetValue(&hadc1);
7 S7 K& ^) R5 g5 Y/ L0 g" ~ - //将获取到的值转换为电压值1 f1 c& A4 i& a* z* ]4 ?. k8 e) c
- ADC_Volt = ADC_Value * 330 / 4096;7 B7 L0 Q y; _0 b7 @4 }$ ]
- }
# ^0 y% U0 W7 Q! g5 t1 x! X - UR2_Send_Info();//通过串口发送出去
" S# h: _( [+ Y, u7 { - LED_OFF();//关闭LED
! v( l4 C; N7 {% r, a. F - HAL_ADC_Stop(&hadc1);//停止ADC检测* \- R8 @# P' x$ f/ X) r
- }
复制代码
6 }( {/ h9 K, J# k. {4 D3.在主函数中编写代码
$ g& q- V6 t1 C" \* U" g& q/ A只要在大循环中加入下列代码就好+ u, U$ K7 ?6 j6 W q5 k" {
- while (1)& U# [ X9 Z6 i3 G) H9 T7 v
- {
3 S$ K$ }$ P+ b. i0 J - ADC_Get_Value();
' L) y4 k4 G4 ~ - HAL_Delay(2000);& x3 B* \& k4 u" r
- }
复制代码 三.效果# |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
|