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

【经验分享】STM32G4之ADC

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:09
一、ADC原理
: N- c% T1 @% v1 C- M% Q7 ^3 sSTM32G431内部集成2个有最高12位ADC(ADC1、ADC2),它们是逐次逼近型模数转换器
7 b3 w4 s& X% o  q$ q, j; P* u: |4 Q+ {8 e) a# e
ADC功能结构图. W- O9 s+ T5 ~( P9 v
& H3 ~7 x5 X+ R
LB6`_33L3(M@8PSEPZ)@_%D.png
9 A, P1 J! o' w. A1 v  a* e8 Q# u) _# d
主要特性:  r( J% @1 t5 H4 i4 d& F7 P4 y
1.可配置的转换精度:6位,8位,10位,12位
' `! v8 ^; h2 ~. x2 s# c
3 r9 p9 J% W+ w& `' b6 F) l( W若精度为12位 : 3.3/ 212=3.3/4096 ,一个单位对应这多的电压值9 L( a8 {- _: ?; r, ~
% y" `" r8 a/ y7 n$ n- A9 b
2.转换电压范围: 0 ~ VREF+(一般接到3.3V电源,不能超过STM32芯片电源电压)+ N; l1 e; b) r) j) K+ N9 l
  B5 G1 m5 w: ?2 g' J
W62U$FCIWVTFVRJIBYBN.png
2 Q$ g+ M; `( o# J6 c- o7 t1 f/ N: Z8 S( z
3.19个转换通道:16个外部通道(IO引脚) + 3个内部通道(温度传感器、内部电压参考、电池供电监测). K) J8 V$ \7 f2 P, d7 V
; Q: Z+ @! l- b% n' k6 X8 M" S
TLY9Z20(9}ED0Y4PNFH375O.png
3 {: t) }( P  |- e4 {  ]8 o, M, H- ?
4.采样时间可配置
" Y$ }) }2 ~% ~3 o' A. Y  F* \5 O& q& G$ M
5.扫描方向可配置
; E+ W0 w7 n0 k+ B. p% E/ M
; l9 ]6 x& k; J, p0 ?$ D8 o' `" {6.多种转换模式:单次,连续
* e8 q7 q$ w1 s2 o% S& S# y2 C6 L7 e' e1 t: U' P# R! y2 H2 v
7.数据存放对齐方式可配置:左对齐,右对齐(ADC的结果存储在一个左对齐或右对齐的 16 位数据寄存器中)
& I1 t* z4 O0 q( \1 ~% s8 I5 Q1 I2 \- c* ]: Z) W
8.启动转换方式可配置:软件触发,硬件触发
4 v  \3 ~3 R4 c8 W$ k2 l+ F5 E8 @' i6 e+ u' v$ U5 U& Z& P3 b0 w7 ]! Y
9.可设置上下门限的模拟看门狗0 f" b# g. N# p; k
. m4 d) J. D" o
10.DMA功能
. r) i- q( U- f2 Q/ \4 ?3 n  @. C% _/ Z$ W1 D  S3 L5 L$ z
11.在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断) h% e; U0 l3 ^' R( k7 w

# {) E8 |9 u" C  I& A$ t通道和转换顺序
! v7 {6 h- j: A* u规则通道:规规矩矩按照顺序来转换,平时用到的就是这类通道.
$ S& D7 ?0 u8 `& I1 N" L E]{]Z84)4WUK[0$%)1U4KKS.png
1 _0 T. b1 {! b2 ~6 y4 w' f7 x+ m  F
ADC_SQR1控制转换的顺序和数量(L[3:0])
/ b: {- y& X) Z0 B& P4 `6 v; |! s  P5 t. l# N. y% u9 l* o
注入通道: 注入可以理解为插队。它是一种在规则通道转换的时候强行插入要转换的一种。这点和中断有点像,当规则通道转换中,有注入通道插队,那么得先转换注入通道的,然后才倒回来转换规则通道
/ S! d/ X( E+ ~  i4 ]4 E9 H
( Z; B' o/ U0 X* D/ z; E ZANGT_IW3IQSBM385PAP{S0.png & o$ ~5 ~# F! M; u+ E% t

1 i! u8 K* ~: N每个通道都有相应的触发电路,注入通道的触发电路为注入组,规则通道的触发电路为规则组  P2 h% u: T) Y3 Z) r4 G

  |8 P* C. J! K* E. N7 E5 _使用控制寄存器启动时,为ADON位写1开始转换,写0停止转换。
# }& k4 E  [* B使用外部事件来触发转换,这个触发包括内部定时器触发和外部IO触发。% b9 {" T/ B6 S
0 B8 m. g2 ?, z! C" ~) J. v9 M& v/ s
触发源的选择由ADC_CFGR的EXTSEL[3:0]和ADC_JSQR的JEXTSEL[3:0]位来控制,EXTSEL[3:0]用于规则通道的触发源,
6 ?+ d) A( ^5 f1 t' TJEXTSEL[3:0]用于选择注入通道的触发源。选择好触发源后,控制EXTTRIG和JEXTTRIG这两位来激活触发源% J/ x7 N0 t- m! E. q9 j5 Q

  a3 o7 b/ [- W4 z6 K' K转换时序图: ADC在开始精确转换之前需要一段稳定时间tSTAB。ADC开始转换并经过15个时钟周期后**,EOC标志置1,转换结果存放在16位ADC数据寄存器中。**! y, ~# x8 ?, j4 z8 m- e$ x; ^8 \

; s& V) ?9 [* V3 [. _# g4 B 9][_}OR]FCJ_NP8BYO@0A85.png
' P. P" M+ o6 y( z; U$ d  x- z4 ^) i2 Z9 |% `3 l  M
ADC必须在时钟ADC_CLK的控制下才能进行A/D转换,ADC_CLK的值是由时钟控制器控制, 可以选择同步时钟也可以选择异步时钟线。时钟控制器为ADC时钟提供了一个专用的可编程预分频器,默认的分频值为23 n& a, p. P: G$ u, [0 v9 q* B
$ L5 B! b; r* j) \8 a
采样时间和转换时间:由ADC_SMPR1和ADC_SMPR2的SMP[2:0]设置,每个通道可以设置不同的时间采样,采样的周期最小是3个周期(1/ADC_CLK),TCONV=采样时间+12周期
& e! X9 z. j' |2 i- d+ Z5 l2 |' n; I8 f1 x
当ADC_CLK=30Mhz,ADC为3的周期,那么,总的转换时间为:TCONCV = 3+12 = 15个周期(0.5us)5 W$ U( `9 O. i: p
* O' Y5 H" x* K2 y9 l
当数据转换完成,数据将会以对齐方式(左/右)存入相应的寄存器& F8 k4 z* o' o7 _( i
每个通道也有相应的转换结果寄存器,分别称为规则通道数据寄存器和注入通道数据寄存器
1 x. R! z5 g6 p: P9 ]$ I- W; A" Y3 ^6 [0 Y/ ^6 @$ d- f% Y
但是,规则通道数据寄存器只有一组,所以存储进去,CPU必须马上读取,一般使用DMA处理;" q: h8 s) S5 g& \7 b- B7 O9 G0 L( k

! D8 V$ Q! `  `. M通常,对于多个规则通道的转换,每次转换完一个数据,需要发出中断请求,CPU读取信息,但是如果转换数据量特别的时候,给CPU带来负担,有可能还没读走就转换了新的数据。# p4 j; {7 w1 C- M' {
! c! U: c: C$ i2 [1 H: [8 I; J
在使能DMA模式的情况下,每完成规则通道组中的一个通道转换后,都会生成一个DMA请求。这样便可将转换的数据从ADC_DR寄存器传输到用软件选择的目标位置。摆脱对CPU的依赖。- Z( o' V) g1 J6 j

( h1 V5 q* x1 {7 K注入通道数据寄存器可以存4组数据,最后一次读取。
  z/ p2 w* v# ~( R0 X: Y: @9 s( x" Q. j0 j2 n7 F; S& V" Z/ t
模拟看门狗:用于监控高低电压阈值,可作用于一个、多个或全部转换通道,当检测到的电压低于或高于设定电压阈值时,可以产生中断
& ]. \8 q+ h3 g: O& A' [
2 y8 ]% ]5 g: H' O7 O# R GIS}YZFIJCOH3(7L6`2MPCI.png
* Z2 M; L5 G$ G8 C5 ?/ J5 O
+ y! W4 V; x. I/ q$ J# ]如果ADC转换的模拟电压低于阈值下限或高于阈值上限,则AWD模拟看门狗状态位会置1。$ x" |: v  e: R

8 v0 I% x0 T+ {; l可以使用ADC_IER寄存器中的AWDIE位使能中断7 k9 |/ p8 C( I1 z
. O8 k, r+ e1 i
0CG9))B6VK@7SYI[EI73DYG.png
$ p/ r" |6 S2 s# f) y; Z0 D2 H
' V1 X, x! f& W有4种情况可以产生中断,即规则组转换结束、注入组转换结束和模拟看门狗事件与溢出事件。ADC1和ADC2的中断映射在同一个中断向量上
- {+ H# z8 K& X" F( X3 U7 X% j
; S! a: h: V, T二、ADC工作模式
: k: s1 J( T) b: t2 L1.单次转换模式
! _) s6 o: @9 V7 d: Y- g
在单次转换模式下,ADC执行一次转换。ADC_CFGRD的CCONT位为0时,可通过以下方式启动此模式:
3 ]: C% W7 H2 i( _3 C( e, c; c3 ^1 l7 _4 Q8 V* z% S; R
将ADC_CR寄存器中的ADSTART位置1(仅适用于规则通道)0 P. G$ |% W) U. R# x& B7 ?
将JADSTART位置1(适用于注入通道)! D. t+ S! X+ p
外部触发(适用于规则通道或注入通道)
7 F+ i( V, h4 p+ {  k5 c) S
3 U4 N" a1 @4 @, L$ ~! @完成所选通道的转换之后:
- k4 [1 k0 R- N: Z. ?4 k' S  \如果转换了规则通道:
- `5 K& P; M$ I
" i, Z$ n+ h0 Z& i$ v' R转换数据存储在16位ADC_DR寄存器中% v1 ?( o+ U$ R7 X  c
EOC(转换结束)标志置1! M1 ~8 @& P3 q8 x
EOCIE位置1时将产生中断
7 |! |' D5 g- o5 |; w# q2 w6 j6 s6 D/ v8 T
如果转换了注入通道:
* A2 B5 K, f  u2 X- n2 X  n0 Y! L/ @" P8 D
转换数据存储在16位ADC_JDRy寄存器中
$ g% U% ?  u) ^  h+ fJEOC(注入转换结束)标志置1& e" ]8 X5 k1 G+ B
JEOCIE 位置1时将产生中断
6 {. f+ J; z$ w$ }# }' t0 O
3 ~" W  O- {5 p  i然后,ADC停止。' U" _6 D* [6 |' B

" ^- N0 T7 M; Y2.不连续采样模式
8 J5 q1 K/ ~, q触发一次,n个连续转换,按照规则通道顺序
+ R0 A: F: J& L# `
$ l# k+ s- {6 H. a1 _n=3,要转换的通道=0、1、2、3、6、7、9、10(L[3:0]=8)0 |/ O/ B7 R. R" H7 N
第1次触发:转换序列0、1、2+ e; |/ E$ U4 Y5 o" d# {
第2次触发:转换序列3、6、7
! C+ z% _" o# X  q: _, F4 q第3次触发:转换序列9、10并生成EOC事件; Y2 ]& M' M0 W8 z/ u  d
第4次触发:转换序列0、1、23 t6 @* h+ N) T- u6 y& M
& p( J3 `& I* j& k

7 \2 ~$ O* \- d4 ~6 Z! p5 ^3.常规扫描模式(连续采样)
, \, [0 I1 m1 O& K8 u$ k连续转换模式下,ADC结束一个转换后立即启动一个新的转换。ADC_CFGRD的CONT位为1时,可通过外部触发或将ADC_CR寄存器中的ADC_DR位置1来启动此模式(仅适用于规则通道)。8 R2 \$ j% s' \3 E0 P6 T3 A. G3 G

4 m6 `3 A/ q1 J6 T+ r: L$ v (2KCDM2$I_F2%NJW5[)D`UT.png
4 \: [+ S: \- u! d) y: P* c4 f2 h' M+ \# e1 o7 T$ ]/ K. |7 ]
每次转换之后,如果转换了规则通道组:
/ `* R" |, ^; i5 t6 F1 r! \. E2 i- z) M
上次转换的数据存储在16位ADC_DR寄存器中
2 `1 W; ~* l8 S# n: u8 _EOC(转换结束)标志置1
& E7 @0 w3 R$ M# Q* QEOCIE位置1时将产生中断
* \6 a7 U8 D. ^$ U) f& D7 p0 k7 @1 _% K  z7 p( ?( ?
注意:无法连续转换注入通道。连续模式下唯一的例外情况是,注入通道配置为在规则通道之后自动转换(使用JAUTO位)。
4 o4 W5 J9 H; Q0 @
+ h2 O& z' v+ ]& w& i# a8 v4.注入转换扫描模式
; E- k0 ]0 k& R2 D) M2 K1 H9 E3 X. X触发注入:在规则通道组转换期间出现外部注入,则当前的转换会复位,并且注入通道序列会切换为单次扫描模式。然后,规则通道组的规则转换会从上次中断的规则转换处恢复。* ?" y  h% ]' {. N

8 Q6 B1 y: \  h0 v$ W3 L) K5 |如果在注入转换期间出现规则事件,注入转换不会中断,但在注入序列结束时会执行规则序列。( z1 t7 h; H) e7 k5 V6 S% V; Z
0 U7 v! X9 e7 a) _( ^
`6WHDWTX7LW{US3S~)MJ`{6.png % [! G* E/ I) @& H! ]: O

- ~- Y4 s3 p$ M7 C7 }$ N自动注入:注入组中的通道会在规则组通道之后自动转换。这可用于转换最多由20个转换构成的序列
" J/ Y9 z' {7 |+ g* S5 A4 d# G  w8 ?! Z* s; ?" ?/ P# j6 y
5.多重ADC同时模式  v3 m0 e& J, O8 h9 U3 ^
一次触发,多个ADC同时转换通道数据
! j( Y) ~" K% b6 U3 Y
& r( y7 F( f7 k! S A73ZO~JMZ[$A@MIN1V$IH7B.png
1 G# M* R" `9 h, S- C
1 N: C9 Y  n# ]% I" I在具有两个或更多ADC的器件中,可使用双重(具有两个ADC)和三重(具有三个ADC)ADC模式。多重ADC模式主要解决的问题是:在保证高精度下,提高采样率。' {% V, F2 ^; J9 p! a# E7 {

+ i* Z8 W1 r4 n; e1 V2 N4 v) D6.多重ADC交替模式) b4 d3 G+ }$ ?
两个或者三个ADC交替对一个通道采样  @2 U6 H8 E' a6 }6 V: G

' K; Z& ?4 S" q! p- |$ u BNNPK`527A29C%U]D69)TP4.png
' X: w+ a4 u/ N+ r8 v4 ?
& D# u4 l' b' i; a3 M4 m7.多重ADC交替触发模式
) C3 I# H, p( C2 i( I双重ADC模式:: f; V4 F5 T8 ?" S! C8 ~
发生第一次触发时,将转换 ADC1 中注入组的所有通道, Y# F* E0 Z. L, v0 t5 _; T/ H0 j
发生第二次触发时,将转换 ADC2 中注入组的所有通道
3 B* @- s6 Y. x5 E7 L以此类推4 ]8 Z' @" }# {2 L. G- t
* f# q* W: X' I3 f7 L
IGSL6]6W9S)J@SL~LH_4S.png 7 `$ n6 c- W& Y9 X

( X# }, M. H, [7 @  Q. Y: a6 E三、ADC配置(STM32CubeMX), v' C/ X/ P' x1 N. K- @
G4原理图
' P6 z4 G) H8 e+ r2 y9 \7 q; o9 L2 p7 H7 V) u
`%HFT}R@RB$[LI7(VU7W)1M.png
* O3 ~' G) ^2 I' L6 a# k7 k8 f: k) w* I4 q( _8 F8 M. x
92893f879f694a41a479715f5a3809d3.png
5 a. a9 t8 z+ r& N& l: d# ]+ t- G
将PB15,PB12配置成ADC2的IN15,ADC1IN11通道
! s5 `9 i& G# d6 u% f1 c0 g& |' {( ~. H. U6 B/ t. ]) y
79L(3H(}EH{UUEBFBPA[E5R.png
+ E: A9 i8 w, K: P; J! V
5 G  D5 o5 Q/ p4 e5 A使能ADC2的通道15
  C, a1 G5 A( E& e
. j3 J- c. f$ O4 z9 B/ @" ~* u )P7}@%V4S`WD}MVQ3[7K49G.png 3 V+ y# g& T1 n- H0 h0 `
5 Y. ^- f8 L9 Q4 m. R" L( _
配置ADC的参数
- Z; F/ w' F2 S6 w# B) l- R0 |; c+ k4 m/ Z
I7U]M)PNS)CGU({HD8JAK2X.png ! P- R7 z0 i2 {* p" f3 S

$ w; w; G; ?6 M9 A/ U- I4 i MJY~9)K(}8O}0Z0I(XJG$D9.png
4 S7 f, w& D# o: t' y$ g* d% a5 @* E5 o
195993a0e9fd41feb2bb1fb4b158e1cd.png
0 j. ~7 `% P1 ~8 Q, i1 K0 E7 F/ C+ }  u. M* E9 U2 H1 l( Y
ADC时钟的选择
2 f' Z( c( @: E5 C' b! @* L+ v2 T% t! d
{2TC$O39_HDZU[WC3IGS{HF.png
3 {7 @9 O* c/ w. I  x( Y
9 }6 \3 R5 k; }1 q+ U9 O* _若没有使用DMA,上面的ADC差不多配置完了5 Q& ~2 @9 j; M, ~; A

. L3 u+ [6 w0 d% Y. ~' o四、部分程序
& A8 d& I  |$ ^0 I4 x/ A& bSTM32CubeMX会配置好ADC的初始化,我们只要写ADC的采样函数即可
5 v# q$ b' |* w+ \调用HAL函数即可,HAL_ADC_GetValue()得到返回值。注意,在调用该函数之前一定要初始化adc的句柄。2 ]) \0 ?" i! z; f: t- S
: C% T7 ]) B1 m2 p5 [. @, u7 ^
  1. uint16_t getADC1(void)- ^; O2 F$ A" g$ b- m# U. H, ?
  2. {3 \! }5 U7 w( l; [, ~8 O9 l  t( G/ N
  3.         uint16_t adc = 0;
    - Z. x6 R3 {/ }2 n+ `4 B5 h1 X
  4.         HAL_ADC_Start(&hadc1);  w$ Q( L9 c7 |' X! C! t0 u
  5.         adc = HAL_ADC_GetValue(&hadc1);
    3 G8 l+ j' N4 {$ X8 T4 \
  6.         return adc;
    + v7 r2 ]. d9 w1 B
  7. }
复制代码
3 M0 m4 c7 ~/ \2 V+ B& F9 e
7 v0 @3 r! M) i

2 s+ b! m; i1 c6 c2 h% ?* z5 J: f0 D2 X

6 r' o8 o+ d2 j4 E* ?9 _" H% P% v
收藏 评论0 发布时间:2022-7-5 22:09

举报

0个回答

所属标签

相似分享

官网相关资源

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