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

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

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

6 B% `7 u. i) t" f, \下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】
# T. P+ `, x0 x6 `" C. A
5 e, o( Y4 `- _2 K
7.png
3 H% s; c1 T2 F7 b: `6 H

! O- M- q7 I# v  N使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:
/ o- Z/ y* e- R& O# F& `3 O5 f# ]# P4 M0 x  a
6.png ) _. K% r% I& ~5 t' c" L' L; @
0 t, y2 n( E* i. _$ T! R, N
利用STM32CubeMx对ADC的配置如下:
5 J: V% J/ Y" q2 B
7 i4 O' u+ f, V" M; [8 a/ S4 {7 I
5.png
: Z8 e* y. {8 ^2 y9 ^$ @

' W- C5 k# D7 E3 y保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。
* u. f0 Z: o9 x
. c- g* w! B# s( W& A  g' \第一种情形,先启动ADC,之后启动TIMER。+ Y& ^$ z2 f7 q# d1 v; L
/ k* \/ d1 Y, X9 P# A
HAL_ADCEx_InjectedStart_IT(&hadc1);% U9 [7 C+ V- C8 \1 t' Z
6 }1 [! I5 l& ~8 ]/ ~. {
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);4 \6 `; U) e( z8 p0 m
# s, s9 }6 h2 U. |, w% {
CCR5和CCR6的参数如下图配置。- D0 Q6 R1 u; Z7 ?! x
! P# B) o5 d! g& L, k+ K9 o- d9 m. q
4.png , S! {, d5 n- }

& D9 ]- W9 H" N( Q4 J* N( Z% ?4 R这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。
8 w  G* h9 x* z9 [" d- k% {+ g7 S4 p9 g* X+ u) m, {
第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。
6 ~6 u6 }2 n; q9 f
3.png % x- }$ S+ N" c' b$ F1 {. Y

6 Y: y) P; c/ g' g明明4次触发,怎么只得到2个ADC结果呢?4 U( ]% }: n/ C. Z) A

9 w0 k1 o8 v- i: Z- z原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】
  |. \/ }, l+ u3 ?. [: X9 _6 W+ ]0 t5 j& A
2.png
& d, R! y9 U4 z2 e! F' C

0 N+ e3 y( C/ \* {1 F& a第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。! ~, N# v& e- k) _& I: X$ ?4 T% p# l0 L

8 @, Q0 g, g7 n" J. j
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
! w7 x$ _2 T" c) |' r/ d3 D
3 ^  a- G# C: d- T, K0 B7 C- \0 @
HAL_ADCEx_InjectedStart_IT(&hadc1);+ Q' d/ @$ x9 }- O

  X5 \! W7 a1 r5 ?- X" P$ n
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。
, e, c. z1 A) @* S1 u
5 m8 m' E  G: y% M0 s( E( |+ X 微信图片_20240229135801.png ; i. s) |1 ?# Q- ^
* v- |) p1 o: Z+ l
这里的3个结果又是怎么出来的呢?- h) i, b0 e# ]- |
" ?4 n0 A2 z+ t' M" i- x
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。0 i/ y% O; \3 W  e5 Y' ?$ S

- ~) }, g8 d' [. e2 x5 X! p+ s
微信图片_20240229135745.png
% I; l2 I& S0 F. |5 V+ T) M2 ]& {$ U: A1 |, {9 R) o& e2 |9 i
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。6 b9 j2 H; v) g+ W4 S

3 }/ R& a& V: V5 _' [. c# w9 s3 u
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。. y* S9 u6 B; S( O! f+ X

. }, E! D; s- W! h8 ~6 w! b3 b9 i6 [$ z2 k. M( R) \
# F+ p8 `3 `: S! M
转载自: 茶话MCU
3 {- ^6 _7 l, r7 M如有侵权请联系删除
& _/ T: k* J0 y2 f$ M7 f- g
9 v3 J* v$ ]' r9 v1 `" d# e3 p0 ?
4 D! t1 T( ]: S7 ~2 E0 j4 }3 J
% P# F1 j; M3 \! r6 [$ I4 `
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

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