
一、ADC原理 STM32G431内部集成2个有最高12位ADC(ADC1、ADC2),它们是逐次逼近型模数转换器 % r' y% z5 f, f* r4 O0 t ADC功能结构图 . \6 A1 y' ^4 M, n8 e- X1 @ ![]() 主要特性: 1.可配置的转换精度:6位,8位,10位,12位 若精度为12位 : 3.3/ 212=3.3/4096 ,一个单位对应这多的电压值. b( [5 i) G( U% `+ m 4 W! _; t2 O9 P4 D: j* q 2.转换电压范围: 0 ~ VREF+(一般接到3.3V电源,不能超过STM32芯片电源电压)! r3 v9 n( Y9 ^) H8 V $ Q( H" p4 c5 B# p ![]() 3.19个转换通道:16个外部通道(IO引脚) + 3个内部通道(温度传感器、内部电压参考、电池供电监测)1 a% H# H, g# f- D) A$ p* ^ 2 r5 k' V. e2 C( r/ F" u, w% d ![]() 4.采样时间可配置 5.扫描方向可配置1 z- s6 @( X0 ^6 | 6.多种转换模式:单次,连续 7.数据存放对齐方式可配置:左对齐,右对齐(ADC的结果存储在一个左对齐或右对齐的 16 位数据寄存器中) , G. p5 K' j4 J' _. D) h+ g/ l# @ 8.启动转换方式可配置:软件触发,硬件触发 ( T7 L& b/ R# o( u1 U 9.可设置上下门限的模拟看门狗( {9 x; b+ q: I0 v2 z 6 v+ B* o" N. S 10.DMA功能 11.在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断 $ e9 M! [* K8 e2 O4 y# {4 g& { 通道和转换顺序 规则通道:规规矩矩按照顺序来转换,平时用到的就是这类通道. ![]() ADC_SQR1控制转换的顺序和数量(L[3:0]) i! r. D) s N4 z- J( |# N 注入通道: 注入可以理解为插队。它是一种在规则通道转换的时候强行插入要转换的一种。这点和中断有点像,当规则通道转换中,有注入通道插队,那么得先转换注入通道的,然后才倒回来转换规则通道& ]$ O/ f* }3 c ![]() 每个通道都有相应的触发电路,注入通道的触发电路为注入组,规则通道的触发电路为规则组1 W4 _) h, g A7 a7 W 使用控制寄存器启动时,为ADON位写1开始转换,写0停止转换。 使用外部事件来触发转换,这个触发包括内部定时器触发和外部IO触发。 7 H$ E, O) K) `0 M% }6 N 触发源的选择由ADC_CFGR的EXTSEL[3:0]和ADC_JSQR的JEXTSEL[3:0]位来控制,EXTSEL[3:0]用于规则通道的触发源, JEXTSEL[3:0]用于选择注入通道的触发源。选择好触发源后,控制EXTTRIG和JEXTTRIG这两位来激活触发源 ' C3 T2 O# s* S; C5 N( e8 ] 转换时序图: ADC在开始精确转换之前需要一段稳定时间tSTAB。ADC开始转换并经过15个时钟周期后**,EOC标志置1,转换结果存放在16位ADC数据寄存器中。** * c; g0 Z. \# Q3 \3 U" `6 Q: O. B3 @ ![]() # c8 A. y+ ?, J4 h) t$ { ADC必须在时钟ADC_CLK的控制下才能进行A/D转换,ADC_CLK的值是由时钟控制器控制, 可以选择同步时钟也可以选择异步时钟线。时钟控制器为ADC时钟提供了一个专用的可编程预分频器,默认的分频值为2' F$ c. W" a2 m% Y- z! |5 s$ `1 P 采样时间和转换时间:由ADC_SMPR1和ADC_SMPR2的SMP[2:0]设置,每个通道可以设置不同的时间采样,采样的周期最小是3个周期(1/ADC_CLK),TCONV=采样时间+12周期 . ~+ C; H' B) C1 m8 E9 Q" E; F# \ 当ADC_CLK=30Mhz,ADC为3的周期,那么,总的转换时间为:TCONCV = 3+12 = 15个周期(0.5us)/ g8 t6 }0 y* T# _% j" i 9 \! V: y! o2 b0 p7 o 当数据转换完成,数据将会以对齐方式(左/右)存入相应的寄存器: |. T8 a9 H; Q/ [( {) u 每个通道也有相应的转换结果寄存器,分别称为规则通道数据寄存器和注入通道数据寄存器 7 R( M- ?0 u1 M6 x, m. l. @ 但是,规则通道数据寄存器只有一组,所以存储进去,CPU必须马上读取,一般使用DMA处理;; l. L, h; T n& x. E( K, i1 Z - H4 C! F( M0 G 通常,对于多个规则通道的转换,每次转换完一个数据,需要发出中断请求,CPU读取信息,但是如果转换数据量特别的时候,给CPU带来负担,有可能还没读走就转换了新的数据。 # c+ p4 |! F s. T4 N6 Z) W6 l 在使能DMA模式的情况下,每完成规则通道组中的一个通道转换后,都会生成一个DMA请求。这样便可将转换的数据从ADC_DR寄存器传输到用软件选择的目标位置。摆脱对CPU的依赖。" l; O6 `% c" F0 |9 ~& N 注入通道数据寄存器可以存4组数据,最后一次读取。3 b' v6 o# r) U0 ]: R$ K/ {% x9 K 模拟看门狗:用于监控高低电压阈值,可作用于一个、多个或全部转换通道,当检测到的电压低于或高于设定电压阈值时,可以产生中断 - w( N# x4 E9 g/ D2 A! T ![]() - T9 h* d6 [# c+ a6 C0 ^ n; _ 如果ADC转换的模拟电压低于阈值下限或高于阈值上限,则AWD模拟看门狗状态位会置1。 I1 a$ p" C0 u6 B+ R O 可以使用ADC_IER寄存器中的AWDIE位使能中断 ![]() 有4种情况可以产生中断,即规则组转换结束、注入组转换结束和模拟看门狗事件与溢出事件。ADC1和ADC2的中断映射在同一个中断向量上# s7 K- q6 A9 t1 S3 H0 g 二、ADC工作模式, i+ F- J% z0 J1 A' \ 1.单次转换模式' L; I7 M) L9 ^7 o 在单次转换模式下,ADC执行一次转换。ADC_CFGRD的CCONT位为0时,可通过以下方式启动此模式: 将ADC_CR寄存器中的ADSTART位置1(仅适用于规则通道)6 s- S- P0 x$ `; s% [5 r+ @- \ 将JADSTART位置1(适用于注入通道)7 g5 ~# r6 `) }3 H, C; } 外部触发(适用于规则通道或注入通道)! G: G3 S: P8 r 完成所选通道的转换之后: 如果转换了规则通道: 转换数据存储在16位ADC_DR寄存器中 EOC(转换结束)标志置1: y& x4 c8 A8 q# r, o0 @ EOCIE位置1时将产生中断 如果转换了注入通道:* s; G/ |- J9 `' V3 X3 S 转换数据存储在16位ADC_JDRy寄存器中 JEOC(注入转换结束)标志置10 I* m+ U/ F( G# s' N2 k+ { JEOCIE 位置1时将产生中断 8 A W8 z4 E6 r/ H, n: L: d: n# L 然后,ADC停止。 4 n4 X0 }7 ?# H- B. f- M 2.不连续采样模式0 d9 H, `, b7 i4 x9 _- `) o5 ^( L 触发一次,n个连续转换,按照规则通道顺序& t. v/ s) M7 V; o- D$ {2 R! y n=3,要转换的通道=0、1、2、3、6、7、9、10(L[3:0]=8) 第1次触发:转换序列0、1、2 第2次触发:转换序列3、6、7 第3次触发:转换序列9、10并生成EOC事件* [ N1 Q! f* Y1 Z( k& F 第4次触发:转换序列0、1、2; G' a2 R( A) Q& v7 H' d … : i& |9 _2 W: `3 b 3.常规扫描模式(连续采样)8 x( o* o/ N$ h5 x' r$ R 连续转换模式下,ADC结束一个转换后立即启动一个新的转换。ADC_CFGRD的CONT位为1时,可通过外部触发或将ADC_CR寄存器中的ADC_DR位置1来启动此模式(仅适用于规则通道)。 % B$ K- f; _# F6 T ![]() 每次转换之后,如果转换了规则通道组: / @; a% V3 }% _/ X4 B3 H 上次转换的数据存储在16位ADC_DR寄存器中 EOC(转换结束)标志置1( P+ U4 Z% j8 N+ }& n3 Z EOCIE位置1时将产生中断 注意:无法连续转换注入通道。连续模式下唯一的例外情况是,注入通道配置为在规则通道之后自动转换(使用JAUTO位)。# G8 v3 l- F4 @0 k+ d7 h- c 8 o5 Q+ I" {$ e3 `# p 4.注入转换扫描模式 触发注入:在规则通道组转换期间出现外部注入,则当前的转换会复位,并且注入通道序列会切换为单次扫描模式。然后,规则通道组的规则转换会从上次中断的规则转换处恢复。5 E! b I+ | V% { % \+ \4 Y" y+ W; [! @1 y8 @4 C7 w 如果在注入转换期间出现规则事件,注入转换不会中断,但在注入序列结束时会执行规则序列。3 `* q0 y8 S! M& q# c" p, R( w ![]() ' c# X. u* h, d# I 自动注入:注入组中的通道会在规则组通道之后自动转换。这可用于转换最多由20个转换构成的序列 6 {: q1 F. `' C1 k/ L: j6 t8 x 5.多重ADC同时模式 一次触发,多个ADC同时转换通道数据 + i5 D* F: z6 b% F( ] O* U ![]() 在具有两个或更多ADC的器件中,可使用双重(具有两个ADC)和三重(具有三个ADC)ADC模式。多重ADC模式主要解决的问题是:在保证高精度下,提高采样率。! B6 e N& _2 |* K# V 6.多重ADC交替模式; K; r3 f* }6 S# Z9 t1 h& W6 | 两个或者三个ADC交替对一个通道采样 1 W5 W. u3 z2 l* }; { ![]() 7.多重ADC交替触发模式; {) [+ p$ p) B `, n' p 双重ADC模式:$ @* x5 F* x! C2 y& a 发生第一次触发时,将转换 ADC1 中注入组的所有通道 发生第二次触发时,将转换 ADC2 中注入组的所有通道 以此类推; a l. S# H- K* O! I# {5 B9 m , F" L9 J! D; d x ![]() 5 Q6 _: `1 d3 u! y: @" y 三、ADC配置(STM32CubeMX) G4原理图 ' g2 ?! A4 d% Z* r7 a) o& j ![]() 1 D* M- m4 y! h8 | q- d( y8 ]) h ![]() 将PB15,PB12配置成ADC2的IN15,ADC1IN11通道$ z8 b2 k0 c4 _9 N: R( ]: o1 Z ![]() 8 b# a7 P; f0 R7 F 使能ADC2的通道15 9 q, N* \; N# \" g3 ` ![]() 配置ADC的参数9 d' I5 V' F, v( [; l/ l ![]() / l; v$ \. H T; z9 j ![]() ![]() ADC时钟的选择5 H$ r$ y* l: g8 m, m/ l9 U) y ![]() ; G) y: y0 `5 }' n5 ? 若没有使用DMA,上面的ADC差不多配置完了 四、部分程序4 K. Z3 y5 y+ R* r& E STM32CubeMX会配置好ADC的初始化,我们只要写ADC的采样函数即可# S# z8 {% z8 ~! m e' p& g" C* N! ` 调用HAL函数即可,HAL_ADC_GetValue()得到返回值。注意,在调用该函数之前一定要初始化adc的句柄。 F4 E9 K7 H B' r. } ) h% _; _* k" J, S
1 h5 z$ z( x& G7 c8 C; c + \! u5 Z Z7 S8 }/ h6 ?9 Z% k9 ` $ S z [ D m6 I% D r7 q# p |