什么是ADC& i" D* W, e3 b' c' C
ADC,即Analog-to-Digital Converter,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。可以将真实世界的模拟信号,例如温度、压力、声音或者图像等,转换成更容易储存、处理和发射的数字形式。# O1 Y- c$ b7 ^1 k
. `) e& I' P9 v: T" P3 u
一.利用stm32cubeMX勾选ADC1的IN1
( F$ M, F: x: Z# H6 x: W6 I( \我这用的是stm32g070rb,只有ADC1。然后打开串口,通过串口来看采样数据。
5 j' x ]7 P# y6 \, h
: u/ M/ N8 o2 Z8 o: g1 u1 ]5 t
% ?1 h! g2 U, k" o( ]$ f1 a) J r @2 p J1 }' A
+ O: _/ z; ?( @! d [2 z, ]
2 W# b3 v1 r) c& l1 @7 \5 `% R. I7 Y) a% e
( Q; X9 h. d, s k$ U) }0 ~
二.编写相关代码
% r7 v$ {. O! n9 V1 z, p2 i1.先写一个串口发送函数,将采样值通过串口发送出去。 S8 r/ N' p( H0 ?: G. l0 a) x
这里并没有使用DMA模式,也没有添加串口重定向函数,直接使用sprintf()函数将采样值储存在uint8_t str_buff[64]中,然后用HAL_UART_Transmit()发送出去(HAL库自带的)。
3 K/ b0 J4 m1 k
& i7 ]- p3 H; @, k! b9 c- void UR2_Send_Info()
4 E) O9 T7 r! R* a - {
! L, K5 \, j. L( `) i# O( L/ F - sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt%100,(ADC_Volt%100)/10,ADC_Volt%10);7 y6 T0 ?: z& G0 c; Y6 X
- HAL_UART_Transmit(&huart2,str_buff,sizeof(str_buff),10000);7 h t9 z+ n$ }! C6 ]
- }
复制代码
9 E! V3 o' l/ [7 j0 f2.再写上AD转换函数
7 z; P+ q$ b- R; Q+ M9 }7 F0 e- void ADC_Get_Value()
1 R7 \9 Q) Z3 w4 X( i& l - {& h- ]) q/ b4 m5 x7 |
- HAL_ADC_Start(&hadc1);//开启ADC1
; H* ^. R/ Q5 F) I( W - LED_ON();//开灯
, a! z9 {6 O4 }% p2 ` - if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)//如果ADC收到数据# a! r W( g" x9 F5 g" S7 ^
- {4 A+ f! ^% \3 x0 o1 a
- //则将数据获取到并赋给ADC_Value. q9 _- J1 G# g3 T& {8 Y
- ADC_Value = HAL_ADC_GetValue(&hadc1);; F4 S' J, Q, k+ m1 n
- //将获取到的值转换为电压值
2 O# X& u5 W z$ O' k - ADC_Volt = ADC_Value * 330 / 4096;
' D. k4 g8 M# d5 K* B; T( {$ { - }
" n9 v; [4 {9 v - UR2_Send_Info();//通过串口发送出去& r( w- ]5 T+ ~9 `
- LED_OFF();//关闭LED! C8 t: S" ^( `, O! B4 U
- HAL_ADC_Stop(&hadc1);//停止ADC检测/ \3 `% \# }! q Z
- }
复制代码 - Z8 q- D7 M8 X2 y
3.在主函数中编写代码6 _9 s6 J5 A2 O9 b9 Z3 |
只要在大循环中加入下列代码就好
2 t0 Y: f7 ^ z- while (1)8 `6 j( `, o% b. A2 A3 Y6 G3 A
- {
8 g, L/ R" U7 |/ ]- \8 z - ADC_Get_Value();
1 m1 L+ c, _" a! Y* m5 L& d3 Z - HAL_Delay(2000);
* X4 b7 A+ r0 L! q4 m: q! x( I - }
复制代码 三.效果- _1 A% X5 L" d; j! w. s4 z
每测量一次电压值,LED灯就闪烁一次,并且将测量值和转换后的电压值通过串口发送出去。在使用测水位的传感器,测锂电池的电压等场景中使用。
- o7 x( a% Z+ H
/ O. e# O0 |' \$ N9 V/ H
) ?5 N. P; C- i3 ` |