概述' e" ?& {+ o1 X8 f0 n/ p" m
本章通过使用模数转换器(ADC),通过轮询方式采集多个ADC通道电压。3 Z6 J% p3 q& f
# S3 [* @9 x- ?5 ]; K* e% o* v硬件准备0 W) {, d; b; ^1 }9 x9 E( a
首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:2 p2 ]. m8 h3 z
" k2 e) q7 @. K( i( h
) E2 ?2 I. O3 L9 C8 U
( L- H- t+ G4 {选择芯片型号
1 {* c- ^' h6 @% I: X使用STM32CUBEMX选择芯片stm32f030r8,如下所示:5 x3 [. D5 {; A$ n5 k
" W0 \" t! G2 U0 r
0 H) h0 l: g1 w( Q
6 a5 {$ Q$ W; N. q: v3 m
配置时钟源& q: _+ e& U* V+ X5 E a7 f
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:
0 `, z$ E& U- K" v, N7 D+ p; A3 i
1 G4 J; q0 S ?$ c4 T7 q. R; n! Y; j; A; C
配置时钟树, H8 M2 Q; I6 S A: x2 d
STM32F0的最高主频到48M,所以配置48即可:
: H v9 ?( Y h- \ b$ j8 T1 ^; N8 c% u t1 b9 p$ z5 c( {
7 V7 T' ^( s8 l
/ ~* f; A8 V A4 S# L% J9 g- u串口配置9 W- w+ v9 g) g2 M3 g
本次实验使用的串口1进行串口通信,波特率配置为115200。+ O r( Q$ \9 E: b& m6 G! ]
& I& n0 V' p& Y. _# c+ N
( {& n! r) P/ X1 P( v* G- \( c4 u3 c2 R" T+ M
ADC配置
I- W9 z. _7 n F; |STM32f030中,有一个ADC(模拟/数字转换器),每个 ADC 有 12 位、 10 位、 8 位和 6 位可选,每个ADC有16个外部通道、2个内部通道和一个VBAT 通道的信号。" b* }! d5 A1 o
本文将开ADC的IN0、IN1、IN15一共三个通道,来分别读取ADC,由于串口2和IN2,IN3复用,故不使用IN2、IN3。配置如下:! R. |, V9 O/ z( Z+ H
8 e6 K! N) n9 M5 ]3 ?
6 C" g2 K0 G* j6 }5 a
. e) Y, J# u2 ?生成工程设置( i% D6 Z0 a: N/ u6 w i
注意在生产工程设置中不能出现中文,不然会报错。2 J: g$ L% ~- G3 A/ N, [( x9 w& g
9 t! H- P" J8 K
7 X& l/ O4 n/ u
5 h6 @0 X c F. b" J生成代码
- J2 g" c% P$ \0 ^1 A2 y$ Q( n% g0 H$ B: k# m7 H! F# W: u( H
# ~3 ^' m; L) M D* |& ^# h
( r! k9 @8 e$ H) k. v! `
配置keil5 n9 }0 C7 c1 O) {8 Q
9 @- {4 G! b0 _ P
; U3 J" n1 r# J5 G6 Y
) e& D% j! _! s6 x. M代码5 a+ z; Z. r+ M, U
在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。
, ]& g6 x# ?: m6 R% f. _2 o" e( O9 J+ V5 M, j6 Y
- /* USER CODE BEGIN Includes */& I' W1 f8 A' q4 @9 h3 [+ r# H6 E
- #include "stdio.h" [/ ^) t: p h A+ m$ T
- /* USER CODE END Includes */
复制代码 % \! E) ^7 \- Z' m# H, S9 e
函数声明和串口重定向:
, t- V4 u, x1 f3 v! Y& C2 N c6 g0 V( J# G: o+ M1 g I; Q
- /* USER CODE BEGIN PTD */
- a) w' Q( d$ ~( ~! h) ~6 @ - #ifdef __GNUC__- a+ y0 _7 |3 r# U" }
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)/ s" y( n8 a- K
- #else8 A( T- E* y/ z* z! w4 o
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
$ T" M# X: N2 Z: L - #endif /* __GNUC__ */
% A5 L2 s2 t) \5 h3 f - 6 Z- a( Q% U9 J ~6 {' D8 q
& ]+ f9 t# K$ L. q& A i- PUTCHAR_PROTOTYPE
7 x- b6 |) S q5 J( j7 J) ` - {
9 B1 r2 r% \& l - HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);# H% W$ s1 ~) j5 h0 K9 ?* ?& {
- return ch;
+ W4 I$ h9 S3 R, u4 s# O. S - }- F; B+ n P; z) J9 H8 Q
- /* USER CODE END PTD */
复制代码 4 x e9 V& r, I K
变量定义:
9 L8 J' O- t7 \! r
$ |2 c" P3 Y. X- /* USER CODE BEGIN 0 */8 r3 j3 b/ a9 \) w- V/ I
- uint8_t i;$ x* J" U }* {0 m4 _6 J* z8 X; o
- uint16_t adcBuf[3];//存放ADC
4 ~, i2 D) E6 \6 Z6 f4 O. q - /* USER CODE END 0 */2 W' M. \# {+ f" O! {$ {) `
复制代码 + E d& R) T9 Q
主循环:
. e7 M a3 P0 g E7 a9 e4 u+ O- U+ V
+ ~: ~, i9 j; F( ^/ C1 ~/ x0 k0 ^- /* USER CODE BEGIN WHILE */
6 A$ G4 d7 z% ~) ^ - while (1)! O" C9 v3 k2 d! ?
- {1 i- s: r" J8 ]
- /* USER CODE END WHILE */" t; r* u$ n& O# A9 R% q
- ' E- v0 |. U( O Z
- /* USER CODE BEGIN 3 */) Y8 R7 H% F+ Q% W1 D' a
- i=0;
5 U4 y2 L$ v& {8 W1 ~ - while(i<3)
$ J H/ ^- {8 D q0 B - {3 c# \9 m& q6 M% T; v& i9 J
- HAL_ADC_Start(&hadc);//启动ADC
' W) C- |+ o" _5 P" ~ - HAL_ADC_PollForConversion(&hadc,0xffff);//表示等待转换完成,第二个参数表示超时时间,单位ms.
4 g" a% x$ m, N( ]# y _ - //HAL_ADC_GetState(&hadc1)为换取ADC状态,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用。5 V. u. E# ]# Q/ Z, }
- if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc),HAL_ADC_STATE_REG_EOC))//就是判断转换完成标志位是否设置,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用
; X7 C9 ^& }. ^) q9 l - {6 @) A0 [5 P+ J% ^
- //读取ADC转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,数据右对齐,则转换的数据范围为0~2^12-1,即0~4095.
: `5 O2 t! H" h6 n: H7 ] - adcBuf<i>=HAL_ADC_GetValue(&hadc);
4 _% @+ w9 A' ?9 S W4 Y - printf("\nadc%d=%4.0d,电压=%1.4f",i,adcBuf<i>,adcBuf<i>*3.3f/4096); v1 Z8 M/ |% Y* o+ e8 J. n: K
- i++;
( L J6 \6 i8 e4 _ - }3 K% q1 \5 |6 b9 f
- }% W6 R' k/ O! h0 f9 k
- ' w4 Y, U s% j. y8 y. }; [
- HAL_ADC_Stop(&hadc);7 t( B( y6 v& T5 i5 `
- HAL_Delay(500); 3 x; u# p( G0 L l. F1 R
- }2 {6 r! _) V1 o# u4 n+ h
- /* USER CODE END 3 */
9 x1 Z$ S& U" g: F9 k s' V - </i></i></i>
复制代码 " P) z& O4 I! x% B* A4 s
演示效果
! C2 G* L# v0 Q7 @2 a" v+ M. \设定adc0口接3.3V,adc1口接GND,adc15口接1.5V,输出如下。
) I/ Q0 x2 q* @' n3 s
; O @/ n0 z) X( e5 b
/ @( i$ k& T. ]1 M( r$ S! Z& N4 s
: z* T' r9 ?" N H. F! l7 j0 _ |