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

STM32 ADC间断转换模式应用示例

[复制链接]
STMCU小助手 发布时间:2021-1-29 10:10
STM32 ADC间断转换模式应用示例
- f9 `) J* X/ U8 i1 T* \6 o
有时我们可能需要对多个ADC通道进行分组转换,组与组之间希望有可调的时间间隔。比方像下面图示的情形。先转换头2个通道,再转换中间2个通道,之后转换最后的2个通道。
3.1.png

  s; C; f( C8 h' N0 i
如果我们采样查询或中断方式,每转换完2个通道后,然后做后续通道的切换配置再启动AD模块也是可以的。至于那个时间间隔我们往往会使用定时器来协助。显然,这样做有时会显得有点繁琐。

3 u9 `/ ?2 @- d2 z0 k+ f# R
像上面这种情况,我们还可以考虑使用ADC的间断转换模式。即将一个ADC转换通道序列分成几组,每来一次ADC转换触发事件,就转换一组AD通道,这样依次进行直至整个序列转换完毕。

* l6 h3 i" n2 d2 h
比方,我们用到某ADC模块的CH1/CH2/CH3/CH4/CH5五个通道,将它们分成3组,使用定时器触发ADC。第一次触发时,进行CH1/CH2两个通道的AD转换,第二次触发时进行CH3/CH4两个通道的AD转换,第三次触发时,完成CH5通道的AD转换。 第四次触发时进行跟第一次触发一样的转换,这样循环下去。

! x2 `) X4 g* {
不妨基于上面的描述举一个实际的例子演示一下。使用STM32F411-Discovery开发板来做调试验证。用到ADC1模块的从CH1开始的连续5个AD通道,被分成3组。如下图所示。
3.2.png
8 D9 Q) a+ L9 ?( \) `, t/ D
我们使用定时器更新事件触发ADC转换,第1组与第2组转换之间的间隔、第2组与第3组转换的间隔通过适时调整定时器的计时长短来控制。

+ M! l0 v( w- d5 f
我们使用定时器更新事件触发DMA,通过DMA修改ARR的值来调节相邻两组转换之间的时间间隔。另外,ADC的转换结果通过EOC事件触发DMA,并由DMA将转换结果有序地搬到指定的内存空间。
3.3.png

, \* j% u( r. b& Y* M
整个ADC序列的5个通道转换完成后,进入ADC的DMA传输完成中断,在中断回调函数里对各个通道的转换结果进行处理。之后,又可以开始下一轮ADC转换。

+ \4 g2 x# o) U9 t& T
将上面提到的整个实现过程稍微整理下:
1、ADC转换依靠定时器的更新事件触发,按照间断模式进行分组转换。
2、开启了两路DMA传输,1路用于ADC结果的搬运,另1路用于定时器ARR值的更新。
  p0 b" L! H7 G8 H* W/ I
第1次定时触发事件发生时,完成第一组AD通道【CH1、CH2】的转换,同时触发定时器的DMA传输,修改ARR的值,由其决定第1次触发事件与第2次触发事件的的时间间隔;当第2次定时触发事件发生时,完成第二组AD通道【CH3、CH4】的转换,同时触发定时器的DMA传输,修改ARR的值,以决定第2次触发事件与第3次触发事件的时间间隔;当第3次触发事件发生时,这里只做第3组AD通道【CH5】的转换,不通过DMA对ARR进行修改,其值将在ADC的DMA传输完成中断的回调函数里由用户指定。

; X# m2 @8 p9 R3 h) r' t  ~
下面将整个配置和代码实现的全过程贴出来,以供参考。使用STM32CubeMx工具进行图形化配置,基于ST公司的STM32Cube库来组织代码。
假设第一组AD通道转换后经过0x7000个时间单位触发第二组AD通道的转换,再过0x5000个时间单位触发第三组AD通道转换。【实际应用时,时基参数视具体情况而定】
: b- y0 z2 g- G7 a; p. ?
一、基于CubeMx的配置【RCC/SYS的配置从略】。
1.1 TIM3的配置,TIM3的更新事件触发ADC转换,并触发DMA做ARR的更新。
3.4.jpg
3.5.png

3 d5 j% ]1 ^4 y
1.2 ADC的配置。【选择5个ADC通道,间断转换模式,启用ADC的DMA传输】
3.6.jpg
3.7.png

) n( {. ]2 @6 D% h
二、生成初始化代码。
8 K: w& L4 P- ^8 ?  i2 H" Y
基于STM32Cube库,生成基于ARMKEIL MDK集成开发环境的工程代码。
3.8.png
0 C* J7 j3 E% c: Y* s7 T8 L8 A
三、添加用户代码。【代码基于STM32Cube库】
8 n5 i$ U3 c$ ]5 _
首先介绍下用户代码里用到的2个数组,分别是Adc_Value[5]和Data_Arr[2].
3.9.png

! o3 B$ Y5 K) H- l( a, V8 r& d
其中Adc_Value[5]用来存放ADC通道的的转换结果,Data_Arr[2]用来存放ARR的数据以改变计时周期。二者分别被不同的DMA流访问。
3.1 在main()里添加如下用户代码。
3.10.png

$ _* N/ \5 V5 G) v/ {. R5 b, D
第1行,清除定时器更新事件标志。
红色方框内的两行分别对ADC/TIM3的DMA传输做启动配置。
第4行使能TIM3更新事件的DMA请求。
第5行开启TIM3的计数器的计数。

% V' m* H' u+ m% H' E0 S' I6 ^
3.2 在ADC的DMA传输完成中断的回调函数编写相应的用户代码。具体内容因不同应用而定。这里只是简单地重启TIM3和ADC转换。

5 a6 u) z# P2 h8 p1 A9 D
四、结果验证。
$ [9 x: s8 ^! Q3 h2 N
将硬件连接好,编译代码,运行后可以看到转换结果。5个AD通道分为三组按预定时间间隔被依次触发转换,转换结果被DMA搬到指定的内存空间。通过调试器,我们可以看到ADC结果及定时器ARR的相应变化。
3.12.png

  G1 l' i& w) _5 ?! ~+ b" l
小结:这里主要是抛砖引玉似地介绍下STM32芯片ADC间断转换模式,同时用到了定时器和DMA两个外设。希望能给读者带来些参考或启示,将来在自己的开发中变通使用。这几个外设都是STM32芯片最常用、最基础的外设,掌握之后若能灵活使用,会让我们的STM32开发工作更加得心应手。
) v% Q  V! @3 {
文章出处: 茶话MCU

+ x( g( Y+ F5 B. F/ @% R
收藏 1 评论0 发布时间:2021-1-29 10:10

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版