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

【经验分享】STM32G4之ADC

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:09
一、ADC原理
5 J9 h: {" N9 r3 u$ O5 }STM32G431内部集成2个有最高12位ADC(ADC1、ADC2),它们是逐次逼近型模数转换器
0 G" p8 V- B. _8 T: u# C- x% r' y% z5 f, f* r4 O0 t
ADC功能结构图
) H, r/ c1 a) i; V. \6 A1 y' ^4 M, n8 e- X1 @
LB6`_33L3(M@8PSEPZ)@_%D.png 9 U" f+ x$ S! l/ i+ m

! ]% q2 `9 m# k! t( h; [主要特性:
1 `) m; \; A: R6 E3 {4 Z1.可配置的转换精度:6位,8位,10位,12位
# I8 `( K% V' p
0 J/ c, q- y; Y  W- {) x# E' P若精度为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
W62U$FCIWVTFVRJIBYBN.png
* U0 x+ x5 l1 k' a1 a6 ]! _
4 p5 U' T  v, L9 c! J# H3.19个转换通道:16个外部通道(IO引脚) + 3个内部通道(温度传感器、内部电压参考、电池供电监测)1 a% H# H, g# f- D) A$ p* ^
2 r5 k' V. e2 C( r/ F" u, w% d
TLY9Z20(9}ED0Y4PNFH375O.png 5 U5 ?4 ^' ?+ y& [

3 n! m, j; K1 O5 s7 D& C: N6 J4.采样时间可配置
6 H  e2 M8 M' [$ h
. O; p( `# r. ~! m5 i1 V5.扫描方向可配置1 z- s6 @( X0 ^6 |

# U8 R- _" `5 K7 P" D6.多种转换模式:单次,连续
: ]/ T8 l9 F! A7 P: z
8 ^2 Q0 o2 A' R: u7.数据存放对齐方式可配置:左对齐,右对齐(ADC的结果存储在一个左对齐或右对齐的 16 位数据寄存器中)
1 ?9 {; W" F, q9 z/ m, R" p  s, G. p5 K' j4 J' _. D) h+ g/ l# @
8.启动转换方式可配置:软件触发,硬件触发
$ c* Q# U# s5 M( T7 L& b/ R# o( u1 U
9.可设置上下门限的模拟看门狗( {9 x; b+ q: I0 v2 z
6 v+ B* o" N. S
10.DMA功能
# f# F* h( w1 l, \' Z1 r
7 W$ _4 n; P5 M11.在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断
' p" O+ b* p5 ^6 t! C8 g+ I. P$ e9 M! [* K8 e2 O4 y# {4 g& {
通道和转换顺序
/ d/ M- D; f- k7 v/ e( F8 w7 r规则通道:规规矩矩按照顺序来转换,平时用到的就是这类通道.
) [: b$ f* l) i6 B" G3 ? E]{]Z84)4WUK[0$%)1U4KKS.png
' M+ _5 l8 e: h0 J# N
' H$ V' N# I1 O  |+ X* pADC_SQR1控制转换的顺序和数量(L[3:0])
5 c( P1 `3 m$ o; U  i! r. D) s  N4 z- J( |# N
注入通道: 注入可以理解为插队。它是一种在规则通道转换的时候强行插入要转换的一种。这点和中断有点像,当规则通道转换中,有注入通道插队,那么得先转换注入通道的,然后才倒回来转换规则通道& ]$ O/ f* }3 c

/ o  ?2 S' a9 g' C9 K ZANGT_IW3IQSBM385PAP{S0.png 2 E1 Z* H$ g( S4 B

, h# f6 K+ Y9 j$ n: [每个通道都有相应的触发电路,注入通道的触发电路为注入组,规则通道的触发电路为规则组1 W4 _) h, g  A7 a7 W

0 k, x+ @; ?" j& J! c5 e  e使用控制寄存器启动时,为ADON位写1开始转换,写0停止转换。
  y( u+ n3 q4 J使用外部事件来触发转换,这个触发包括内部定时器触发和外部IO触发。
; A* Z/ z& A8 Y! r- p3 k7 H$ E, O) K) `0 M% }6 N
触发源的选择由ADC_CFGR的EXTSEL[3:0]和ADC_JSQR的JEXTSEL[3:0]位来控制,EXTSEL[3:0]用于规则通道的触发源,
6 n% J+ l3 G2 r: a) vJEXTSEL[3:0]用于选择注入通道的触发源。选择好触发源后,控制EXTTRIG和JEXTTRIG这两位来激活触发源
- G% ?% u" s4 U8 J' C3 T2 O# s* S; C5 N( e8 ]
转换时序图: ADC在开始精确转换之前需要一段稳定时间tSTAB。ADC开始转换并经过15个时钟周期后**,EOC标志置1,转换结果存放在16位ADC数据寄存器中。**
& @0 ^; s; \0 d% P/ _. h* c; g0 Z. \# Q3 \3 U" `6 Q: O. B3 @
9][_}OR]FCJ_NP8BYO@0A85.png
& d) \0 n( v% C: _3 M% O# 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

3 L7 X% r. o; B采样时间和转换时间:由ADC_SMPR1和ADC_SMPR2的SMP[2:0]设置,每个通道可以设置不同的时间采样,采样的周期最小是3个周期(1/ADC_CLK),TCONV=采样时间+12周期
; E8 M! d0 R4 J4 p5 @2 k& B" L. ~+ 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
每个通道也有相应的转换结果寄存器,分别称为规则通道数据寄存器和注入通道数据寄存器
) `8 i2 |8 K! G3 i' |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带来负担,有可能还没读走就转换了新的数据。
# Q" I" Y, ?9 t( B# c+ p4 |! F  s. T4 N6 Z) W6 l
在使能DMA模式的情况下,每完成规则通道组中的一个通道转换后,都会生成一个DMA请求。这样便可将转换的数据从ADC_DR寄存器传输到用软件选择的目标位置。摆脱对CPU的依赖。" l; O6 `% c" F0 |9 ~& N

" R: z( D% y  g1 l+ Z注入通道数据寄存器可以存4组数据,最后一次读取。3 b' v6 o# r) U0 ]: R$ K/ {% x9 K

$ h  p8 [) s6 J& {* _. \1 W模拟看门狗:用于监控高低电压阈值,可作用于一个、多个或全部转换通道,当检测到的电压低于或高于设定电压阈值时,可以产生中断
! X6 `! E; ]! m/ W- w( N# x4 E9 g/ D2 A! T
GIS}YZFIJCOH3(7L6`2MPCI.png
/ T/ C2 m( `. c& X7 v- T9 h* d6 [# c+ a6 C0 ^  n; _
如果ADC转换的模拟电压低于阈值下限或高于阈值上限,则AWD模拟看门狗状态位会置1。  I1 a$ p" C0 u6 B+ R  O

5 L: e- Y2 H2 j) h7 K# Q2 {可以使用ADC_IER寄存器中的AWDIE位使能中断
$ O; X# w9 _9 r4 k/ p
1 e" l0 y8 ?0 O  x' O9 W& W 0CG9))B6VK@7SYI[EI73DYG.png
& x/ ^6 W4 ?; C. j
8 s& R) Y7 P2 I0 i9 L有4种情况可以产生中断,即规则组转换结束、注入组转换结束和模拟看门狗事件与溢出事件。ADC1和ADC2的中断映射在同一个中断向量上# s7 K- q6 A9 t1 S3 H0 g

% B; A$ `6 o5 M: `" W% ^: e( h二、ADC工作模式, i+ F- J% z0 J1 A' \
1.单次转换模式
' L; I7 M) L9 ^7 o
在单次转换模式下,ADC执行一次转换。ADC_CFGRD的CCONT位为0时,可通过以下方式启动此模式:
$ Q3 ?( l$ }) I: p/ D9 s# W2 p
! r, k+ |* I# W6 i8 ?) r5 X+ X4 ~将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

1 v) O  }! @9 A% Q1 U. _完成所选通道的转换之后:
6 t* K! O% Z, S  ]如果转换了规则通道:
/ @# A! ~9 k  j3 o& v
- Y$ x: I- L6 R转换数据存储在16位ADC_DR寄存器中
' b4 _+ q4 F1 i0 n1 OEOC(转换结束)标志置1: y& x4 c8 A8 q# r, o0 @
EOCIE位置1时将产生中断
" E3 m# r# D6 @
1 m+ ]* d3 s0 w如果转换了注入通道:* s; G/ |- J9 `' V3 X3 S

3 o2 |$ |: y3 ?  ?9 H2 L7 w. z5 S转换数据存储在16位ADC_JDRy寄存器中
: X0 z/ U8 x- p. ]JEOC(注入转换结束)标志置10 I* m+ U/ F( G# s' N2 k+ {
JEOCIE 位置1时将产生中断
: ]# {' D" u1 Y: R) o* m" l8 A  W8 z4 E6 r/ H, n: L: d: n# L
然后,ADC停止。
3 ?. R, V2 ^: d5 e' T0 v4 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

0 ?9 x# ^$ T% Q- p  Ln=3,要转换的通道=0、1、2、3、6、7、9、10(L[3:0]=8)
' m. m& Y, |5 B/ x2 W1 O. q第1次触发:转换序列0、1、2
# `4 @6 c) y# Y  f3 V1 l  J$ C第2次触发:转换序列3、6、7
, ?* v/ V$ c" w1 S" E第3次触发:转换序列9、10并生成EOC事件* [  N1 Q! f* Y1 Z( k& F
第4次触发:转换序列0、1、2; G' a2 R( A) Q& v7 H' d

  `2 D2 N3 i# R: 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来启动此模式(仅适用于规则通道)。
+ y; H* d8 t  G" s- ]% y% B$ K- f; _# F6 T
(2KCDM2$I_F2%NJW5[)D`UT.png * H- C' t5 I, j. E

1 ~, b7 b4 c1 K. n每次转换之后,如果转换了规则通道组:
7 M2 ^* B2 V3 b6 x# }* e/ @; a% V3 }% _/ X4 B3 H
上次转换的数据存储在16位ADC_DR寄存器中
( ]. o9 E' t8 o5 g8 S" MEOC(转换结束)标志置1( P+ U4 Z% j8 N+ }& n3 Z
EOCIE位置1时将产生中断
6 c/ C, |6 L2 y  p1 h  V% Y
8 F& Q( o& [2 t8 l2 z注意:无法连续转换注入通道。连续模式下唯一的例外情况是,注入通道配置为在规则通道之后自动转换(使用JAUTO位)。# G8 v3 l- F4 @0 k+ d7 h- c
8 o5 Q+ I" {$ e3 `# p
4.注入转换扫描模式
$ G# L7 Y9 H  t' C, C+ `触发注入:在规则通道组转换期间出现外部注入,则当前的转换会复位,并且注入通道序列会切换为单次扫描模式。然后,规则通道组的规则转换会从上次中断的规则转换处恢复。5 E! b  I+ |  V% {
% \+ \4 Y" y+ W; [! @1 y8 @4 C7 w
如果在注入转换期间出现规则事件,注入转换不会中断,但在注入序列结束时会执行规则序列。3 `* q0 y8 S! M& q# c" p, R( w

' `4 M+ S0 U2 P. t `6WHDWTX7LW{US3S~)MJ`{6.png
; u7 B( Z3 d% Y- I! j' c# X. u* h, d# I
自动注入:注入组中的通道会在规则组通道之后自动转换。这可用于转换最多由20个转换构成的序列
3 j, @: Y, n' Y6 {: q1 F. `' C1 k/ L: j6 t8 x
5.多重ADC同时模式
  o0 Z! h) {3 Y  s: Y* B! Q一次触发,多个ADC同时转换通道数据
: U0 j. ?5 a3 @6 y- u+ i5 D* F: z6 b% F( ]  O* U
A73ZO~JMZ[$A@MIN1V$IH7B.png
3 d5 ^8 F! @" j  p* ?
9 w  H* r( _5 S. P( t在具有两个或更多ADC的器件中,可使用双重(具有两个ADC)和三重(具有三个ADC)ADC模式。多重ADC模式主要解决的问题是:在保证高精度下,提高采样率。! B6 e  N& _2 |* K# V

  V4 K; U; |% \" b6.多重ADC交替模式; K; r3 f* }6 S# Z9 t1 h& W6 |
两个或者三个ADC交替对一个通道采样
5 D- Q* ^4 F# ?: N" M' i1 W5 W. u3 z2 l* }; {
BNNPK`527A29C%U]D69)TP4.png
' b0 X- I" \2 v9 P, E8 j5 n
4 m3 L4 a! |) r  A3 X/ {7.多重ADC交替触发模式; {) [+ p$ p) B  `, n' p
双重ADC模式:$ @* x5 F* x! C2 y& a
发生第一次触发时,将转换 ADC1 中注入组的所有通道
. |0 n7 u$ R$ k  C发生第二次触发时,将转换 ADC2 中注入组的所有通道
8 F- O+ x2 r; r- C9 m, f" t- j" w以此类推; a  l. S# H- K* O! I# {5 B9 m
, F" L9 J! D; d  x
IGSL6]6W9S)J@SL~LH_4S.png
) K, o& C9 I6 m0 S3 Q4 ?7 P- r% a9 t5 Q6 _: `1 d3 u! y: @" y
三、ADC配置(STM32CubeMX)
5 o1 B. F9 Q1 C6 Z" `( Q) q" FG4原理图
; N) D$ ?- i; i, l6 t' g2 ?! A4 d% Z* r7 a) o& j
`%HFT}R@RB$[LI7(VU7W)1M.png
. E+ n. }  K, M0 O$ ^9 _1 D* M- m4 y! h8 |  q- d( y8 ]) h
92893f879f694a41a479715f5a3809d3.png
& F1 B' _, k9 _% h/ V  M& X
6 R2 ?, [) u1 ~$ @* h- S将PB15,PB12配置成ADC2的IN15,ADC1IN11通道$ z8 b2 k0 c4 _9 N: R( ]: o1 Z

" G) ]$ I: B4 W7 ~& A. a( @. x$ { 79L(3H(}EH{UUEBFBPA[E5R.png
7 F8 |% q& q( x6 k' k/ z% K1 }8 b# a7 P; f0 R7 F
使能ADC2的通道15
  w- W+ j' b9 Y3 l+ |9 q, N* \; N# \" g3 `
)P7}@%V4S`WD}MVQ3[7K49G.png + K7 m- q# k1 `+ y3 p: P

: C) l  s, P, j% e配置ADC的参数9 d' I5 V' F, v( [; l/ l

  ~9 }" i6 `( T+ [3 k( o I7U]M)PNS)CGU({HD8JAK2X.png + H; \' U0 A: v
/ l; v$ \. H  T; z9 j
MJY~9)K(}8O}0Z0I(XJG$D9.png
% `6 i5 y  c8 j$ E& c. S
' k$ x) g2 X' y, J8 a% t: L 195993a0e9fd41feb2bb1fb4b158e1cd.png , L4 `5 k/ \+ @2 F9 Z* z8 J

+ P" s3 B* Q3 c$ L% S$ }* ZADC时钟的选择5 H$ r$ y* l: g8 m, m/ l9 U) y

" j8 d$ u5 w1 N  T1 `: N5 p {2TC$O39_HDZU[WC3IGS{HF.png 1 R1 i0 n" S6 G, m. x
; G) y: y0 `5 }' n5 ?
若没有使用DMA,上面的ADC差不多配置完了
( T/ W! C/ C. N: g; R+ e' ?* J3 k
9 ~) \9 ]: G, N; D% T四、部分程序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. uint16_t getADC1(void)* a: H: d9 L* z( f  Q9 p' D3 b
  2. {
    # z7 R  o, _+ k
  3.         uint16_t adc = 0;
    + \/ S: Y7 C0 e
  4.         HAL_ADC_Start(&hadc1);
    ; B# R* u. A' t  F
  5.         adc = HAL_ADC_GetValue(&hadc1);" H" P$ A: @3 N/ D/ [
  6.         return adc;/ c* }1 z5 g7 Y
  7. }
复制代码

+ i( Y9 T% ^' V  v) p1 h5 z$ z( x& G7 c8 C; c
+ \! u5 Z  Z7 S8 }/ h6 ?9 Z% k9 `

1 g4 H) N  U/ g$ S  z  [  D  m6 I% D  r7 q# p
收藏 评论0 发布时间:2022-7-5 22:09

举报

0个回答

所属标签

相似分享

官网相关资源

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