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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。
8 f; k* a+ [+ \( o; w  `6 Q: b3 W0 p
. M% X2 O2 y- D% J8 c下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】
6 B+ p# n# X9 o* ~5 i: P
( y& M* H8 z0 T  Q0 w( f# g
7.png 0 T& {& E( }8 n9 Y, t8 Y/ ~/ v

  l3 ^1 H4 s* a7 {3 P7 D使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:
9 C  H# m, M" y, x3 l1 E
3 z4 h" z6 V& n; ^* l! t
6.png 1 b/ w4 H7 q! t2 J7 }* C: p3 g
- ^" x3 L4 O. P% T
利用STM32CubeMx对ADC的配置如下:
" ]7 V% a& x! H. |* _5 i- I3 m
/ ~4 D( p/ \/ M
5.png
1 E' w0 {" o/ Y( o7 F

& d4 |- {' t4 j( I% d8 K5 d保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。
8 e9 \4 d9 {- q, [8 l1 V/ |) ^  p$ J! r  M
第一种情形,先启动ADC,之后启动TIMER。
' C% g. m9 e1 E( A8 ^% O
& G/ c5 I0 f  f. ~  m" c; ]* R3 @+ D6 HHAL_ADCEx_InjectedStart_IT(&hadc1);/ h$ x" O: N/ t/ F
8 V% Q: b$ U! T' S' K
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);: Y6 f3 q$ R+ \
1 I6 _1 n- j& U, k: C
CCR5和CCR6的参数如下图配置。
# O  O! n5 ]9 a$ k/ O
+ w/ S6 Z5 N( O1 t" r  e* v. h  R
4.png . n2 \1 I7 Z# ^
( @$ F4 F2 |3 q, x7 {. S1 X
这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。" U' {) m/ b; l9 s' v7 l
1 H1 P/ t, A1 w- C- c% \3 U. V3 W
第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。
7 ?8 s7 n1 M2 ?# A) i
3.png
5 k9 |3 G) h7 u* c8 U/ k4 {

% ]* z; {% V5 S) f4 p9 f& d; p明明4次触发,怎么只得到2个ADC结果呢?
" S0 e: e$ t: H: g! m, y' f5 v; f' n( c. T* Q7 O. E6 j+ I( v! _7 s0 U$ N
原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】
  z6 i9 k: Q) J' C. l8 X9 h, K3 ]0 J7 H# J
2.png
7 l7 V3 ^# ~. k% [0 H3 q
: `/ T5 y' u. l* g2 Q
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。
& U) P# x. {, g
- U) \% K$ [" E) `) J- C( [, ^+ u
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);1 h7 e2 e5 T- N3 w) [& ]
$ C7 W2 V, z0 @: O
HAL_ADCEx_InjectedStart_IT(&hadc1);
2 c! B+ c) L& v# q! V/ Z; Z
. R* Q) D) `" x. M, A, P
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。
& n6 a4 `$ y: e* w/ n7 Q1 u2 p
/ B2 U6 X' S" ] 微信图片_20240229135801.png
  m! U/ \7 d  z. n
3 r; `8 L2 J( S
这里的3个结果又是怎么出来的呢?
) T( R* w+ |, f/ c9 d& B. u1 X6 z, b7 E! N- a5 o! q4 u
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。
, h1 V' _( f0 i& U5 k6 B7 B. _$ f* F8 r* e: |8 d
微信图片_20240229135745.png ( |* E" i: H" f# U8 W: Z

# I8 G2 S& ^% s" ~* X5 b/ k6 C
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。" U- H+ z9 _/ i& _( u/ ^
0 c' D. G( ^* J! i  X: d; o
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。8 [4 V4 W, }6 W4 i' l4 C& U
- l# |$ G; @/ Q% }, M' C7 S

7 y0 E0 D5 M2 D# Y" f8 V
, ~7 o7 `1 o. A* |$ t转载自: 茶话MCU
0 u- }: ]8 c# x# ~0 U* P4 V5 i如有侵权请联系删除
, `! B2 d# E- [* P+ m  ]8 l3 x* S8 V& ]8 S

2 _$ I' U1 e- N
# z- Z# D$ X8 C  K- o8 g! _& Q. }
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版