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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。
, \& j6 b0 H/ X6 L- f. @" q# N2 Y0 I% e$ `6 M
下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】
2 @$ ?& o: t6 e. y
, [4 j: A9 _! Q  i) ]) a! S
7.png 1 l8 T* T1 {* V& |# a+ |
& X, w2 u8 i$ r  ]  M: k
使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:: L+ d/ }# |( ~$ Q4 I3 Q8 M- m9 c% f
$ w# c. @. n" r8 n, O0 Y( d+ q
6.png
2 f/ G% G, z' ^0 L9 G
. B  E4 q0 g/ u' v
利用STM32CubeMx对ADC的配置如下:
) K5 O: H$ g  v- M. D* o* J2 G9 j" o  u2 r+ n
5.png   G/ y5 _/ ]' ^- O0 t# \6 C
; A* X+ G/ `% J2 `; \5 X
保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。' E, V: ?; W. e8 F  M: D
; \, l8 W$ U$ p1 o1 P
第一种情形,先启动ADC,之后启动TIMER。
" x4 C8 R5 p8 I# u( H# E
' @0 Y* n7 ?3 Q7 X2 @! ]HAL_ADCEx_InjectedStart_IT(&hadc1);4 _' h4 n6 p, s: X1 K

1 Z) H5 w  v$ Z1 K  j# l0 ^HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
6 N! g' R  ^: R5 ?: N+ w! W
( J- U6 P8 t* R- rCCR5和CCR6的参数如下图配置。
1 q+ y& r+ |( O) [( Y; ?1 ]! b* F3 L
4.png
  J. E% a3 k6 ?3 |! ~

  _. q9 H) R  X; v+ m! a# G这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。  U/ _5 E+ r5 |" ?) Q* G" w

9 K. G7 ]( p! [% |& V  k' j第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。
( r& ?( ]" `  C, |# m$ J' v& w2 \
3.png " B$ W( X  _, E
( Z' t7 C- l. h% _3 m( \$ \
明明4次触发,怎么只得到2个ADC结果呢?
2 ^9 P* j. @" C# r1 {) J8 x, b( h$ ~; F
, p1 G; |& R' j9 H2 B* u' m原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】; q* T# m7 g. I8 M6 f& P" E; \

) r/ L9 Q& j5 Y$ F% O# G
2.png ) i) w4 c3 x5 j! p; E) ^

! k# i/ x) x7 V  ?第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。0 Y1 E- ]3 U3 X, O

3 x+ F1 h* c4 n1 j
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);' n' c" z- \. i5 k6 Y
9 s+ W# ~5 f& Q( }2 l
HAL_ADCEx_InjectedStart_IT(&hadc1);! A2 m, R  s2 D- A) _

6 w6 Q6 B0 c% g( H7 v; c- c" b
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。5 K% K! p2 L# K+ N% C# Z

. Z( x( Y; y* |, k- `* Y 微信图片_20240229135801.png
  ~! {9 t2 f% n7 S- {: K) G9 U3 @& x6 ~
这里的3个结果又是怎么出来的呢?' ^7 B1 m8 c& q9 q# j( I

7 [( i6 ^% G3 E4 ~
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。2 l% v0 G! u  x2 g1 `* G6 r2 B
' w% b8 w  Z8 {2 Y
微信图片_20240229135745.png
( \+ t' U# V' u: a! @' c1 T+ r
+ R- t$ _! }# v6 n! d
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。: f# E9 F$ D; h$ g
8 I% p1 K/ t& ]7 O
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。
# ^0 t& \( n1 ^+ A) E* e1 w$ q# E8 _" a+ i
4 ?" w. K6 @- V: v+ H2 h: K
2 L6 q$ O' j0 h) w+ u! B
转载自: 茶话MCU. ?. [$ j* }& B- q) ~) p) x: Q
如有侵权请联系删除
$ b$ B' \0 K( h: E6 o3 l, e& ]7 A2 U; e) }4 M1 [) Y& j' L

" O, h. Z" ]- c8 \4 B
6 N* R2 ]% p* ^( S' o5 ~5 x! n
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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