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

STM中ADC模式间断转换应用

[复制链接]
yumeii 发布时间:2019-12-24 17:52
有时我们可能需要对多个ADC通道进行分组转换,组与组之间希望有可调的时间间隔。比方像下面图示的情形。先转换头2个通道,再转换中间2个通道,之后转换最后的2个通道。4 x5 g( \5 j% s/ m( G( [  U

' R% T% o9 ~4 `
# z* S/ r4 Y5 P& i! ~
1.png
% e' l1 \) f& X' c
4 s0 f5 K8 j# x) Z1 c

/ T4 t( O& i  S" W0 {2 ?6 h' ]6 k如果我们采样查询或中断方式,每转换完2个通道后,然后做后续通道的切换配置再启动AD模块也是可以的。至于那个时间间隔我们往往会使用定时器来协助。显然,这样做有时会显得有点繁琐。
: U' ?2 W+ y+ f3 S9 t7 ?2 u2 v8 L1 E* l, N8 P

6 v7 Q5 ?" h' ]5 O% s/ T像上面这种情况,我们还可以考虑使用ADC的间断转换模式。即将一个ADC转换通道序列分成几组,每来一次ADC转换触发事件,就转换一组AD通道,这样依次进行直至整个序列转换完毕。0 y. Z) t+ N# |  o5 M

2 K( E: U* K& t9 T% Q5 i
: ?" Y3 {5 n4 C. ]2 f- p, L5 Q
比方,我们用到某ADC模块的CH1/CH2/CH3/CH4/CH5五个通道,将它们分成3组,使用定时器触发ADC。第一次触发时,进行CH1/CH2两个通道的AD转换,第二次触发时进行CH3/CH4两个通道的AD转换,第三次触发时,完成CH5通道的AD转换。 第四次触发时进行跟第一次触发一样的转换,这样循环下去。1 Q4 I9 M! d, g, g! ?9 @. l

1 _1 x2 F8 \$ g. M
2 i7 J3 n9 C/ g3 ~3 u7 |
不妨基于上面的描述举一个实际的例子演示一下。使用STM32F411-Discovery开发板来做调试验证。用到ADC1模块的从CH1开始的连续5个AD通道,被分成3组。如下图所示。+ B: j; o+ a3 h. b0 L
8 r8 `6 z. t' y8 e8 c0 B

* L+ Z% |& g( ]1 @# s$ `6 i  M 2.png
% ]! {# k+ ?4 m# u* ~: `4 [  l
: \8 q( b3 X3 J( K
( g, t) E; j. J5 H
我们使用定时器更新事件触发ADC转换,第1组与第2组转换之间的间隔、第2组与第3组转换的间隔通过适时调整定时器的计时长短来控制。
# t1 t6 V2 c- W" T
1 x. ~+ t$ A( T" ^! n! Z/ N- H

4 |+ R6 h& Q  v我们使用定时器更新事件触发DMA,通过DMA修改ARR的值来调节相邻两组转换之间的时间间隔。另外,ADC的转换结果通过EOC事件触发DMA,并由DMA将转换结果有序地搬到指定的内存空间。
  S# `+ r& D# M: N" V% O3 V4 d2 U2 e

3 J6 z; q" v' g& g; d 3.png / b6 y( \. ?. M
7 Z- M% v0 }4 g( i

( _5 ~. U7 @* I整个ADC序列的5个通道转换完成后,进入ADC的DMA传输完成中断,在中断回调函数里对各个通道的转换结果进行处理。之后,又可以开始下一轮ADC转换。2 ?% s( L, m% Q  F$ d7 |

3 f+ U/ O7 b8 k; w6 w
. p, ]0 L5 U  ^$ `/ w
将上面提到的整个实现过程稍微整理下:
6 U- ~: N% Y6 C" {$ M7 T# g5 {1 q3 r1 ]3 Y( V$ g
: T( P+ P+ V) F
1、ADC转换依靠定时器的更新事件触发,按照间断模式进行分组转换。/ D: V- f6 Q6 A

5 A6 x+ B. H: X3 J4 }
5 m, V& N; g; I* j) d0 P9 t% m: k9 x# o
2、开启了两路DMA传输,1路用于ADC结果的搬运,另1路用于定时器ARR值的更新。3 x/ G- r4 b; E/ N) n
. R3 `$ H% r* |9 ]; i

& v8 o6 t9 C8 q, {: V第1次定时触发事件发生时,完成第一组AD通道【CH1、CH2】的转换,同时触发定时器的DMA传输,修改ARR的值,由其决定第1次触发事件与第2次触发事件的的时间间隔;当第2次定时触发事件发生时,完成第二组AD通道【CH3、CH4】的转换,同时触发定时器的DMA传输,修改ARR的值,以决定第2次触发事件与第3次触发事件的时间间隔;当第3次触发事件发生时,这里只做第3组AD通道【CH5】的转换,不通过DMA对ARR进行修改,其值将在ADC的DMA传输完成中断的回调函数里由用户指定。( G& y) M( e) x. ?

4 u5 H2 m, A0 X# S3 K
. R! G7 O% }9 T; f
下面将整个配置和代码实现的全过程贴出来,以供参考。使用STM32CubeMx工具进行图形化配置,基于ST公司的STM32Cube库来组织代码。
, m& F9 n, ]( I1 I# _8 y
5 w" W8 `* I* z4 J
# z" n+ Z+ e/ u4 ]
假设第一组AD通道转换后经过0x7000个时间单位触发第二组AD通道的转换,再过0x5000个时间单位触发第三组AD通道转换。【实际应用时,时基参数视具体情况而定】6 }; j# l% D6 h9 |+ f6 ?6 K
' y/ o* H: }9 i- y( o( n* s& X
, E, P+ J5 w$ h5 v) t5 q
一、基于CubeMx的配置【RCC/SYS的配置从略】。
  |4 M( R, [+ B  a( Y$ m9 m
/ R# q4 {  Q9 [6 g2 b+ Y

* T0 t- M( q6 _% j8 @ 1.1 TIM3的配置,TIM3的更新事件触发ADC转换,并触发DMA做ARR的更新。
8 r4 X  a& C* [# y
, F6 K' ?6 Z3 j4 e1 A
7 q$ Z2 ?4 V, v" ^: {( q
4.png
) o) F2 W7 Z* E6 g3 d! Q5 N! G6 R$ p5 v  y
8 m* p8 P0 [6 T3 E% P7 q* F& k
) x6 C) B2 K4 a3 ]  ~  _
5 n1 T$ x+ Z( V

. A: ]% l1 }+ E. p4 m1.2 ADC的配置。【选择5个ADC通道,间断转换模式,启用ADC的DMA传输】! m) @( F8 j) r' T( g% N: N% D& x3 f

: Q& A# O/ z) a0 o
( i0 b7 C; u' G7 c3 N
6.png . U2 a3 m; L" B
, \- {  ^$ i+ i& H

7 v  d, B) b/ p8 R 7.png $ l$ p! q2 ^0 j. ~

+ ?4 }3 F  \8 |( R! P/ ~
2 i$ e5 ~: W3 h- d
二、生成初始化代码。: E: m0 O  T; q, O
! R& g; m; S3 x4 f) o0 `
- j' ]0 G+ H3 s0 d- \2 ^( s
基于STM32Cube库,生成基于ARM KEIL MDK集成开发环境的工程代码。0 e+ Y- w0 j. Z( i- f

: f, K+ h2 [* c6 V: r8 u8 b3 @

- `1 O. k+ O1 x, |' X% a1 ~0 N1 y: k 8.png
5 w! J1 h9 V6 x, `
4 U. P" h7 P! u- J4 d# T

. T- [0 ^4 C8 l0 W9 N  e三、添加用户代码。【代码基于STM32Cube库】
! _8 i. H, I$ S6 K
6 S. ?' |  Q6 F- ~6 f
& o- n, M1 {/ |) n' A
首先介绍下用户代码里用到的2个数组,分别是Adc_Value[5]和Data_Arr[2].: d, L; Z; [" o$ z
+ U$ i0 W9 R$ W& B( t) U. a

1 V8 G- _, ]9 J 9.png ! H3 u$ I) ~& u5 l' q  ]* |9 D

% o1 D  `, i7 _( Y1 [

2 J& t& [' }8 z9 ^其中Adc_Value[5]用来存放ADC通道的的转换结果,Data_Arr[2]用来存放ARR的数据以改变计时周期。二者分别被不同的DMA流访问。$ M' W1 ]3 q, O+ g: B

# z8 L) [: U8 n2 A# A9 a' Q

; s, ~: ^- g3 j9 h0 z3.1 在main()里添加如下用户代码。" W/ U) F1 X0 T& W/ S% x- P) p7 G
: Y- S& f; x+ Z7 \9 N+ d5 T

; X$ m: n# Q6 [; Y# R# s5 q5 ~7 p 10.png 8 H" Q( G& O% o+ \" U
/ [4 N3 n3 O. {' i+ Z' R6 t

; M9 {8 S, ^  R3 ~$ k. h3 `第1行,清除定时器更新事件标志。6 J2 s% @7 }0 \4 X& O
5 W/ a* q0 P; ?0 Z

7 Y' j; e  C, p  G  e, A红色方框内的两行分别对ADC/TIM3的DMA传输做启动配置。& A6 w( @. o1 {" H/ g5 r9 Q

4 X" D  w/ C: Q' D  h# O9 {

8 U6 F) w% _' Z6 G4 b$ }; W: t! B第4行使能TIM3更新事件的DMA请求。
( t* j* ^' P9 L0 x* a5 U) g5 V* v7 ?! m; N1 Y' K" T

4 H( I2 z, l: R9 `第5行开启TIM3的计数器的计数。
! q4 k3 E5 Q9 u
5 e  E/ o7 {9 ]1 e& V# q
$ I5 p6 p8 K+ Y4 W* o3 ~8 j- E
3.2 在ADC的DMA传输完成中断的回调函数编写相应的用户代码。具体内容因不同应用而定。这里只是简单地重启TIM3和ADC转换。
& A" I- B2 K9 s& t6 T- B. Y; j2 S5 Z. L5 M% t( ]
* f* w* `5 y+ _2 I. ~6 ^3 l
11.png 2 m! A$ Q' h' H2 T
' {1 |& M% `8 A' n/ L6 Q3 v: T" D
  v, K: {2 u! [+ F
4、结果验证。
) t" N" W  T' T. }$ a1 ^% p+ H2 Y- R" H" c4 m" V1 l# b. [
0 T3 G, V. S9 P+ r8 L) {  J
将硬件连接好,编译代码,运行后可以看到转换结果。5个AD通道分为三组按预定时间间隔被依次触发转换,转换结果被DMA搬到指定的内存空间。通过调试器,我们可以看到ADC结果及定时器ARR的相应变化。( e; h8 x, c8 J+ d% j- b' L
* s" `( {7 E. O" H* C, k# ^/ E5 O( k
1 @" k* F/ @* b
12.png 5 `; s7 l7 i3 k: h0 z

# \% N3 ]9 q4 Y/ g+ A0 _
5.png
赞 收藏 评论0 发布时间:2019-12-24 17:52

举报

0个回答

所属标签

相似技术帖

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