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

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

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

& t" }* d3 \+ b9 |# B$ z. X下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】9 w4 j9 E$ u6 }2 m
6 @: Z1 e3 K& d+ C+ t
7.png / R) `, _& o$ v0 ]0 L* N" z4 Q
8 e' N% [' b4 y& y
使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:7 e0 N. Y. k/ g: O) Z

" ]/ Y' b6 p4 Z
6.png & h5 m' l7 B7 }8 f6 m  v
2 r4 B/ j1 n  `
利用STM32CubeMx对ADC的配置如下:
, H3 g2 [- o6 `2 }5 a3 M$ v1 v) e" S  ^9 Y* M6 x
5.png
7 X  r8 H# b0 Y: y+ @
% h" T! A" d! Q
保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。
$ P5 x5 B& K3 }9 ?- N/ x
& a: X& ]1 z& z# z6 k/ ^- U( J; t6 n第一种情形,先启动ADC,之后启动TIMER。
8 J5 v/ K( R# T% W2 O0 V% x" b6 U! A! K
HAL_ADCEx_InjectedStart_IT(&hadc1);
: ~0 O' c8 U8 ~% ]+ q
, k: c' y* E% Q5 r  n0 X: v- E7 @
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);" `6 S4 @6 V1 g6 [  D( [

- z1 R6 e+ F. n# ?! }  c) {CCR5和CCR6的参数如下图配置。
5 R! o! @0 p: d1 f& ~( t' r" c: k4 o# m$ ?: l# \& c
4.png
& g! x0 G' Q+ Y
+ M9 M( Q$ A4 ~7 }+ X" O
这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。
4 W. M( Z8 @: q0 r
$ b" p2 P2 d& Q% I第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。% R8 i+ t! F/ R3 G, {
3.png 7 w; a* F* u9 M9 {9 u" t8 Y: s
$ d4 w. H7 o8 l# f
明明4次触发,怎么只得到2个ADC结果呢?
9 Z5 H, S# Q- K; a" J' Z6 R7 F3 S7 |! U6 x4 M
原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】7 H. U/ I9 m2 v( e; t

7 B, s4 N4 v' M: c6 c
2.png
% o3 ?5 n2 q' e, d. V" l
; B: {9 X# `% _* a8 s/ Z  y. @
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。& v+ G7 p) O# y: F0 @: g

; w' ^% t6 B# s1 s& a
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
$ }* C/ k, H3 m+ M, }- g: t# v4 n- \( Q  F3 R' R# }- k' I2 W
HAL_ADCEx_InjectedStart_IT(&hadc1);8 i' {$ m$ q6 o  r/ M

5 ~+ Y! F9 X3 J1 l4 I
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。) k! Q# ]$ Y, J

, p" D& S4 K  y. a" S  J/ [ 微信图片_20240229135801.png $ Y' F, a' D9 a1 i2 \/ `

3 p! ]8 T, c0 q; z( @: L$ ]8 G, \
这里的3个结果又是怎么出来的呢?
6 W- k, b, L" V* y, R+ E3 v0 `$ |  Q3 @' b
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。
6 \$ m0 U  A6 R  i* T' ?. M# |5 V- C( T
微信图片_20240229135745.png ! e3 |' Y4 v3 s: C" C1 z. w

2 x. V" b5 P' c+ S4 X
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。6 J4 ^! v# y* `- D# Z
2 ?- d/ \" s" `  a: _9 I
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。; [  f  @7 A) _

. k9 {+ n5 g6 A4 `2 K" S& X" o( @' j$ K. z, Z# o; ?; `2 q
& ~: c! v6 b& B. N$ {; p! t
转载自: 茶话MCU6 G' T' w& H- C/ [/ c* r
如有侵权请联系删除
2 O5 W) `0 L: M4 w$ |" x  g" H; L5 r' t/ p0 X5 Q& S& g
! j8 t2 V3 Q# ^4 k$ K& j# |2 h

' v8 p) {" F+ \+ Y7 U3 R" o
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版