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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。+ h' H. s2 T. e, X

1 S( N2 _6 U: ^# r下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】7 B. b/ W8 ]" |/ s- T/ I6 t. q( p
% c4 ^, n1 p) M, w
7.png   |8 L# b' u3 Y- x3 O: ^1 b

# I9 c& ~% F5 B  j* s; S4 A" M使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:6 @1 q/ H( p1 s+ a* w$ U: p
; V" V( m! ~. F
6.png
1 K' p: V+ T' A5 p

9 q# G# ~/ T) ~/ a$ w利用STM32CubeMx对ADC的配置如下:
1 c$ `# W" w- ^; t& C$ ]$ s$ B) R: ?
5.png
9 q9 }4 ~; d. Q8 v) E$ C1 J
3 e- j/ U. J4 b; @) W5 S
保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。3 @2 d" H; k% L4 Y" z. I
: K6 W1 ~9 G2 _8 c: |8 F+ F
第一种情形,先启动ADC,之后启动TIMER。0 i# b. v' V6 ]! y$ w, r4 X- x% p

4 F0 t  l9 Z2 p0 S- E- ^( OHAL_ADCEx_InjectedStart_IT(&hadc1);& k1 e8 ~7 t, U0 I) N3 D5 }
* f7 x* f/ Q& V, T  }, f0 ^2 Q
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
& k( Q! O& D' `- U2 C+ `
8 n& F7 u% k) X4 C7 iCCR5和CCR6的参数如下图配置。
& f4 n* {5 {( Z# G7 R( b5 J- z+ e8 _' j8 \6 c3 r
4.png
; L7 P8 v+ z( N' E0 }
3 e  h. B/ O& k" F  A+ c
这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。
5 @( L  Z" Y- j% P( o
5 ?0 i+ G3 u' z5 r, Y; W第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。
# ]& }! r' H: e
3.png
6 Z6 Y  L( }! r0 w" ?
9 e1 u7 \2 N% P6 a5 B: Q4 @
明明4次触发,怎么只得到2个ADC结果呢?' Z. M" Q( y! ]6 w! K' k

1 U* m: g1 K' P4 t4 n& s' A原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】9 A; A9 U/ x0 I& j  Y. T
2 Q+ T3 {( f3 c' e; M; C
2.png " e! o5 G. u+ v0 J
- b, Y9 z+ P. k' }% b6 ~
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。
& g' o& @1 ^: q3 O9 S/ \: i7 B5 W* m& J/ j: r& j
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);# {* K: J7 }3 i! ^& {* \) u
3 P$ u, _0 |1 ~+ m! N2 @+ ~
HAL_ADCEx_InjectedStart_IT(&hadc1);  [- ~. O( ?5 d2 H) F4 A

8 O( o, T. T$ q, H7 f( ?0 f
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。
  ^, g) p4 h2 y
0 ~  ^' a7 M; A+ W/ _: x 微信图片_20240229135801.png
) j* z3 y) G& T$ y
! F- W  u6 q8 i& L
这里的3个结果又是怎么出来的呢?4 f/ T* E1 K( }: B
. M% l) `) ?0 l( h. ]1 i
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。% t3 l2 a- _* v/ d6 q% Y+ N# }

" N# }( i1 r! _5 m: y& F" h" A
微信图片_20240229135745.png # q3 E5 Z) M6 g* @9 |. f0 P
5 o2 L: K- Q) d- K$ G2 Y7 A, t- E
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。
: X8 `+ l5 R$ u1 I9 B" }4 ?% P2 k3 V- d
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。
  I! x$ S- U& Q+ N. [6 U7 I; l, w0 \8 p$ m& p

  p5 @8 w, G& o; y0 A: }8 z  L; X2 ~
转载自: 茶话MCU9 x8 P1 e) \: I$ g/ G
如有侵权请联系删除
7 m6 |  v0 I# s9 }- J8 Q8 V8 O: U
5 X/ t5 j( Z! X  g" N" e
+ q# n, i! o. u) m$ q0 a7 J
1 }/ K- c: k) }' o3 q
收藏 评论0 发布时间:2024-2-29 14:00

举报

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