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

【经验分享】STM32G4之ADC

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:09
一、ADC原理' J/ V2 c4 ^$ o( `2 a
STM32G431内部集成2个有最高12位ADC(ADC1、ADC2),它们是逐次逼近型模数转换器& I* b: E( M1 t: q8 K2 N
5 z1 q0 m& ^& X( P  y0 L. }6 P
ADC功能结构图
. m- O: S0 k  |5 [, `1 W8 i7 N7 J% |# p: B& R& c1 m
LB6`_33L3(M@8PSEPZ)@_%D.png
; G; a5 U* x$ r
& p$ R3 N, l% p( O' e* H/ f主要特性:0 J% w6 I* p6 G: C
1.可配置的转换精度:6位,8位,10位,12位8 F) L0 A/ A: M$ A* H  S
% h" R% K, M$ T* l! q  g9 Z, W
若精度为12位 : 3.3/ 212=3.3/4096 ,一个单位对应这多的电压值
& L5 R& f8 ]4 C$ Z: u1 f) D+ \  i% g7 s+ @( G
2.转换电压范围: 0 ~ VREF+(一般接到3.3V电源,不能超过STM32芯片电源电压)1 ?0 l) Q& k, u: n
' p) w) |# J9 r+ P! a8 W( j7 M
W62U$FCIWVTFVRJIBYBN.png
8 Q; T  G3 J; M: |3 k: T8 M" c4 ]/ S0 B  R  P" c% m
3.19个转换通道:16个外部通道(IO引脚) + 3个内部通道(温度传感器、内部电压参考、电池供电监测)! c+ z/ s+ ]# y8 D" f3 G5 i
8 a: h1 Y+ n  }! F2 ~
TLY9Z20(9}ED0Y4PNFH375O.png % P; b1 s' r0 r& [' K- |
" ^/ R/ }4 o  ]; g5 a
4.采样时间可配置  _) r2 \" ?" H4 Q- N: Q$ f( `+ g

5 L( T8 Z) H- u0 @& b5.扫描方向可配置
+ j4 T# r$ Y/ z/ _6 h1 M/ V( j( Y* B; ?* z
6.多种转换模式:单次,连续
$ k$ q. H* J  d( r5 l6 t2 Q4 k. b7 O- {, Y5 L: {9 m
7.数据存放对齐方式可配置:左对齐,右对齐(ADC的结果存储在一个左对齐或右对齐的 16 位数据寄存器中)7 B+ o( s# |9 h! @. a% Y  ?2 N, y
) P5 K( r4 L; q3 Y
8.启动转换方式可配置:软件触发,硬件触发
, H) ?2 f5 Z; B; V0 O+ x
' l2 S% s  S9 t: z: S  a9.可设置上下门限的模拟看门狗  n8 n  R$ Y% Q
+ w7 f' w2 G) C6 E% H
10.DMA功能( }& `* ?7 {$ @, C/ F6 d  c
, x6 @, Z6 }1 S1 X
11.在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断, \* M4 V' R. g" j0 Q6 l, y
3 y  t# r$ b/ |0 I6 m4 Z: b' W3 l' d
通道和转换顺序9 p7 i8 i9 L+ w) X0 F( d* f
规则通道:规规矩矩按照顺序来转换,平时用到的就是这类通道.  u7 F2 ]  {1 e% j0 g+ K( M; |; Q: B
E]{]Z84)4WUK[0$%)1U4KKS.png
% b( I5 {; J; R7 K' E9 O+ _5 ~* ~4 s3 p, {& c( g, W. I2 j( e
ADC_SQR1控制转换的顺序和数量(L[3:0])5 t- J( T# a) p6 B: O8 t  E
9 _+ B5 |1 X+ I& Q' O' W) N% z$ N
注入通道: 注入可以理解为插队。它是一种在规则通道转换的时候强行插入要转换的一种。这点和中断有点像,当规则通道转换中,有注入通道插队,那么得先转换注入通道的,然后才倒回来转换规则通道) }6 Q9 b3 E8 \- m- M( g3 z

7 {6 F7 ?$ g( I* ]; l0 m% z. R9 x ZANGT_IW3IQSBM385PAP{S0.png ; z! `- S, _' V8 g& D" K
. w4 o4 o* r/ J( r- H/ g
每个通道都有相应的触发电路,注入通道的触发电路为注入组,规则通道的触发电路为规则组
' l2 I' w( }9 P0 F* j' s' D7 x- b1 g  B" ?4 A+ J
使用控制寄存器启动时,为ADON位写1开始转换,写0停止转换。
! l' A1 A1 `  M. x6 B5 w使用外部事件来触发转换,这个触发包括内部定时器触发和外部IO触发。* Q2 l9 a, W: c$ q
( U5 o' F" \+ H4 I: N  M
触发源的选择由ADC_CFGR的EXTSEL[3:0]和ADC_JSQR的JEXTSEL[3:0]位来控制,EXTSEL[3:0]用于规则通道的触发源,1 T' g3 Q  O9 u
JEXTSEL[3:0]用于选择注入通道的触发源。选择好触发源后,控制EXTTRIG和JEXTTRIG这两位来激活触发源  G1 c% ?$ w' F5 t* m
9 B1 ^# T- p5 o; }# r0 i$ j
转换时序图: ADC在开始精确转换之前需要一段稳定时间tSTAB。ADC开始转换并经过15个时钟周期后**,EOC标志置1,转换结果存放在16位ADC数据寄存器中。**& w; S7 a+ ^+ ~9 ?2 v3 e

) a/ [! [' Q- m* ?# \2 S) I) h0 T* E 9][_}OR]FCJ_NP8BYO@0A85.png 7 _& A6 u( K! P9 P

* a9 T, ^( l4 e' F+ p. ~ADC必须在时钟ADC_CLK的控制下才能进行A/D转换,ADC_CLK的值是由时钟控制器控制, 可以选择同步时钟也可以选择异步时钟线。时钟控制器为ADC时钟提供了一个专用的可编程预分频器,默认的分频值为2
3 B  C% S+ e" z9 g3 z" [5 S$ z" A- T7 |* R
采样时间和转换时间:由ADC_SMPR1和ADC_SMPR2的SMP[2:0]设置,每个通道可以设置不同的时间采样,采样的周期最小是3个周期(1/ADC_CLK),TCONV=采样时间+12周期$ V. E# G# N. ^# S7 O  X& W

. i7 n  _$ m( I! x3 P当ADC_CLK=30Mhz,ADC为3的周期,那么,总的转换时间为:TCONCV = 3+12 = 15个周期(0.5us)
! \% @( f, |2 a  x
: I7 _- x; ?4 s) g3 }; c当数据转换完成,数据将会以对齐方式(左/右)存入相应的寄存器6 _2 C, {( O- J1 a
每个通道也有相应的转换结果寄存器,分别称为规则通道数据寄存器和注入通道数据寄存器
& a* D( J+ }- j9 i% w
, i% `6 e# {* H, F但是,规则通道数据寄存器只有一组,所以存储进去,CPU必须马上读取,一般使用DMA处理;
% t' O, S) E: v1 s3 M5 J/ r' J9 S' ~1 s# c
通常,对于多个规则通道的转换,每次转换完一个数据,需要发出中断请求,CPU读取信息,但是如果转换数据量特别的时候,给CPU带来负担,有可能还没读走就转换了新的数据。
( g+ i, ?5 i' D, ^( Z
$ E) A# a3 y: p  ?  Q在使能DMA模式的情况下,每完成规则通道组中的一个通道转换后,都会生成一个DMA请求。这样便可将转换的数据从ADC_DR寄存器传输到用软件选择的目标位置。摆脱对CPU的依赖。
) d5 p' u8 g8 z
- r. U& S+ h. @3 p) C注入通道数据寄存器可以存4组数据,最后一次读取。
# b0 L' C! @/ e5 {  K- \8 S) a) r/ n! ?. c8 v
模拟看门狗:用于监控高低电压阈值,可作用于一个、多个或全部转换通道,当检测到的电压低于或高于设定电压阈值时,可以产生中断" J" w1 c5 }4 z! v. p/ Z
5 g& O5 R6 L+ k) v2 A. Y% [
GIS}YZFIJCOH3(7L6`2MPCI.png , E$ N7 [% C9 A; H3 y9 O

) F3 g. M, x7 n  w" p如果ADC转换的模拟电压低于阈值下限或高于阈值上限,则AWD模拟看门狗状态位会置1。
# K; g) u5 T  g6 B! V5 q1 K1 {; l7 I* o
可以使用ADC_IER寄存器中的AWDIE位使能中断
/ g: e# Y3 e+ ?0 z; }7 r9 I
7 V6 {5 p* p3 @/ x! b 0CG9))B6VK@7SYI[EI73DYG.png 0 J4 X2 _) m7 ], t# F& a
' e9 _9 I" O4 A4 {
有4种情况可以产生中断,即规则组转换结束、注入组转换结束和模拟看门狗事件与溢出事件。ADC1和ADC2的中断映射在同一个中断向量上
8 ~2 g& o3 a, Q% l  L
' S7 N! |5 O  [3 U0 A5 B$ \二、ADC工作模式
& k7 K. o1 F3 u2 w( ^1.单次转换模式

' r; e  v2 f! z+ v在单次转换模式下,ADC执行一次转换。ADC_CFGRD的CCONT位为0时,可通过以下方式启动此模式:# ?. z7 h2 Z3 s, U3 X: j( S

1 S* y$ g8 M, Y4 p2 m将ADC_CR寄存器中的ADSTART位置1(仅适用于规则通道); C; c' G: z2 Q8 L2 N! x( \0 b
将JADSTART位置1(适用于注入通道). P3 y9 F* w( |" s
外部触发(适用于规则通道或注入通道)
8 ^  w/ L! l' k8 n6 C$ p# W/ i  M, ^5 H+ {" O# P4 T
完成所选通道的转换之后:
! L* e: @# V6 t9 H9 a* \1 D  _如果转换了规则通道:
; L# Q# i1 \9 v  ?( {, R# P
2 M. r7 ~3 a5 G* T+ Q转换数据存储在16位ADC_DR寄存器中
/ T  l5 d/ E$ l% FEOC(转换结束)标志置1
7 F) ?# X3 H# Q6 n; V! J" qEOCIE位置1时将产生中断
( s$ |/ |6 a) l6 W) X2 O+ |
& ]. Y' q0 M1 C8 }/ c如果转换了注入通道:
! S  b2 V6 }  P
% J  F0 u% C, `3 a) V( ~: Y转换数据存储在16位ADC_JDRy寄存器中. ~. w( w2 k4 d
JEOC(注入转换结束)标志置10 N) i$ e# R& _) L" E
JEOCIE 位置1时将产生中断7 o+ q' i) j5 |) N' {: }

! o& J5 C+ ?3 J' r然后,ADC停止。9 |$ W$ w$ h3 a% |$ A

4 m: t* h8 n& \( ~1 W& z2.不连续采样模式, `, |, c! c$ }$ e9 o% m
触发一次,n个连续转换,按照规则通道顺序- g* ?/ ?# m1 T& @, C# W/ S, n
/ j6 q& M- j8 l! j7 |2 Z- j
n=3,要转换的通道=0、1、2、3、6、7、9、10(L[3:0]=8)
0 W( E$ b$ z" I* W) Q$ G' p* m- l; f第1次触发:转换序列0、1、2
& U2 ~, W" W! F7 B3 j! q4 {  }0 J' z第2次触发:转换序列3、6、7
& O$ N) s4 {; l* \" Y第3次触发:转换序列9、10并生成EOC事件
! n& C$ L+ T- ^2 W/ ]第4次触发:转换序列0、1、2
+ ?7 M5 o5 W: L. c2 P- j…
! h# d% k  O+ U# c, n8 o  y/ n: z7 J/ A" z) G
3.常规扫描模式(连续采样)
0 T) V5 a; J" Z0 T3 e+ o连续转换模式下,ADC结束一个转换后立即启动一个新的转换。ADC_CFGRD的CONT位为1时,可通过外部触发或将ADC_CR寄存器中的ADC_DR位置1来启动此模式(仅适用于规则通道)。1 d; w0 |$ I1 [$ n3 z$ N

" N' R7 [2 M2 G9 ~* F, D7 g (2KCDM2$I_F2%NJW5[)D`UT.png
; i! z: S. B2 V2 B" ?0 Q& N# f3 v  P' [% p; c7 ^
每次转换之后,如果转换了规则通道组:+ h2 p2 X( Q8 S* k) b

3 e. ?9 ]. E* x- \) t, L/ ^+ k1 v' U上次转换的数据存储在16位ADC_DR寄存器中
, G9 w) W1 C! a9 B+ N( O& z6 CEOC(转换结束)标志置18 \6 B7 u; o5 {% x6 H! j
EOCIE位置1时将产生中断
* }" V5 Y& c, }  v0 Z
6 T, O) o# A  R( p3 r5 j注意:无法连续转换注入通道。连续模式下唯一的例外情况是,注入通道配置为在规则通道之后自动转换(使用JAUTO位)。+ V5 E7 O' ~- D+ t. h/ _

0 p( v3 f% a) X. {1 T4.注入转换扫描模式
6 E- A$ b: B* a8 }* o  u& ~7 N触发注入:在规则通道组转换期间出现外部注入,则当前的转换会复位,并且注入通道序列会切换为单次扫描模式。然后,规则通道组的规则转换会从上次中断的规则转换处恢复。
0 b( @" ?: k8 o
; Y0 h) A) Z$ U$ e, X7 [/ j如果在注入转换期间出现规则事件,注入转换不会中断,但在注入序列结束时会执行规则序列。* `, K9 `# z- f% s! V* T) _9 j

, H, K( p2 s; ~* k6 i' l9 p `6WHDWTX7LW{US3S~)MJ`{6.png ) Q2 ]3 [1 R, S* x5 o

- b4 h; c8 V5 L; H4 d+ \, ^7 y: J, h自动注入:注入组中的通道会在规则组通道之后自动转换。这可用于转换最多由20个转换构成的序列4 C8 E; |1 q, c- e

! \1 w& w0 p% }2 q/ t5.多重ADC同时模式
( C& _( h5 `; f, }3 h一次触发,多个ADC同时转换通道数据  q. x+ i% l  o2 R  p$ j6 y  t
! \$ z  B; I) m
A73ZO~JMZ[$A@MIN1V$IH7B.png + s- i* x; H  N
* B. h0 N( e$ U4 A2 H
在具有两个或更多ADC的器件中,可使用双重(具有两个ADC)和三重(具有三个ADC)ADC模式。多重ADC模式主要解决的问题是:在保证高精度下,提高采样率。
: p* m9 [* E: [' r2 F- R
, W% W6 @, E9 x' `/ `: T" y- D: y* r6.多重ADC交替模式, {: w  l1 O) G' p& J, A; q: q
两个或者三个ADC交替对一个通道采样
3 b' `  n, Q  {2 k+ ]1 a4 U1 F, F8 l* u' ~
BNNPK`527A29C%U]D69)TP4.png
5 C# [2 x! h" L" f1 J
. S3 E3 U6 [: R4 F2 j1 R& a. L3 z7.多重ADC交替触发模式2 i  ?0 z1 s& m; z' |0 v
双重ADC模式:% ]1 c& B4 e0 R( B$ r" @* ]% ]5 ~
发生第一次触发时,将转换 ADC1 中注入组的所有通道
9 o7 v8 ~7 ^* e8 N发生第二次触发时,将转换 ADC2 中注入组的所有通道0 S" f. T( ~3 _3 X& @- ~
以此类推
4 }2 C( D; [9 i
; B2 y  w- P4 K# F- X IGSL6]6W9S)J@SL~LH_4S.png / C8 n' Q) n: T& }" L$ G( M' u2 _; O
) \+ `9 z0 T, G# G% b  f
三、ADC配置(STM32CubeMX)
: }6 ^7 O% n6 bG4原理图
5 W& ]0 |; l! e3 W/ E; u4 G. w: o! o. v& p; B0 X9 ?
`%HFT}R@RB$[LI7(VU7W)1M.png
' {7 L6 ~8 a; z1 v5 w
* C% Z; n2 \5 W/ X$ `! I$ T. e; p 92893f879f694a41a479715f5a3809d3.png 2 T, L+ l5 e" F+ i+ o! _# Q$ z

/ K  X7 g" G' {1 }7 C! D将PB15,PB12配置成ADC2的IN15,ADC1IN11通道7 w. ~: m4 Q& ]7 n$ \

" [* [+ P5 P: t/ O/ w 79L(3H(}EH{UUEBFBPA[E5R.png
' `4 ~# R( v% S& S+ y( k" B1 I' P  y6 d7 Q
使能ADC2的通道15
1 a# b: o, f  D& O: e! O& p& }: P' U2 }" l& Z
)P7}@%V4S`WD}MVQ3[7K49G.png 6 t0 F" I$ L1 c- x$ r8 l1 K

! t+ I. \% b7 M6 I  v/ H/ [配置ADC的参数
5 i: M  e  i) l; [- I0 V; m) y2 H1 I# r1 Z; w
  X4 c- [' d9 t' `5 h I7U]M)PNS)CGU({HD8JAK2X.png
. T- F0 h6 K8 r2 U4 j! g) a0 b* j0 f5 H/ ~- u& s  x0 A+ B
MJY~9)K(}8O}0Z0I(XJG$D9.png 3 w3 J) q6 N0 N" N8 V

0 {" x; A1 n; U# Z% w' a  q 195993a0e9fd41feb2bb1fb4b158e1cd.png
# D. P5 G3 o9 y" j% H
, W! L! ~) [( n1 ?' j6 F  PADC时钟的选择
, v4 Z4 E  D/ S( K
  ^, I- J. e5 W0 e7 m/ ^# Z {2TC$O39_HDZU[WC3IGS{HF.png ' C% r5 \- j% i( G4 ]4 J- A* W

- y  \* {2 o0 I9 U2 K- k若没有使用DMA,上面的ADC差不多配置完了: }* b0 k. k3 {( W; m
2 r0 ^8 z, n: [
四、部分程序
! s& s$ u$ {2 k9 D3 ^# B9 SSTM32CubeMX会配置好ADC的初始化,我们只要写ADC的采样函数即可
0 _# P; T$ ?0 i$ h. C. A& _  i. T. g8 c调用HAL函数即可,HAL_ADC_GetValue()得到返回值。注意,在调用该函数之前一定要初始化adc的句柄。6 E* s- o) M: S# i* b9 d* l: ?* Z; P

8 r- k. l2 y7 x" ~' |' ?' |/ D
  1. uint16_t getADC1(void)
    % u/ K3 F+ M* p  L5 n" q
  2. {
    . R1 Q( }, h9 p0 `' J  p
  3.         uint16_t adc = 0;' r+ p$ g+ o9 B% `
  4.         HAL_ADC_Start(&hadc1);
    5 C8 G( S/ N  Y5 A) x2 {# P* Y
  5.         adc = HAL_ADC_GetValue(&hadc1);+ ^  E8 z& w# M. H2 W/ l6 V9 p
  6.         return adc;4 A% Q6 z- a4 D" V* ~/ ]
  7. }
复制代码
) N) U. J9 n% ^% o4 r

, b3 t$ v5 }; F& y; s$ v- h; j3 q

6 R" E' z' Q# }. F( d. @+ [, Q# U( `/ x: r- l
赞 收藏 评论0 发布时间:2022-7-5 22:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版