什么是ADC
% Z9 O2 j/ x5 Z, d) [. bADC,即Analog-to-Digital Converter,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。可以将真实世界的模拟信号,例如温度、压力、声音或者图像等,转换成更容易储存、处理和发射的数字形式。! }+ j$ u( X. k; X+ d0 T* {" u$ I
% g& q5 Z0 v' W一.利用stm32cubeMX勾选ADC1的IN1
8 K5 w: p! I7 P1 A我这用的是stm32g070rb,只有ADC1。然后打开串口,通过串口来看采样数据。 W. u4 f( F: M7 M' P$ O
3 z8 m- _6 M* M9 R. y9 v/ b2 G/ `! x
! }- l8 w( G3 A
# {1 i; n: d' n* M' [) a' e/ a* ~* l2 C' k( K- u" G
. h" `5 r% G( h" L$ {) [# B* ^
; P% K. y+ a& l4 ~. V二.编写相关代码
8 K5 Y4 k4 y" S3 i- D( C1.先写一个串口发送函数,将采样值通过串口发送出去。9 @! ?7 p+ s& W3 L9 [: q. D; y
这里并没有使用DMA模式,也没有添加串口重定向函数,直接使用sprintf()函数将采样值储存在uint8_t str_buff[64]中,然后用HAL_UART_Transmit()发送出去(HAL库自带的)。
" E* R; z& ~0 W& [) N
; i0 [8 q8 X- M$ N" _4 I- void UR2_Send_Info()/ d& ~& {1 S6 i- B, b% C, \+ \
- {
5 t; j1 V4 Q; U5 l0 {0 Z3 {2 g1 u - sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt%100,(ADC_Volt%100)/10,ADC_Volt%10);
# z0 B1 q0 w, N5 }% b. f6 @ - HAL_UART_Transmit(&huart2,str_buff,sizeof(str_buff),10000);, U9 O$ a7 O9 n1 v* @1 @1 A* Q
- }
复制代码
1 ?5 o% Q+ P$ t& q5 z2.再写上AD转换函数
9 v1 c9 ?; }/ Y- void ADC_Get_Value()" _7 y& X& C7 n/ ] H) A* r
- {
$ e* d/ R3 d9 m5 o3 v6 x - HAL_ADC_Start(&hadc1);//开启ADC16 m: M% f4 S, V. i5 J- T
- LED_ON();//开灯
& N; O+ b: I' K% T! E+ ~ - if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)//如果ADC收到数据4 k5 g. n7 Q! t9 f, l7 z% Y# p4 ]
- {2 a6 x6 E: o$ _- p" t
- //则将数据获取到并赋给ADC_Value
0 g+ \' k9 R) k: f) x3 }0 d0 P - ADC_Value = HAL_ADC_GetValue(&hadc1);+ x+ y5 r4 {8 T8 o
- //将获取到的值转换为电压值
0 S) }2 a. p! N1 T/ L6 e! m% G - ADC_Volt = ADC_Value * 330 / 4096;% o+ n4 O# J" \$ e
- }
: g# x9 }8 i( B$ z& v - UR2_Send_Info();//通过串口发送出去
. C( H1 f6 l* q% v - LED_OFF();//关闭LED) O# n3 M; Q2 n
- HAL_ADC_Stop(&hadc1);//停止ADC检测
) S( ~: {/ o5 `, ?7 W - }
复制代码 ! m% O$ T) a; S E, H
3.在主函数中编写代码
, Z' V' d: J; m; z! Q9 d只要在大循环中加入下列代码就好: `- q% G) z T% L
- while (1)
0 F+ A3 z5 C6 B4 U s; n - {
2 b+ j: ~: I7 e - ADC_Get_Value();- b! y( p; I) g M" F
- HAL_Delay(2000);/ A6 W _& O7 U
- }
复制代码 三.效果5 ?" t5 d9 X7 \
每测量一次电压值,LED灯就闪烁一次,并且将测量值和转换后的电压值通过串口发送出去。在使用测水位的传感器,测锂电池的电压等场景中使用。( H) P7 r" q N# H& x! i
$ {. h5 A7 w+ ^. `' ]4 r: ~9 @
% Y# b3 |) Q) g: @ |