一、ADC的原理及定义# k' Z0 j0 O/ N
Analog-to-Digital Converter的缩写。中文译名:模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。其实就是一个取样、量化、编码的一个过程。
~1 h) i% f4 e. }' ^
# Q( o3 c8 R' F. S' E6 b典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。比如电量、光照传感器等常用。
+ o: P; c9 e. j/ n+ o F( _1 `6 x- k" P( V$ v/ @, j* v
二、模拟信号
2 X( B& q+ b* o8 @: D; Y$ B" _模拟信号是指用连续变化的物理量表示的信息,其信号的幅度,或频率,或相位随时间作连续变化,如目前广播的声音信号,或图像信号等。0 J$ W: Z8 W: R+ h8 D- b
; c t6 |9 S1 d3 Q# r3 F$ x三、数字信号, `5 q$ I" D8 d$ O- u1 h
数字信号指幅度的取值是离散的,幅值表示被限制在有限个数值之内。 二进制码就是一种数字信号。二进制码受噪声的影响小,易于有数字电路进行处理,所以得到了广泛的应用。
4 F' \$ E* C0 g3 Q4 J2 n0 C7 N$ y R6 J3 N% l
四、单次转化与连续转换对比
! x* d& b. C- y7 M5 I O/ x$ U
: u8 b, w# f) c- r9 G
6 o3 X- X5 \- |* Q2 S' S# h( a
: q7 q( n4 _$ O6 f- m9 c
. R+ p. _, D7 ?) Z
; S4 z( V1 C7 S: p% p `$ N5 x五、扫描模式
3 z% U/ Q' W# d7 g5 W, z& q8 r6 f9 ?/ E/ i, J& G* h( l7 G
$ T# |/ ]) X: ^6 j r% H8 L
7 Y* K1 b! }: `. h
其他请参考其中文参考手册
l" K& T/ [; a
, H8 K2 q( s4 }: {+ j六、ADC精度
! q& P6 N2 X1 K6 N. W精度是衡量ADC转换准确性的一个标准,精度常有8bit 10bit 12bit 16bit四种,如下表所示:
2 H( ]% \* O0 u' O; B0 d0 h3 r% i4 W+ I( P
! v$ X3 ^7 _1 w0 {3 @2 Y2 P% X
W1 l' Z2 Y+ n也就是把3.3V的电压分成256,1024,4096,65535份,每一份电压是固定的,显而易见就是分的份数越多,精度就度越高了,也就是精度越小,ADC精度就越高5 R1 U# j4 }) R, \; o! L) B: V
2 S8 a! t: Z4 O/ T! o
ADC的转换公式如下:
3 y/ x' C! q) r0 q: s, a( ]* R2 Z O: a4 { m' F
5 i! X1 b* \7 ?1 U7 W2 z
" h+ U) l+ T2 P e' z$ r, h3 P# f4 l, U七、STM32F40x系列ADC外部通道和引脚对应关系
% X# Y' {: ]0 o* B! `3 ]9 H1 E' j' b7 D
" R! B6 V( Y; c- u
/ j- @& k3 `: @1 O2 r6 K/ e, A4 A八、实现过程
$ _1 B/ n1 ]$ y7 v3 t! O- //1、开启PA口时钟和ADC1时钟,设置PA1为模拟输入。
8 w! }1 n" z( \. Y( D6 T! G
: }; v4 M" G: G. V- @+ l2 p' i4 P- RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE); V7 O8 |) U& D( }$ ~* J( z# O
, \' k. ]/ f& b8 o% [# G# C8 K/ g3 {- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);( \4 A# p+ O2 M0 G# Q3 U6 O
- + ?: a6 n+ @, F
- 对应的GPIO初始化 " T; {* j) U2 [
. `# w$ E8 M X! C* N+ A% R* A- GPIO_Init();
' j8 w5 P! y" c% z3 Y0 s3 o - : }5 d6 N( T* X4 X2 q5 M5 X% Y$ k8 _
- //2、复位ADC1,同时设置ADC1分频因子。 g! U! [9 `5 i+ a1 Y
- g9 y# p5 s }4 w) s2 V* w2 p
- ADC_DeInit(ADC1);9 `7 x& X! h: ]: y# u& S0 Z' a
- //3、初始化ADC_CCR寄存器。
0 T! c; E1 e( H3 I* [$ c6 E' S - 8 v- I$ Q: B! t2 O8 X
- ADC_CommonInit();% i$ Y) u. m! Z: O. L
5 G& u9 N# ?1 N" F( R- //4、初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。9 T7 K7 K9 }4 m& @' e2 ~9 \1 D, j
- x' P% I- M- o- g v
- void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);* k: N+ e- z0 Y
7 U7 {+ c, f2 @- u- d- //5、使能ADC。. s$ [9 c) b/ I
( W% d0 ?8 E" a3 a+ h4 y# O- ADC_Cmd(ADC1, ENABLE);9 }1 _8 G7 l- I' A( h( {
- //6、配置规则通道参数:9 E$ f% W) |! B& L
- : c: N9 Z" |$ \# F6 ~6 m4 E3 X* k0 u
- ADC_RegularChannelConfig();
6 ^* Z' L/ i) U f! G - //7、开启软件转换:0 a' F6 P* ~7 c( p" D K1 \0 _
! d S& h, O7 Y" g- ADC_SoftwareStartConvCmd(ADC1);
- Y7 o' q' a$ K4 o0 ]3 h& \$ y4 V - ( B+ j# ]- B, C( E s
- //8、等待转换完成,读取ADC值。
6 q! u5 K/ ]1 J7 G
9 M. B& `7 b) e$ E ~8 n% N& S$ G- ADC_GetConversionValue(ADC1);1 z% h# S. Y+ d8 i) N
( W. Y' k) V! b5 G% }1 ?8 s
复制代码
9 l6 d. {" L" |8 G1 }6 ]
$ M# Y9 X" n( k2 \4 [! H( P: ?7 C8 F
+ Y7 j1 L, O* \# i4 r0 U1 J |