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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。% C; G- o2 ]; p( t7 N8 ~
) F8 q% O1 T. b& X0 u) K
下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】9 q  n; e* c! u

# C1 w" h+ }8 a
7.png * h) W0 E9 u' ^

- i8 ^# u8 M4 x& t- Q0 e2 Y+ y, T8 S使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:
4 l2 @, g/ I/ b$ D3 P: X# `* }' J/ e) r3 D, A+ p
6.png % _5 d4 h) W: V  ^" u
* ]  o( k9 l" L
利用STM32CubeMx对ADC的配置如下:
$ x/ D; _  H+ ^' F( d1 b
& B8 W! a* o# l: M  u# Q5 _
5.png * `4 o  e- Z0 c1 M
, z. i4 }/ j4 I2 l# x7 e
保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。
1 I0 F0 a7 k' v: E  e7 z. U" ^: Y, G* ~. q
第一种情形,先启动ADC,之后启动TIMER。9 {; B: R3 `1 g% ~; H0 v

! x, k9 v5 A3 K9 i: @" v7 ?HAL_ADCEx_InjectedStart_IT(&hadc1);
& ?% _3 ~- U% D4 q
7 t0 ]3 Y* v  e  j
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);% C8 B/ g% m4 O. G
- @1 g+ E+ E; Z
CCR5和CCR6的参数如下图配置。
# E* M* n' D0 \3 b; S
6 l, v" F! ]& w& Q& b6 L
4.png ) L" F  u4 p% d/ Z/ D

  ^( J9 N2 ]7 `3 f/ O/ u这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。
  u: x( U5 @& u: E; O1 s0 B3 f! K
, F- i* O  j. m- l0 D% }' k第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。; f" b( V( z$ l7 r9 \
3.png
: U  ], _$ X9 ^, Z  N# V

6 H- M# |& V3 L# ]9 `# U. r明明4次触发,怎么只得到2个ADC结果呢?
. b% Y: l5 V: o  ]) s$ o: |9 G* F1 E: V
原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】
! z' A" F4 `6 c. O: }
8 |4 I% _/ |+ z$ b# I  H, j6 _
2.png . X9 @4 T- n8 x" ~& I3 k# e, f

. l6 C! F; j9 ~0 ?- G0 F' i: k第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。
& t4 f: z% v+ L$ `3 l( i
5 V2 y5 M; G1 l  a& g1 }
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
  y- r3 b) i  u
- p% K  E  f' j% e
HAL_ADCEx_InjectedStart_IT(&hadc1);9 }1 u/ s2 H7 x0 g# H% H0 R5 u4 J  u

2 o6 D) {. X( r& u" b
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。
, Y, \6 c& {0 x* k+ J; A$ c1 p! w2 B. w4 m3 ~( O* j
微信图片_20240229135801.png 1 X4 A9 _7 i2 V4 t- r
! A$ Y6 |' Z, y/ j; ~! p- N) O
这里的3个结果又是怎么出来的呢?6 r+ H; h$ }0 X5 Z; r

- V% K) ?: L* O3 u
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。, g1 @1 B$ m! \& Z

6 N9 F8 l' \2 i7 b7 e3 L
微信图片_20240229135745.png - G+ ~. m& A; Z1 B8 o

: C* H) \& ]2 L. H# \/ k
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。
7 f7 O: |/ ^$ F1 t8 [, L
% K/ V1 a5 U4 |# C
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。
1 p4 L& F" w# r  a% K, `! r! `
0 c# f5 J) ^0 Z+ y
& X2 u6 j3 g% e! q$ v3 y# p: }7 B1 W; M& q% o7 _( i
转载自: 茶话MCU5 i- ^1 b6 D' D6 O9 A
如有侵权请联系删除
5 i- f' h- o2 T5 U' W1 S: g, C& a
3 i5 K/ n. O. }6 T1 v# |
4 Q4 {4 Y* r+ k/ r' @
赞 收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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