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

基于STM32的定时器触发ADC时可能遇到的情形

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。
4 }( t% C" U7 z  y  q! B( U; J7 j% {' q
下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】3 x0 E6 B  m( F$ y4 p0 A; g- g
; E# {' w- y7 _) V$ M
7.png * i6 _0 X6 Q; t: d6 }1 @' {

+ g& ~4 x( u% F) x1 W4 M! S: E使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:7 E1 Y! b$ u- I; [2 k

/ n' h( `1 G3 c% f5 Q# }
6.png
5 u* N5 Z8 S9 m
1 d# \5 z0 l0 [7 ], o3 Y
利用STM32CubeMx对ADC的配置如下:5 M3 N8 Y4 \8 |% u

* o, c1 ]- V! J
5.png
5 `* M; }2 Q7 A, C% N: @" H
/ m7 `* u$ i/ G6 o3 m/ z
保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。- V' C7 M0 j) ?; H: X8 w( d

* i/ n! S1 X) t) w8 E第一种情形,先启动ADC,之后启动TIMER。
5 t* `$ G3 y$ ~9 e1 E7 l6 {) {5 R: k+ @  @! j' w4 e
HAL_ADCEx_InjectedStart_IT(&hadc1);+ o5 Y( a0 ^- o& \" C
) O: H" C; Y, n+ A; j( C" }/ V4 D
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);/ b+ \1 c; w4 z0 _, p# A7 }

8 |0 R( p* [2 W! U* p3 nCCR5和CCR6的参数如下图配置。
& @" Z1 l- |9 [
& A1 R, c; d0 Y9 P/ j$ S
4.png 1 x0 I( @# R% H: o3 s  n

, f) H. g( y' x% ?5 r8 _$ Y* {这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。
2 O7 U7 n0 F: y$ N( z# X2 L# J' B. L' A8 k# A# \+ ^
第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。* m2 q8 V( Y" I/ {! Y( P7 l
3.png
6 ?; r) s* r8 m  J4 K( C6 Q5 {/ D

" y/ d; m% o, u8 t明明4次触发,怎么只得到2个ADC结果呢?' M3 s& U" b, H+ {0 H1 ?
! m5 M/ N1 y7 D' w/ [: k$ B. |: H2 T" ]
原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】# m  Q8 T! K. [% J' d

4 D) f' D% l" h3 k$ M- q
2.png
5 G9 @2 [3 T- a# V  o. _4 X  C
  Q" B7 o. U2 Z! T" n
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。& j8 L( x- o/ [$ U8 @( _3 f

/ S. T2 ^8 f: @3 n9 |2 E8 I9 D' p
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);" \- T0 I& Y9 p0 p

( Z+ n8 M0 b9 P: t
HAL_ADCEx_InjectedStart_IT(&hadc1);0 ]! K5 b" o' X1 ?& v: Y7 R
( {8 h8 D. E1 |; ~+ r% S. j
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。3 Z5 r" V9 e/ G1 S: Q. s4 ~0 j/ `

! b6 o; w9 f0 ~1 v+ N% t 微信图片_20240229135801.png 4 ]: B' Z+ Q. V& N! M3 U

4 d  W) {4 T$ U; m
这里的3个结果又是怎么出来的呢?& R# @1 ~, B5 j6 `" U" W

/ |( W3 o+ E5 @9 T3 C
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。) E5 i; e5 U1 P: ]' B

  N- p, z. B5 {6 ]) P
微信图片_20240229135745.png / y1 p% s3 K! j5 `' K2 n6 q6 X0 }1 c$ u

# c( q0 Y" v+ G+ W( {/ S0 z
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。3 z( A5 M# \; Z9 T
( h+ o) Z* N, X# N' n0 k
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。
3 d( J# G+ t  ]4 a" B( s  }8 R, C. F2 X
4 f# t( G; E4 g/ x) b" s! U2 A
' h# n! e' r: k" W% S0 Y/ t
转载自: 茶话MCU5 u! e  B8 t1 S% G
如有侵权请联系删除2 t) w  y0 E0 |, B7 b/ L6 k" L

- G; z9 p& }3 Q* @
. A9 f9 M2 y7 Z
2 p( J6 {  F% C7 f
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版