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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。/ l0 F8 h( d5 G% L
9 K* V/ ^( x; R! w8 k1 _% {
下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】
2 ?/ L1 g( ^6 W! e* J# I9 Z  e  C# n
  M2 F; \, M1 R% s0 }1 @
7.png + C# n' S, U% s/ Q
+ _; Q( g+ L" i0 }$ {) h
使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:. G: l( W' E7 r# j& m
8 }$ E+ L6 T6 p5 J5 G* E
6.png 2 q  {+ K' e9 N

7 a6 ^5 c8 y/ _' _- a利用STM32CubeMx对ADC的配置如下:* @1 a5 U# K, n8 }

( H: V3 [) N& i! b: S  X
5.png
5 T$ h# \$ S: O' |7 @0 n) h
8 H+ J- z3 J7 [0 P6 u0 T/ k/ h) k
保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。+ ?; X. Q! L7 L# I  t

( d& S# v! ~5 v0 r4 x: O6 b第一种情形,先启动ADC,之后启动TIMER。
5 n: m3 F& i7 U+ ?
: g: L7 q( e- A( f; k* iHAL_ADCEx_InjectedStart_IT(&hadc1);/ q9 T8 ~/ ]  E$ q- |- B! W

, ~! L  {4 |" x7 x* R1 O5 m9 DHAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);1 Y' _0 ]# ]: ?) U/ ?, b9 {' N
; C* i0 y/ I$ N/ x/ q
CCR5和CCR6的参数如下图配置。
# ]) s* ?. A3 X9 a; M5 M6 }0 P3 n7 O; [- v
4.png ; Y$ H' h3 d( V% c* s
, x2 Q/ Q+ Z; a# V$ ]
这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。
. {* I) Z: e4 |& ~; d+ U
0 c9 e  I2 G1 o& ~第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。
( \3 V% e' e" o0 N, l
3.png
3 n, _6 n1 E5 o. b' D: y7 L  V
" g9 j1 J( S5 Z  v* r
明明4次触发,怎么只得到2个ADC结果呢?' F, w7 d3 X/ o+ K9 r
8 Y+ u9 F0 k- u4 W
原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】  Q  f$ t4 L6 j" \5 y) A

! e  }( U6 o( R  _! f0 _' {* F
2.png
) `/ I# l0 _! a5 J. B
" M: u0 K4 z' h! G( P
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。
( I) o5 ]/ I1 w" G/ R4 U8 y/ F( `% n% G+ P$ q# o! v# |
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);6 @8 W9 g% z( q1 u0 B% @

1 ^( N$ o' I& X2 {  r, E* z2 y" g/ o4 _
HAL_ADCEx_InjectedStart_IT(&hadc1);
- F% v% c. p+ E( m& q% _! V, @! ?- |" f
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。+ f2 n" O$ O; [# \+ h" U8 H8 o
9 E8 `+ L: B3 P+ \9 n
微信图片_20240229135801.png ! @7 r' T5 p! g8 Q3 Q5 S" [# U9 Q
1 _- S9 }1 L8 z# }. I* x) _
这里的3个结果又是怎么出来的呢?5 q' I. Z' d- L. _' o, r2 d- B+ B/ ~

0 J# s7 n7 Y$ X0 z
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。; T* f3 ^9 y7 I. z
+ W7 b0 ?* ]  Q
微信图片_20240229135745.png
7 Y0 s( H3 a7 u% ?3 \2 }! \/ R* }( H- s5 I
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。
; f$ S" P3 z, I2 x0 `
9 ^) ^' r; q) ~) n! y: R) l. m7 q
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。9 U4 ^. v& c% ?  G4 q" Z$ u
  E: N* m/ Q3 G( e8 @; ~
3 L, X2 P& @; |  k9 P

. i% X* e) Z: T. `转载自: 茶话MCU
9 M+ k1 |$ D" |+ g# h! l: W7 ]如有侵权请联系删除$ w$ ?( B& ]* a$ `$ H
, I+ `0 c) r3 M- ?8 C7 E

" c: O' P  r: t* g. n, f& G: U4 _( N' K* X- G
赞 收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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