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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。
9 Z' Y/ A9 d2 a& f6 d0 i& v; U0 j' f4 v" n& l6 W
下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】
7 X; |4 j7 B( ~4 O4 ~; b: k
' R: K  E! M" Y
7.png , q- d6 {5 B  r2 I5 h: ^9 f
/ h3 q0 T6 Y  {
使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:  c! K( p. m0 K
/ x( D0 P: M# W, z9 D5 r
6.png $ \4 ]. ]' r* `3 x' S3 R/ I5 O

* }1 w% ?+ `* g" f利用STM32CubeMx对ADC的配置如下:: n8 r5 h' p, R% Z9 y9 I

8 ?1 ^; @2 g7 V/ u: w! f- ~) K
5.png - ^1 z0 W: _& Z- X% j

5 W* T. S# A, A保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。9 }2 w7 T, A! _& u0 O0 g5 L; J
0 K( J7 {' ?' D+ P: r
第一种情形,先启动ADC,之后启动TIMER。3 W; P; y. Z' C& S  T  `8 g
) U; n2 F" }4 {4 ]
HAL_ADCEx_InjectedStart_IT(&hadc1);
0 S% f0 e* I+ Z

3 `# v4 Q2 ^8 R' g; d" x* J3 {- {HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
# x( H" t. b% C7 Q: m+ N& x. D3 q. M' }1 o$ M7 ?
CCR5和CCR6的参数如下图配置。0 e& r) R( F' P7 _9 J* a
" I# e. L9 Q+ N* K# o. B) C5 ]
4.png . M/ o8 y  ~" F( V# w! `0 A

3 K0 y7 x, c/ v9 j7 {! H" O这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。' S6 H7 m' e0 ?1 g) h  e: J! T' L
. u3 H* `7 g" C6 P: I' P' \/ @
第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。
; G' k/ L7 |( L9 S& }7 S2 k# n
3.png
# L9 r6 i% ]! A0 v7 \- M
& }7 B: q5 F1 R- X' d' X1 I8 Z
明明4次触发,怎么只得到2个ADC结果呢?4 O( p1 x5 j) w# k! a2 q) F

1 Z7 Y2 r7 P  \! S% S$ O原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】
# L  l( \, [' T; d8 e; x# w0 Q4 |: o9 k# e& ]! T% A6 u  ], i
2.png 0 Q3 }* Y! _$ P. K" o* o

& G8 `: R* t3 S& L第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。
7 D9 S; X& @# Q( d  e0 F
' E5 _2 p" A/ z  c$ U% c
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);: R# i- z( v  u$ H5 r

6 |' t7 p# ~% y/ w
HAL_ADCEx_InjectedStart_IT(&hadc1);7 \  L5 Y' {! T" w- _" w
( A, E9 m1 h/ }
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。
; u/ s1 B7 e+ ^9 s' i8 c. x- i# m8 t
微信图片_20240229135801.png
, N7 I# Q* X/ X
) O( Q' `9 s! j: Z! q
这里的3个结果又是怎么出来的呢?
2 j) w$ s! d* L/ M* {6 p- v- M- Z/ H8 ?  Y+ X% P
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。
* W" M9 Y! a7 h$ Z
5 h7 R7 g; F8 \
微信图片_20240229135745.png 6 u5 N: I8 j& T  W+ g

# ^. ]  e  ?6 r( I4 k7 d; S* j
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。- A0 [/ m$ f/ a5 W$ K1 w
) X& f* P3 Q3 X, p! R* {- _
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。7 l+ h1 c' A* G9 B
* ]5 M; Y5 L1 w+ l# {& @

( _( P4 P9 q$ u$ n6 e
+ F6 b; G( u6 F% O6 Y9 s/ x转载自: 茶话MCU5 z1 x7 X: |$ N) b- a8 C5 d
如有侵权请联系删除2 Z  `* L& B; y3 \
, n, e, T4 X: O, o$ D& O/ ?
4 ]8 N( W8 u& |
3 M$ Z' _3 \  K8 i9 y
收藏 评论0 发布时间:2024-2-29 14:00

举报

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