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

【经验分享】STM32G4之ADC

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:09
一、ADC原理1 f* G# W: R" n" u
STM32G431内部集成2个有最高12位ADC(ADC1、ADC2),它们是逐次逼近型模数转换器
" Y8 C# S4 D& k2 i
: G% t) L  m1 k0 M9 ~ADC功能结构图
& {) [* [: s% P# y& o) p" j8 r; J' _
LB6`_33L3(M@8PSEPZ)@_%D.png & [5 C/ P1 i+ U& P- \

( d. T* z8 m5 e+ x& s主要特性:% G. O* {, C! r7 ~
1.可配置的转换精度:6位,8位,10位,12位0 t# s4 ]3 ]. S- C% I

" b- }  y& e% [* q$ Z若精度为12位 : 3.3/ 212=3.3/4096 ,一个单位对应这多的电压值( g* v! [# z( P* U/ y
, ~! o6 ?( l+ g- H4 u
2.转换电压范围: 0 ~ VREF+(一般接到3.3V电源,不能超过STM32芯片电源电压)
* c) x3 h, R4 A4 Z" ^# Z; _' j0 u2 l9 R* t
W62U$FCIWVTFVRJIBYBN.png
: M6 r  h& u# n" _* s" q$ k5 H
; i/ n4 I5 n. C  P4 o- u2 o/ |- z3.19个转换通道:16个外部通道(IO引脚) + 3个内部通道(温度传感器、内部电压参考、电池供电监测)
; L/ |$ ~1 f$ u
  n6 J. p) y; w( U* M$ r/ ~3 p- Z TLY9Z20(9}ED0Y4PNFH375O.png : \$ Y8 y7 E& _; L  R. C, Z# G

& _# E$ Q* i8 s+ g$ v: e  u4.采样时间可配置" N& w  P7 {9 c/ _% m" ]7 [
2 W# g0 T5 D- v; ~; w2 L# ^' x
5.扫描方向可配置
: D& s/ A! q9 J" G6 }3 l" W
2 h! t/ a" u: C: P" j% X4 g; R6.多种转换模式:单次,连续
6 d4 H$ |: F: W6 D$ M6 K
! i+ e, j& c3 k, |& z5 [7.数据存放对齐方式可配置:左对齐,右对齐(ADC的结果存储在一个左对齐或右对齐的 16 位数据寄存器中)
9 T. x# N3 H" ?# S2 i' x: y* F+ _. o/ u( L
8.启动转换方式可配置:软件触发,硬件触发
5 M) {8 R7 T& f/ f9 A& L5 O8 W, a8 y2 U. p2 a
9.可设置上下门限的模拟看门狗
$ E6 L4 X2 @8 I
& u$ U$ |5 r* X% c10.DMA功能" E3 F+ b7 A9 y; ~# @2 K
4 G: i  k, y& b; e5 p: F
11.在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断$ [9 H) B/ G5 v. T

8 {  i! P) u$ u+ G& q7 K! c( q0 O% u通道和转换顺序
/ k& w; Z- p& @; B! X规则通道:规规矩矩按照顺序来转换,平时用到的就是这类通道.# g0 D! o9 F( O4 J3 `+ w" x# Y
E]{]Z84)4WUK[0$%)1U4KKS.png
8 W1 u7 n. {" v
- j* K# @2 Y  q* x2 PADC_SQR1控制转换的顺序和数量(L[3:0])
% K4 R) z" ]' F+ r1 [" ^" d9 z1 ^& k  ~
注入通道: 注入可以理解为插队。它是一种在规则通道转换的时候强行插入要转换的一种。这点和中断有点像,当规则通道转换中,有注入通道插队,那么得先转换注入通道的,然后才倒回来转换规则通道
" |4 R' D- ]+ M, l5 A% R* Z- X0 M3 \. J" r  w
ZANGT_IW3IQSBM385PAP{S0.png
! [3 K) E2 t. S# G' |
6 K( K0 b9 I, @6 \每个通道都有相应的触发电路,注入通道的触发电路为注入组,规则通道的触发电路为规则组& q' s7 W" Z% G/ B( c: q! M
9 p9 ^3 s; p* H5 \) O: c
使用控制寄存器启动时,为ADON位写1开始转换,写0停止转换。6 o" ?: m. L$ K9 c2 A
使用外部事件来触发转换,这个触发包括内部定时器触发和外部IO触发。
& z$ g8 Q+ m  ?: R
9 l$ U3 \' i9 q- v# U+ G3 b" U+ L触发源的选择由ADC_CFGR的EXTSEL[3:0]和ADC_JSQR的JEXTSEL[3:0]位来控制,EXTSEL[3:0]用于规则通道的触发源,
+ |0 W5 z9 L/ \+ d8 N- _8 H8 t5 D0 lJEXTSEL[3:0]用于选择注入通道的触发源。选择好触发源后,控制EXTTRIG和JEXTTRIG这两位来激活触发源
1 E& G$ ?1 a- l3 x0 G  Z5 s6 A6 s/ ?4 y0 |5 E' n4 n7 }
转换时序图: ADC在开始精确转换之前需要一段稳定时间tSTAB。ADC开始转换并经过15个时钟周期后**,EOC标志置1,转换结果存放在16位ADC数据寄存器中。**
7 F/ u8 Y: J0 Z; Q! b
' J( ~& ~8 J% a: A4 d3 b0 Z/ u 9][_}OR]FCJ_NP8BYO@0A85.png
* ]% A. F9 H% l
5 W2 u3 _. z' y6 o/ c2 b6 Z, |: xADC必须在时钟ADC_CLK的控制下才能进行A/D转换,ADC_CLK的值是由时钟控制器控制, 可以选择同步时钟也可以选择异步时钟线。时钟控制器为ADC时钟提供了一个专用的可编程预分频器,默认的分频值为23 Y4 @3 b. v  v+ m& ~0 H

) x4 C: n. c8 \1 b6 ?采样时间和转换时间:由ADC_SMPR1和ADC_SMPR2的SMP[2:0]设置,每个通道可以设置不同的时间采样,采样的周期最小是3个周期(1/ADC_CLK),TCONV=采样时间+12周期6 u4 n- f/ y' C6 y* T
/ s9 x& x; }( \4 `- o- E
当ADC_CLK=30Mhz,ADC为3的周期,那么,总的转换时间为:TCONCV = 3+12 = 15个周期(0.5us). m  G3 C$ G. {' @, l& ^* g
4 Z' {) x' B& Q8 D/ ^4 K( e' ^  Y
当数据转换完成,数据将会以对齐方式(左/右)存入相应的寄存器& F5 [& R% Y& S' l' z4 U& N1 `
每个通道也有相应的转换结果寄存器,分别称为规则通道数据寄存器和注入通道数据寄存器& C9 |" f, b8 h/ f% a

- d2 `, z, o% _* F& @: K$ [- ^但是,规则通道数据寄存器只有一组,所以存储进去,CPU必须马上读取,一般使用DMA处理;7 `" W! z0 s8 ]- y) U

* E* J7 X! G: l6 a1 w! [# m' U通常,对于多个规则通道的转换,每次转换完一个数据,需要发出中断请求,CPU读取信息,但是如果转换数据量特别的时候,给CPU带来负担,有可能还没读走就转换了新的数据。
4 z) d" I) S# B) ^1 c
3 K0 M& N2 L; S% o在使能DMA模式的情况下,每完成规则通道组中的一个通道转换后,都会生成一个DMA请求。这样便可将转换的数据从ADC_DR寄存器传输到用软件选择的目标位置。摆脱对CPU的依赖。
0 o3 W/ r8 G* `6 _9 |! y
8 z" E5 K- Q. I0 ?注入通道数据寄存器可以存4组数据,最后一次读取。
' z! N2 h6 K" G  j5 M0 o5 Q1 g" {* p. i4 V! A/ y/ s# |% L  t
模拟看门狗:用于监控高低电压阈值,可作用于一个、多个或全部转换通道,当检测到的电压低于或高于设定电压阈值时,可以产生中断
3 _# e2 I7 D0 z( s: u( [" u+ G7 v* o$ C) J+ ]" k7 p
GIS}YZFIJCOH3(7L6`2MPCI.png 3 ^2 @( `. s8 l: y0 h
& P9 I# K. c' W+ a; H% p7 _
如果ADC转换的模拟电压低于阈值下限或高于阈值上限,则AWD模拟看门狗状态位会置1。
3 S; U" e. v/ ]9 `7 p8 M5 W& ]! J% H& i/ ~" d* d+ x; u0 u. G
可以使用ADC_IER寄存器中的AWDIE位使能中断+ e! j0 G3 |8 {# [8 a% k- Z

4 b5 z' c& _, g' R: U 0CG9))B6VK@7SYI[EI73DYG.png * \2 Y! J! ]  i; ?
/ _) @2 z: B4 ]( T
有4种情况可以产生中断,即规则组转换结束、注入组转换结束和模拟看门狗事件与溢出事件。ADC1和ADC2的中断映射在同一个中断向量上
$ S) l5 T2 [7 R; l  s  G4 O& o, L5 Y# j. C# M- ?; P
二、ADC工作模式: f% n" C& q. n) r5 w6 L
1.单次转换模式

8 L: b. ?& o2 D0 \0 z) c在单次转换模式下,ADC执行一次转换。ADC_CFGRD的CCONT位为0时,可通过以下方式启动此模式:% c& x$ _- n- e2 E& x. l; D/ \8 `
' j+ a) a# T# s
将ADC_CR寄存器中的ADSTART位置1(仅适用于规则通道)& w  E9 c5 |2 V
将JADSTART位置1(适用于注入通道)1 ?$ o7 N- I0 M/ \$ s
外部触发(适用于规则通道或注入通道)
/ _: s" E! n* S: f* l# \3 ^2 ]5 ?
完成所选通道的转换之后:
/ s' u; M+ ?  l! l- S% L" [% ]如果转换了规则通道:8 Q$ b4 j; t8 d2 H1 s  X

' s( E5 N6 u0 u' j转换数据存储在16位ADC_DR寄存器中! u7 h" ]: N  f6 a+ B
EOC(转换结束)标志置1& w+ [8 p' w* i1 ]
EOCIE位置1时将产生中断3 D- O' Z' C% T
  w( F0 }. ?/ o" W
如果转换了注入通道:5 _3 J$ ]: X' @9 A  F. ?% Q$ F

0 B, `4 T( _+ f7 i1 t转换数据存储在16位ADC_JDRy寄存器中, ^! D( W% P# s3 \" r. C% W
JEOC(注入转换结束)标志置1+ d% a% U* U4 W# J6 r! n9 ^/ _
JEOCIE 位置1时将产生中断
+ G. ]! ]  I9 r+ U! b. Y) k8 P# A- H. `% a1 S5 D$ F
然后,ADC停止。  X* M: c0 X) u3 _' q
$ a: s' A2 b5 l) l
2.不连续采样模式9 }# t) ?7 T1 r  r& E
触发一次,n个连续转换,按照规则通道顺序6 F) C% N+ S# t- d0 {& F1 ~( [
1 r+ G3 G( f8 D* n! Y/ _
n=3,要转换的通道=0、1、2、3、6、7、9、10(L[3:0]=8)
0 j8 ?! j4 X5 y2 c, [第1次触发:转换序列0、1、2
" h5 X: @+ T: [( ^' v第2次触发:转换序列3、6、7
$ z: m( r% g) {2 u% t8 `: d4 B5 w第3次触发:转换序列9、10并生成EOC事件
* E, l: P3 |8 [+ \& J* ~第4次触发:转换序列0、1、2
. r" e3 K; K) e0 [, s" ~+ […- p4 Y- @1 M: t9 n6 L

! U1 D2 K# N: z4 }- D0 n8 g  t- n3 A3.常规扫描模式(连续采样)
' t& L6 ?5 b6 E  C3 b3 |; \连续转换模式下,ADC结束一个转换后立即启动一个新的转换。ADC_CFGRD的CONT位为1时,可通过外部触发或将ADC_CR寄存器中的ADC_DR位置1来启动此模式(仅适用于规则通道)。
. C" K" l; L; M- ?7 r& ~# g# E- P1 R9 q% p$ ]
(2KCDM2$I_F2%NJW5[)D`UT.png 9 q# d5 M) z4 \5 g- m" O
1 y4 z4 M8 Q; D
每次转换之后,如果转换了规则通道组:
* n! t2 c! L3 M7 p  G+ _3 c. `  C4 @4 {2 L6 W  g
上次转换的数据存储在16位ADC_DR寄存器中
; p: D6 m! m  z$ N9 }: p1 K( zEOC(转换结束)标志置1) G) a- M+ \; J( w1 b
EOCIE位置1时将产生中断+ i/ O, C8 Q: o6 N
/ Z1 H1 V: ^& m
注意:无法连续转换注入通道。连续模式下唯一的例外情况是,注入通道配置为在规则通道之后自动转换(使用JAUTO位)。
, E8 b+ K2 L+ W* q' W1 O/ d8 h8 C+ X
' d2 c, `) j, ?4.注入转换扫描模式
5 Y1 B: y6 ]# m7 V2 f* F# C触发注入:在规则通道组转换期间出现外部注入,则当前的转换会复位,并且注入通道序列会切换为单次扫描模式。然后,规则通道组的规则转换会从上次中断的规则转换处恢复。
. K  j2 I4 s. J: e3 g1 v, I3 B! J; Z3 m% `% Y2 U& J0 |, c
如果在注入转换期间出现规则事件,注入转换不会中断,但在注入序列结束时会执行规则序列。9 A6 Q7 U2 p% l5 Q9 u

/ D. s5 g: y, y% W8 [ `6WHDWTX7LW{US3S~)MJ`{6.png 9 R7 ?9 d' X3 B
- \! K5 _$ p4 r7 O: ^. \! ~7 J
自动注入:注入组中的通道会在规则组通道之后自动转换。这可用于转换最多由20个转换构成的序列( L0 m7 J& ?5 s2 G
8 s, ^7 |% a2 @2 A
5.多重ADC同时模式, n& A" j" b* S" ?1 `6 q$ m: c+ }. r0 r
一次触发,多个ADC同时转换通道数据2 Z4 p7 p/ g, O! H1 C  b
6 W# s. h( k6 |2 L  d8 B' b; g+ K
A73ZO~JMZ[$A@MIN1V$IH7B.png 1 \' e! J% G( `4 g/ E5 x) p$ F
9 J- W4 [& V' g
在具有两个或更多ADC的器件中,可使用双重(具有两个ADC)和三重(具有三个ADC)ADC模式。多重ADC模式主要解决的问题是:在保证高精度下,提高采样率。/ K/ b* Y9 d  l6 c
: ?% N5 }; H0 ]* g" w! W
6.多重ADC交替模式
1 ^, G7 m2 R& P8 d# w2 T两个或者三个ADC交替对一个通道采样
4 S5 Z6 e! G- _5 M  G
6 _8 {1 D9 y- ^ BNNPK`527A29C%U]D69)TP4.png
( l  ~1 w, `6 D# |2 u9 M) R; w
, ~; y$ n2 P% M7.多重ADC交替触发模式
/ j& k1 R! {. ~/ f% \双重ADC模式:
( `% P) H2 F1 I; y5 F3 w0 {3 N发生第一次触发时,将转换 ADC1 中注入组的所有通道' \1 y& P0 ]+ n
发生第二次触发时,将转换 ADC2 中注入组的所有通道! f4 P" j# p! b- K5 H0 B
以此类推& q* b8 q+ A& ~  _

+ G+ j1 G$ Z% l  ^1 D IGSL6]6W9S)J@SL~LH_4S.png . N& R; z6 j& _1 R
' a# Z' c9 t0 k- _" A$ A& D6 p
三、ADC配置(STM32CubeMX)
2 O0 D' S, S/ E' S' Z' R' b+ d. A9 ^G4原理图4 }) W. q! L0 l- y# o8 f) s/ ?

8 S" T  g# D/ M `%HFT}R@RB$[LI7(VU7W)1M.png - V& B" K. ^$ f  J
7 I3 H! X! j! u0 {2 Q
92893f879f694a41a479715f5a3809d3.png 8 f% B( C+ c7 D+ f( H
5 B3 m, h; |( R9 |# d6 `
将PB15,PB12配置成ADC2的IN15,ADC1IN11通道( k$ B4 m/ b4 ~. O6 y
, _+ A, ^+ d: T  E
79L(3H(}EH{UUEBFBPA[E5R.png & i8 d+ e) ]1 x

+ b: p. j- {4 I# }8 X2 I( r使能ADC2的通道158 o' _5 w5 P0 ?- Y. _* H
8 d, @. x& E. N2 |7 {6 t/ v' b
)P7}@%V4S`WD}MVQ3[7K49G.png 9 m$ I' r) X* F2 l1 T2 y3 q& j
. Y7 k, P; o3 D6 z8 L! k
配置ADC的参数8 w4 H, O5 x, V4 B
6 T! V6 @2 @2 I9 O! g9 J
I7U]M)PNS)CGU({HD8JAK2X.png
3 z6 O4 r' ~. R4 \) i, M/ h/ V+ Z4 @# e7 q! h' ?
MJY~9)K(}8O}0Z0I(XJG$D9.png
* D9 f4 G' g/ ^8 q. [/ ?5 Q0 k7 D+ C# M: ?& H% x0 c  R1 [
195993a0e9fd41feb2bb1fb4b158e1cd.png
. k1 }2 k/ o- ^' d7 M: _. L5 o  W8 o0 m1 Y* f+ E2 m. L, M# A
ADC时钟的选择
. W& t6 k8 z9 C$ A6 p3 w3 R' A# `, |0 _' f7 C
{2TC$O39_HDZU[WC3IGS{HF.png
& b" E' G( Z: Z4 {5 T- Y: F8 k! {; \) R$ J0 n* J
若没有使用DMA,上面的ADC差不多配置完了; F/ l1 @4 K6 M1 |4 T& y

7 K7 H+ O  A8 N四、部分程序6 }& y. y: q1 u5 O/ {0 v4 A/ A' X
STM32CubeMX会配置好ADC的初始化,我们只要写ADC的采样函数即可
0 c1 @9 c% s# w& E调用HAL函数即可,HAL_ADC_GetValue()得到返回值。注意,在调用该函数之前一定要初始化adc的句柄。
( O; H4 ~1 w( k) i8 B! L; z
0 ]+ v1 @; c7 K
  1. uint16_t getADC1(void): ]  R  ^7 D% t* P
  2. {# m0 j  I; ?3 L4 r# c
  3.         uint16_t adc = 0;& g. T  ^+ s+ l- h: {
  4.         HAL_ADC_Start(&hadc1);. ~4 C' ^5 F  Q- |6 W' a3 L1 A
  5.         adc = HAL_ADC_GetValue(&hadc1);
      d- L; M/ t( h7 h7 p9 y
  6.         return adc;
    : s8 u  ^; E; I1 j4 i3 Z( [
  7. }
复制代码
7 @. P' r* K8 `7 f
2 d' j: X2 c# u$ \
( f! z; `, j$ V

- E9 l6 u/ W1 l8 ?: w
8 @5 S( t* @7 \  D
赞 收藏 评论0 发布时间:2022-7-5 22:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

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