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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。
+ `) j! \9 q! H  L  v
+ v) ^. [& s& C0 y6 e7 C下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】
- O2 L- d9 s+ r# j3 F( ]: y5 _( J
7.png
  v' l3 n! V! g4 p1 [! d

3 {& M( J% O7 H& j# {( J使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:
" K8 v3 d. I' E# p  t! U
( b8 B8 K& k, `
6.png
7 R  h5 ?  i$ E0 F
. ^* P9 {+ r4 O) a$ u, Y  y
利用STM32CubeMx对ADC的配置如下:: E. p2 Z* i. \$ `+ j

! u: K4 \* C; J( m2 d* \
5.png $ q& ~7 d  [+ p

4 `3 L7 a! V* b# d保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。
: H; N& X$ |8 f# ?& W: C! z7 q) f4 n/ a; Y# ^
第一种情形,先启动ADC,之后启动TIMER。& g* `, D6 u5 l; _6 w
& }; s; |7 L4 o  G, u3 o! i1 Z1 q
HAL_ADCEx_InjectedStart_IT(&hadc1);
) E. J5 D8 M6 V
& v# s7 i7 q: d" M
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);2 k3 t! w" l# O
, x) D7 T/ n% i" o) K6 c/ j% g! |
CCR5和CCR6的参数如下图配置。7 f+ [/ P' u. |5 C/ d7 g5 N( }4 |
3 h9 L8 k; C1 h2 ^+ B1 W
4.png
/ W; N7 A  V! |) o1 a

' }+ k4 R1 L& Z5 V+ z+ X这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。0 J% l2 Q7 S) u# _/ u0 e* ^
' M4 b3 n# |; \
第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。1 P8 G' ]3 F2 V0 |/ k( x$ M
3.png . e* H( @6 b9 m% n/ x, V: i* {/ Z
0 ?" o2 O  d  }% }6 n; G2 `
明明4次触发,怎么只得到2个ADC结果呢?8 @0 A! J* a' w1 Y) b* A

  a( d7 C1 _4 B- O4 {: w原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】; k' H) O* @: r5 H- H+ w

4 O* _4 l% B+ M% Z6 {2 g$ [  o7 u
2.png + h4 j7 H* e, u1 S0 d
; p; x$ y0 }$ S4 O
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。
0 y9 k% S, K8 ^' N8 K  S9 q0 m1 d2 V, {: t: f. z6 x( ~4 v2 O2 r
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
# `8 O( o8 H6 l  N1 c; d0 S  l4 t9 B2 a! q
HAL_ADCEx_InjectedStart_IT(&hadc1);/ q  K1 L- J$ e$ [: F7 E5 B
8 R% g7 W8 S7 E, _
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。
* L$ M5 y; y( C5 K' i1 m$ F9 u6 n# f+ q+ L  D+ g, _& s/ D
微信图片_20240229135801.png 7 g) h& ?) M0 O5 Z
9 l, @& A( r% i/ k
这里的3个结果又是怎么出来的呢?
# X$ X$ Z2 M& L' b5 s
' R) l$ Z; y6 B) [( a1 u- _
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。
) }* I% P6 O7 k3 m, q2 d+ r' D
* ?; T. r+ @+ M( S  v0 I% _3 r
微信图片_20240229135745.png
7 n0 r6 U$ V. u2 E5 ]& H* h2 z: x; n  v3 f6 ?) x/ K
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。6 m; u( b' q0 w

, H7 j  ^; V0 e# f. e% I$ t4 g
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。
* K7 d% z  l: c( N
+ l1 e* }( w. \7 }- z) |& M
( ?- B, W: l3 P4 Q4 |4 [
. b+ N3 |2 e$ n( x5 d转载自: 茶话MCU/ i  E8 [2 r* A# F
如有侵权请联系删除
  z% U0 _5 {% w+ u- ^; m# z$ c7 x8 ~  D# a, F
3 r- m5 W6 v) r/ u' m# Q0 _
% a: N/ d" v% d7 f' ^$ m
赞 收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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