你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G4之ADC

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:09
一、ADC原理2 {* d' f* G) U
STM32G431内部集成2个有最高12位ADC(ADC1、ADC2),它们是逐次逼近型模数转换器
+ G$ z, W& |* q- u$ |0 B$ T7 V9 n, w5 Z3 N( i
ADC功能结构图
6 m+ T( V7 r5 W" o& O
( Z: r. j1 A! L( A/ _' p3 G LB6`_33L3(M@8PSEPZ)@_%D.png 4 A% Z  N/ i8 J2 |$ a) \1 E& S  Q

! ^+ g6 X- S( S6 j主要特性:! c+ V5 Z" X( d, a4 R
1.可配置的转换精度:6位,8位,10位,12位
3 ]' R, r: n; j* d$ H; c
+ b& }6 c& Q& h+ \- d2 \若精度为12位 : 3.3/ 212=3.3/4096 ,一个单位对应这多的电压值5 o  N! z6 ~. y* W
4 _- r$ b2 v0 H  N" ~( @& c
2.转换电压范围: 0 ~ VREF+(一般接到3.3V电源,不能超过STM32芯片电源电压)9 k& E. |* O6 H! \7 I

3 D" Z0 P6 i! j3 l4 x! O4 J5 \ W62U$FCIWVTFVRJIBYBN.png
8 f" B6 @' B1 m! s/ E+ Y" o: c2 J% O
3.19个转换通道:16个外部通道(IO引脚) + 3个内部通道(温度传感器、内部电压参考、电池供电监测)
9 N+ p% c+ g" U) ?7 D. U, P
3 a+ X+ o# K7 e$ I8 l4 P TLY9Z20(9}ED0Y4PNFH375O.png 0 I9 _& d2 e. `- J

6 X# t3 c+ ^& a1 j- m' C( P. A  f+ H4.采样时间可配置& z  @2 N5 W. t" y  H

9 Z) d' _' D; u' H+ f( F, t3 n5.扫描方向可配置
  T/ n5 H9 E7 R! u: b3 W% [' a! I3 T; F$ F
6.多种转换模式:单次,连续! K* }& B1 n* b5 H3 t  G
  P2 T/ _6 m6 [+ J! r# j( t) K, @6 k
7.数据存放对齐方式可配置:左对齐,右对齐(ADC的结果存储在一个左对齐或右对齐的 16 位数据寄存器中)& X* _: `3 y) c3 x

7 v7 Z' l0 _. ^8.启动转换方式可配置:软件触发,硬件触发
, D) Q7 t/ z# |2 J  s0 m/ ]+ D7 J
0 M0 a% b/ p& U+ D( M9.可设置上下门限的模拟看门狗
0 f1 ^: ^# \9 |+ d* E' X( C+ m* q- A& v  y( Y+ `
10.DMA功能
2 R4 j6 y) `0 q
0 y6 `! Z" k; l( b  m- X7 b11.在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断
0 d. U+ V  _4 d1 n4 E
' |( e5 f6 F; u; C' m4 A; j通道和转换顺序
, W6 B# O. O5 A. O+ l规则通道:规规矩矩按照顺序来转换,平时用到的就是这类通道.- c3 d* I2 v2 i; Z1 ~* s
E]{]Z84)4WUK[0$%)1U4KKS.png
+ ]* }  [5 u( _; A3 y$ h' J" A3 E& \7 S/ g. P! W/ H2 f
ADC_SQR1控制转换的顺序和数量(L[3:0])6 U* X/ A( k8 F4 P
& i3 I/ ]& e" L$ q; Y
注入通道: 注入可以理解为插队。它是一种在规则通道转换的时候强行插入要转换的一种。这点和中断有点像,当规则通道转换中,有注入通道插队,那么得先转换注入通道的,然后才倒回来转换规则通道: Z# R( j5 R9 y1 Q7 t7 z) l

2 U0 C( d  t, ~+ K ZANGT_IW3IQSBM385PAP{S0.png % @, `& F& m/ @, v7 ]& L8 z
( @8 M! {3 |, [% H& r
每个通道都有相应的触发电路,注入通道的触发电路为注入组,规则通道的触发电路为规则组
6 s' v, x: x) m/ n% f+ D% m4 V, s8 u  G
使用控制寄存器启动时,为ADON位写1开始转换,写0停止转换。7 N, \7 T0 N+ E% z; s
使用外部事件来触发转换,这个触发包括内部定时器触发和外部IO触发。
; d& x9 U# [9 Y, [: [
+ d3 O9 m! R5 X. A3 O* X* v. v触发源的选择由ADC_CFGR的EXTSEL[3:0]和ADC_JSQR的JEXTSEL[3:0]位来控制,EXTSEL[3:0]用于规则通道的触发源,
. ]0 R+ E4 T5 F4 iJEXTSEL[3:0]用于选择注入通道的触发源。选择好触发源后,控制EXTTRIG和JEXTTRIG这两位来激活触发源0 _8 ^1 k& Z- q+ w3 V- z, L
/ F3 J2 I4 n- b% U
转换时序图: ADC在开始精确转换之前需要一段稳定时间tSTAB。ADC开始转换并经过15个时钟周期后**,EOC标志置1,转换结果存放在16位ADC数据寄存器中。**& U( E" E9 r7 }5 j

! f, x( _$ q- p- P5 L 9][_}OR]FCJ_NP8BYO@0A85.png
. ?% e% Z5 Q5 x! `9 Z5 T0 ]2 ^" S; u
* |* {7 F3 l/ K% [  fADC必须在时钟ADC_CLK的控制下才能进行A/D转换,ADC_CLK的值是由时钟控制器控制, 可以选择同步时钟也可以选择异步时钟线。时钟控制器为ADC时钟提供了一个专用的可编程预分频器,默认的分频值为2
% @- I9 R9 r4 ^" x1 A" c0 q; a% M1 n7 H9 C" O6 N* m, B  v5 \
采样时间和转换时间:由ADC_SMPR1和ADC_SMPR2的SMP[2:0]设置,每个通道可以设置不同的时间采样,采样的周期最小是3个周期(1/ADC_CLK),TCONV=采样时间+12周期
2 b* _3 X3 h6 u- y0 Z1 S4 [7 k3 F
1 |. E6 T, q; F, E, J当ADC_CLK=30Mhz,ADC为3的周期,那么,总的转换时间为:TCONCV = 3+12 = 15个周期(0.5us)
% @! Z% ]$ _, a% }( ?0 c; F2 {& V) s1 p* N# I4 i. h$ q
当数据转换完成,数据将会以对齐方式(左/右)存入相应的寄存器, e' G3 a8 Q8 O$ B& Z# N! S. E
每个通道也有相应的转换结果寄存器,分别称为规则通道数据寄存器和注入通道数据寄存器
! ^! t0 R% c% J1 B$ G6 B- {
, @0 ?  g4 E/ U) t- u6 X0 Z$ f/ l但是,规则通道数据寄存器只有一组,所以存储进去,CPU必须马上读取,一般使用DMA处理;3 A) ^2 ~6 U& J) M! p; j

- M7 d! ]7 f, M, u) c. l& z3 Z通常,对于多个规则通道的转换,每次转换完一个数据,需要发出中断请求,CPU读取信息,但是如果转换数据量特别的时候,给CPU带来负担,有可能还没读走就转换了新的数据。9 k2 e1 o$ f6 [8 g: q0 A) V. H- Z5 t

# b/ {& t. ?% Z9 ^7 U- q% Q2 Q在使能DMA模式的情况下,每完成规则通道组中的一个通道转换后,都会生成一个DMA请求。这样便可将转换的数据从ADC_DR寄存器传输到用软件选择的目标位置。摆脱对CPU的依赖。2 ]1 L5 U( F7 C* i. _, `

1 @+ l* Q# X; F0 d1 Y注入通道数据寄存器可以存4组数据,最后一次读取。
6 v# ?8 ~/ s3 ]. ^! [% j0 N
8 @/ E+ O3 |8 n9 [模拟看门狗:用于监控高低电压阈值,可作用于一个、多个或全部转换通道,当检测到的电压低于或高于设定电压阈值时,可以产生中断; N  M) a5 ~. n/ w

% o4 }3 g0 C* z9 ^9 I GIS}YZFIJCOH3(7L6`2MPCI.png
7 ~8 p* N- K# L; r' \6 r4 w3 C- T$ D5 T# ^, X: W8 k1 U
如果ADC转换的模拟电压低于阈值下限或高于阈值上限,则AWD模拟看门狗状态位会置1。. W% ^( |: c( h4 F

! r* x* a* E* ], d: Z) W% p4 E* _2 W可以使用ADC_IER寄存器中的AWDIE位使能中断
1 K7 U2 _+ ~5 h' S, s& V$ x( ?
0CG9))B6VK@7SYI[EI73DYG.png
, s' q9 {2 G! R9 {5 _6 p! H' n' Q. H0 y1 U( k$ S
有4种情况可以产生中断,即规则组转换结束、注入组转换结束和模拟看门狗事件与溢出事件。ADC1和ADC2的中断映射在同一个中断向量上' H2 W1 k0 c0 L- Q3 m. ]

: Y" N6 a6 L4 s二、ADC工作模式
; [9 z5 c% J! L1.单次转换模式

" r6 Z9 }$ g1 I9 _3 d$ }在单次转换模式下,ADC执行一次转换。ADC_CFGRD的CCONT位为0时,可通过以下方式启动此模式:
- U3 j. q: K& \/ J' J% W3 W+ x% H& S! t) Z/ G, O2 i0 Z& ?' A
将ADC_CR寄存器中的ADSTART位置1(仅适用于规则通道)' |$ D' [2 U2 n. Q4 u$ N' m$ P
将JADSTART位置1(适用于注入通道)1 h4 H5 ^' \) C  a+ _
外部触发(适用于规则通道或注入通道)6 {! }/ ?4 x' _! ]' ?" x7 M1 {

+ V% G1 D& N" K1 N完成所选通道的转换之后:& X. F* {. Y6 x! ]( {9 Q
如果转换了规则通道:
, x; v! U: W% o1 @* y; ]& v( H, Q7 w  e. U- E* Z& Z, g
转换数据存储在16位ADC_DR寄存器中1 D" @6 [$ M3 Q' O
EOC(转换结束)标志置1
; E$ I- a, z3 IEOCIE位置1时将产生中断
/ x4 y- K$ Y- i3 S
1 @# X. K4 A0 _$ n& b如果转换了注入通道:
0 i: X: f* e& h/ A, Q  i1 D- E1 Z
转换数据存储在16位ADC_JDRy寄存器中1 @- A# v5 ~; a
JEOC(注入转换结束)标志置1
6 L2 }% i2 w* b4 s: ~JEOCIE 位置1时将产生中断
$ L; c- X8 J' h# u1 M0 V6 _5 J) ~! [3 Q* _6 R
然后,ADC停止。
5 {9 s7 |" r2 N! o7 ^, j( p1 d4 X( i& W$ o& |* d  J
2.不连续采样模式
% ~% u6 N. h. E: o- N+ A触发一次,n个连续转换,按照规则通道顺序; j, |8 M3 V) |' B4 V

% W, S1 q! j, Pn=3,要转换的通道=0、1、2、3、6、7、9、10(L[3:0]=8)
$ Y5 X& O: n2 o/ M; i第1次触发:转换序列0、1、2/ [" W( B4 q; {4 [# ]7 O9 ?) N
第2次触发:转换序列3、6、7
5 ]! {& T" i& S/ S) a第3次触发:转换序列9、10并生成EOC事件7 l# ?0 K. N3 Q  {% ~; e; k
第4次触发:转换序列0、1、2. E3 s1 q' ~$ y7 F

. J3 f$ v( P) E7 M' i/ a$ }- i3 F) c: q- Q$ K9 F
3.常规扫描模式(连续采样)4 s) e, _- g+ V1 Z& n4 A
连续转换模式下,ADC结束一个转换后立即启动一个新的转换。ADC_CFGRD的CONT位为1时,可通过外部触发或将ADC_CR寄存器中的ADC_DR位置1来启动此模式(仅适用于规则通道)。; n$ d# \. u( D! I; }! Y  ~( f
6 S, k+ y" A5 S( r' w) Y( P9 U) C* j
(2KCDM2$I_F2%NJW5[)D`UT.png . P# O. R8 W) F0 d! z
1 o4 s6 `* O1 o' P& t
每次转换之后,如果转换了规则通道组:" b+ X# J8 T0 T6 T' b4 z
* D8 r: P# ]4 Q3 Z+ v
上次转换的数据存储在16位ADC_DR寄存器中4 Y. s- t6 ^! Y- d+ |" |' K9 U
EOC(转换结束)标志置1  Y  e. \4 Q  j1 g6 r& q# W* w
EOCIE位置1时将产生中断
+ q- }8 Y1 F1 L
7 ], q- t8 g) O# q; _. U注意:无法连续转换注入通道。连续模式下唯一的例外情况是,注入通道配置为在规则通道之后自动转换(使用JAUTO位)。! v% r  ]& i% t% E8 R& }2 O; i1 v
8 _8 A) R, G8 V+ J1 v
4.注入转换扫描模式. j) B& c4 w  M' d4 i- T0 i
触发注入:在规则通道组转换期间出现外部注入,则当前的转换会复位,并且注入通道序列会切换为单次扫描模式。然后,规则通道组的规则转换会从上次中断的规则转换处恢复。8 Q: v3 Z9 X# w4 z7 J1 r% J

2 l! z" {& e, ?% C& k如果在注入转换期间出现规则事件,注入转换不会中断,但在注入序列结束时会执行规则序列。
) g* e+ y9 u8 ~3 u4 e
& B+ R# u. @8 H/ }$ @8 n2 V `6WHDWTX7LW{US3S~)MJ`{6.png : b+ G5 {! ]% L3 l; y$ W+ }# {
0 J0 u+ H% c' J* A. R, Y
自动注入:注入组中的通道会在规则组通道之后自动转换。这可用于转换最多由20个转换构成的序列) G& w/ k* b0 S+ J
4 e+ i) A3 n* U$ P" o5 m
5.多重ADC同时模式
4 F/ n) o, U  K0 Q' n- R. f一次触发,多个ADC同时转换通道数据
+ ^* Z" h& N3 }, G1 K: F$ L3 L7 q6 ~; E* E" }5 v
A73ZO~JMZ[$A@MIN1V$IH7B.png ) Q) A( x. `/ S0 F; o1 F0 x
- C2 x+ c# C! V4 O
在具有两个或更多ADC的器件中,可使用双重(具有两个ADC)和三重(具有三个ADC)ADC模式。多重ADC模式主要解决的问题是:在保证高精度下,提高采样率。
# C+ F: f+ q( u. @+ e0 G( B  Y' {+ g+ T
6.多重ADC交替模式- k' a# K3 g( M# u9 v$ V+ B
两个或者三个ADC交替对一个通道采样
7 ]2 ], W2 i+ m" l# |4 k3 C4 Y: I8 l
BNNPK`527A29C%U]D69)TP4.png ; H4 H9 |: l+ O8 o# i5 p' X3 A
* Z$ K) F  z* a; l6 Z. D) j. n* g
7.多重ADC交替触发模式1 s' a* Z7 F8 a- `. x" b
双重ADC模式:
* M* ]7 a" b, k7 i发生第一次触发时,将转换 ADC1 中注入组的所有通道5 e4 u% j7 g. G. F  v
发生第二次触发时,将转换 ADC2 中注入组的所有通道
" N" Q7 Z2 c) i- _! |* o以此类推3 E1 ~: A! |1 h8 P: x+ }/ {  ?0 D
3 a6 s$ l7 _4 w$ n' r
IGSL6]6W9S)J@SL~LH_4S.png
3 J% I; p% t" N
: @- z4 ~( t$ l4 E三、ADC配置(STM32CubeMX)6 k' R/ J' F  F3 [+ M- R
G4原理图) V% F. L' @: D# Z' U
4 _" A  q9 c' e) o  B/ C
`%HFT}R@RB$[LI7(VU7W)1M.png
- J- e9 N/ s+ ]% {. @" f7 Q5 d# h4 [* M9 i( F/ K
92893f879f694a41a479715f5a3809d3.png
( u. J) x0 w5 D6 i/ ]% r. O5 E( I9 y8 P
将PB15,PB12配置成ADC2的IN15,ADC1IN11通道0 Z( R5 m$ f$ o9 B; G/ |7 W

4 Z# g8 Y9 w) K3 B% G; { 79L(3H(}EH{UUEBFBPA[E5R.png ; z$ e& C2 V$ G. c

% V# U8 F1 p- `* d9 H: O使能ADC2的通道159 s) s" D4 ?0 j: ^$ n5 Z( C8 l; R9 }) u
. y& U7 X. c8 W* L# Z
)P7}@%V4S`WD}MVQ3[7K49G.png 0 |2 M( w4 Z( u" t, _* D' M
  i  I# p0 h8 h7 r- q& D
配置ADC的参数
) N+ E  H! I) f3 f, d0 l
" d& ?7 v5 F1 [9 m I7U]M)PNS)CGU({HD8JAK2X.png
/ s6 l; {. B$ }' E% U8 S# j
, `) b! _' `" U( J2 { MJY~9)K(}8O}0Z0I(XJG$D9.png
$ [9 h: D; r" ]5 z6 a. L! x; s2 s+ W. n
195993a0e9fd41feb2bb1fb4b158e1cd.png
' g! S; B4 M( Y" h; p; h
; Z7 q2 z7 K: P7 H% R" p; gADC时钟的选择
: K$ {$ U( V" V6 J. y
. N& X- d8 ~( ?, k7 f2 U0 t% W" t {2TC$O39_HDZU[WC3IGS{HF.png 5 ~- G/ p& W7 G' D
2 N8 D7 E, L8 q6 T' K
若没有使用DMA,上面的ADC差不多配置完了
$ X5 k# Y8 w9 f. H
. |! {: d' U0 f. a4 E四、部分程序
  p2 w+ n' r; c) ?6 P, [8 dSTM32CubeMX会配置好ADC的初始化,我们只要写ADC的采样函数即可; [- s) a4 n: ?2 W3 x$ v' Q  `% t
调用HAL函数即可,HAL_ADC_GetValue()得到返回值。注意,在调用该函数之前一定要初始化adc的句柄。3 p, C# j* l/ b
; ?  y" J0 D& \5 |8 w
  1. uint16_t getADC1(void)
    * g) Y- g% Q( k& b0 {
  2. {
    , H  S7 ^! i) S3 E$ m# z
  3.         uint16_t adc = 0;% Q& T1 E# I2 d/ h
  4.         HAL_ADC_Start(&hadc1);
    $ b9 n7 u5 W$ V) ?# s
  5.         adc = HAL_ADC_GetValue(&hadc1);
    % N) f" [1 |' ~" T
  6.         return adc;
    ; K6 |. k, J- ?1 m7 i, n' F
  7. }
复制代码

- T# h* X. J+ x: n8 ?( G) s/ \' z, }0 }2 v* z
7 T; m" l" ~! j5 g5 q, }
$ u+ B3 }/ ~9 d  ^; T# L4 j

) |) ~, e' w: k7 T( J$ L
收藏 评论0 发布时间:2022-7-5 22:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版