概述
7 q. u5 X# D6 k' m( b, [本章通过使用模数转换器(ADC),通过轮询方式采集多个ADC通道电压。4 ], F( B7 y0 B9 Y& E
" c8 I' [. ~7 `: @+ S1 t硬件准备) l5 s+ R* A1 i* [
首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:
z9 k& }2 Q/ d) {
7 ?; J9 Y, J: k- `* W" l' t
* h9 S$ u; o- Z& u( {" |7 B
& I& X- L0 g0 s. n0 {
选择芯片型号7 p& ^3 P/ `: y) e7 q! n
使用STM32CUBEMX选择芯片stm32f030r8,如下所示:$ p- v2 P. E. w/ o+ N' i" Y/ Q
; a* X8 L4 C9 V) f- M
( z9 Y4 h. p4 E7 ~9 y% x* C3 d4 j* U
/ R9 i' u. V! i h) V配置时钟源
8 n- b6 ?- X, t; {/ C S) h MHSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:
7 H8 I- }; a# P j$ t6 N/ X5 l) @7 U- `, I. P
2 Y9 _6 c2 F5 Z# g% l7 X; |- B; k
配置时钟树6 N1 R5 j2 m* W9 H
STM32F0的最高主频到48M,所以配置48即可:
; Y. G8 \0 d+ J) m" A' u" I+ F S0 |! P- w
+ M6 S9 B; o( ]. I! J0 S
+ R7 J# B' b: L5 o: N3 [; |! a
串口配置
5 u) F: @3 M3 _. Z! s本次实验使用的串口1进行串口通信,波特率配置为115200。6 S( e, W8 z6 o
2 l9 E& k6 l$ u' U% Q. x
( p2 w" N4 |5 K
1 H+ i; ]1 w. h+ n% N; P3 WADC配置+ K/ I! {6 h3 ^# `$ F" T6 A) U
STM32f030中,有一个ADC(模拟/数字转换器),每个 ADC 有 12 位、 10 位、 8 位和 6 位可选,每个ADC有16个外部通道、2个内部通道和一个VBAT 通道的信号。
9 l4 K& |7 s8 Y4 v0 M: Y. Y4 [本文将开ADC的IN0、IN1、IN15一共三个通道,来分别读取ADC,由于串口2和IN2,IN3复用,故不使用IN2、IN3。配置如下:5 u& {: r! g% I3 z- }6 ^% p+ V
, h; `2 {; C& I& A9 E; ^! D7 L( @* Q: C
1 {% h4 P: N9 ]
1 s, n, h" f' O生成工程设置, ~2 |8 F; v$ P6 b' N) z: k5 Z4 u
注意在生产工程设置中不能出现中文,不然会报错。
, Q' G2 E: R+ a8 o+ F0 Z. t4 o; {% c& T( ]3 F( ~4 G4 V
& m# ~- l/ K( c- ]# S7 K
& V% N+ G8 @1 n: m" u0 g
生成代码
( B1 j" L5 ]& }, G- c# P/ ]4 [" K# V c2 T' C
- S8 ^+ [) n z5 M7 B0 z8 j0 u, q
3 P) d0 L( |& `. ?& W. G1 a配置keil
6 o* ]+ }' p8 s
Y" q0 {( ]% A, r" q1 ~
0 P1 ~* O1 ~% f- }6 j( F& g- w; p/ l5 I$ ], ^# B5 [4 Y) B! O
代码
8 s; B7 j( P5 x在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。
! b, c8 Q" ~) X& {4 E' e( G" Y# R) j* k( W' b
- /* USER CODE BEGIN Includes */
! E) r! ^' A( Q* j6 W, h9 y' d( G - #include "stdio.h"% @5 u. j* r! z4 f8 C7 | [
- /* USER CODE END Includes */
复制代码
; k/ A! H% _. y函数声明和串口重定向:3 ^9 O1 W% p1 R: H
& d+ `5 {: h; K6 C
- /* USER CODE BEGIN PTD */; e5 a, m/ B$ p
- #ifdef __GNUC__
& n) f( I. ^/ g% j- u - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
5 p, H1 y- T \$ W - #else w4 ]" i1 P! ]/ l$ t% a, R
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)0 x% @8 f$ O4 l& q7 i7 {! \
- #endif /* __GNUC__ */
0 ^* ^6 V/ S+ E$ r, z; U% W5 B( Y - $ u) r" S0 n$ t/ i [0 K) O# ?- B
+ C3 d! L- V" d, N1 L: P- PUTCHAR_PROTOTYPE
, ]" |$ x9 f1 y! i; p - {
' J& |9 w3 o6 r6 K/ Q+ c! d - HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF); s# q S( y3 v$ Q5 h; f/ e/ ]
- return ch;! x" d. D7 f; l$ ]* i) i& p
- }
+ Y2 e4 D0 [' K8 L, N+ q' j$ Y- W - /* USER CODE END PTD */
复制代码 $ U8 Z" H( g5 c d! u" o# I' W
变量定义:
2 w: _+ Z6 u% o8 r" h# `/ ^+ Q
- /* USER CODE BEGIN 0 */4 T. y ]/ U: [
- uint8_t i;0 N' R V& C9 v9 L5 P
- uint16_t adcBuf[3];//存放ADC
7 x# x l7 p/ d1 ?* a - /* USER CODE END 0 */: b* I8 }) C/ e, `
复制代码 ) A# q) s' Q: J+ G' \0 e3 m
主循环:1 B# p9 i/ L2 j& z$ T5 g$ t5 D
* l5 ~4 R" l% W G- /* USER CODE BEGIN WHILE */3 G; _' G2 o: q. a F: x
- while (1)
& b) C8 P0 Q4 W: D# {) Q. ? - { f% Z7 P' y/ S, S8 I
- /* USER CODE END WHILE */' h4 \( K+ f% D* ]! b* s
- + n- Y' N' S- j8 G
- /* USER CODE BEGIN 3 */
& W4 ]( |3 ~& S$ F: L6 H - i=0;
5 b2 q4 O2 X. j! `) g+ L- r - while(i<3)- X3 r) k; M' i! Z: h' E
- {6 a. D0 N! s& j8 |& }- [
- HAL_ADC_Start(&hadc);//启动ADC% v# h0 q0 U7 z, n, {8 H
- HAL_ADC_PollForConversion(&hadc,0xffff);//表示等待转换完成,第二个参数表示超时时间,单位ms.
& _, _* q& m5 l) R1 W - //HAL_ADC_GetState(&hadc1)为换取ADC状态,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用。8 z0 e9 d4 v# P# T9 i
- if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc),HAL_ADC_STATE_REG_EOC))//就是判断转换完成标志位是否设置,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用; Y: q2 c0 _& q3 t1 P" H: {
- {
' W& R; R9 _& x; N& `) r - //读取ADC转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,数据右对齐,则转换的数据范围为0~2^12-1,即0~4095.! R! c+ F, {. h7 {4 I
- adcBuf<i>=HAL_ADC_GetValue(&hadc);9 {0 M2 B4 L0 V/ I' d& d z
- printf("\nadc%d=%4.0d,电压=%1.4f",i,adcBuf<i>,adcBuf<i>*3.3f/4096);8 K5 \" K" O) [
- i++;! p; X$ e/ [5 l. i7 O
- }
: p& h9 M5 D# K/ f4 z p - }
6 Z1 l5 p! h5 [! s5 F
7 y' y* _) G' D$ ^- v- HAL_ADC_Stop(&hadc);
9 {5 m% X: Y I6 S7 u5 M( i - HAL_Delay(500); ! o0 |3 _* s, K |, u
- }1 v, o( ]- N/ R. ]6 D. A% a
- /* USER CODE END 3 */
1 p! N: `1 s9 X& D - </i></i></i>
复制代码 + _8 \/ m8 ?1 e* x. D) Y
演示效果
# x" E4 F5 v7 x: a设定adc0口接3.3V,adc1口接GND,adc15口接1.5V,输出如下。! D4 U' i& x: p7 n! C- ?
9 `7 r" F2 o" u2 u$ E
9 r8 K2 [5 Y9 Q) V. |& ?. Q3 h
2 p& p) M, X2 j: O2 |6 ?2 P |