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

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

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

6 ]6 N" @" R9 b& v8 g# R下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】4 u+ u# R8 j7 P

# ]. o" G* F; Z
7.png
# ~- g. `% v/ W5 |" c! K
; n$ T. x% v) b+ b5 J4 @+ N  Q* e( W
使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:1 V9 Y) t0 e- }) p: D
7 c1 \9 J7 I! N" ^, A$ e
6.png ! F" v7 a% M& ?

( M! J- j3 B/ D利用STM32CubeMx对ADC的配置如下:
. Q2 G6 I  g- H4 L
! u5 O, B# w: J- [5 {
5.png
3 F: l4 S( R  u; Y8 |# G. S
' v! {- K% u: O9 S* `; x7 X
保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。3 D2 V- c/ n. ], j
9 T$ ^' w# K! R
第一种情形,先启动ADC,之后启动TIMER。. F) ~2 Q/ `, U* ~) X
) i+ @6 V9 p8 O2 R5 ]& V1 f
HAL_ADCEx_InjectedStart_IT(&hadc1);
8 S( W( r4 H  m2 t5 F* i. E7 }8 Y# f
% _- k+ d& M& K# w
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);1 w* X3 T" G" a0 e" V8 i
# k% b1 Y4 y" m+ V
CCR5和CCR6的参数如下图配置。( P/ a* K$ O* n
0 i' t7 X# f1 s+ r! r) Q# ?
4.png
- S1 Q2 H! e5 a

$ k; Y1 r6 L4 E+ n2 G这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。
0 k* C+ i' G" R1 o% U' v( M. C7 g1 l: N' z, s
第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。1 T" B/ W7 M8 Q: J, h; B
3.png
$ J* l+ i5 f: h6 ^1 @

7 b& e6 [. E/ T; Y明明4次触发,怎么只得到2个ADC结果呢?
/ t% u* X/ f) j6 u2 _
! v* @/ y8 f* b( C9 {, s2 P; _原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】
6 q; a# t$ |8 p2 N' D; i( @  K8 ^8 {; N" f! w& e  d
2.png
4 N" _+ e5 K5 K9 T% f5 s
1 A$ P" g9 _+ U$ |
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。
+ l) O0 ]) g3 Z% p5 |7 c. J% h$ }; w' n. U, }6 d
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
# @# i5 O* V: b8 w! X3 j+ U% ?0 m2 ?8 U% [5 D
HAL_ADCEx_InjectedStart_IT(&hadc1);
# u, T* c: ]5 X6 u5 A
0 u6 w2 ~" {$ ^2 m' F
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。
' W8 a) Z5 _# @; r* ^1 N" N! D7 k0 f. _4 J# Q1 ^, _7 Y! x5 j
微信图片_20240229135801.png
5 w% g) e( E/ I6 C% {' K6 e% W
! i, z3 D3 b# l8 d" d4 `; r
这里的3个结果又是怎么出来的呢?
4 h; Z5 X' ]& X- x6 j8 q, p9 i8 c5 |+ q+ {) h8 N
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。
% B8 n" ]/ ^% q& x8 s& ?2 s  w# x, J4 o+ _. ^
微信图片_20240229135745.png 5 ?5 t6 b+ _3 \$ a9 n7 @, s
) {' m4 @7 V* B  Q7 A
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。
% u/ E9 ?) o6 G5 A) Y) o) m  O. n% g' C! v/ N
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。
, U6 e6 S) p8 q9 X4 J
: v, I0 P2 V& @4 z3 ?2 g4 s6 f3 v) H8 i4 J( \
& X- M4 W4 G  J1 V6 V# ~; ?
转载自: 茶话MCU0 v5 D1 |+ U, q  o& b
如有侵权请联系删除9 z8 ~5 b/ @) a/ c/ W& l) R7 A% {. y

6 ]" U: ]! m5 F2 F& q  h6 R6 ]% c% b8 o0 Y

3 u2 T! {! m) C
赞 收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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