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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。
3 J8 _% h& B) @, ?* q5 z
$ @, W3 c6 l  Q下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】; @( g0 O/ u3 P) S% K0 ?4 a

$ M5 b+ C8 q- {, D! Q- y
7.png
6 i9 g4 W3 Q8 k

. s# z' }. V7 W4 q2 s) R使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:
) g; e. V3 k/ s
5 m* v/ D$ H2 B) G
6.png 4 a4 c" e2 u  x

% ~2 ]  M  Z8 D/ R% Y5 J; w: }; E: Z利用STM32CubeMx对ADC的配置如下:3 \2 _+ Y2 n- {% v1 j9 @- V

+ K6 l) H, q! r4 n
5.png
) d  A9 O- x% `8 B: {- m
* G3 t( |0 a  V  G" |& L! ]+ D# X: _
保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。6 T, M* S4 a" @/ O( y# R! k6 `7 r
' F( e; h. i. b; K5 b5 Q" }3 A7 B
第一种情形,先启动ADC,之后启动TIMER。$ D& r% I" I# W

! C6 g; Z) k2 D4 N' a, ~0 x. ^HAL_ADCEx_InjectedStart_IT(&hadc1);
+ P. i7 E; n8 [3 Q, W* k
5 I. g3 `1 b: x  t0 V
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
; z, D" O2 i( G  B
7 }% x1 ~% W- h$ q' {, e8 Y- u: JCCR5和CCR6的参数如下图配置。
& ]' e/ I+ {" K1 g& s' u% k+ U9 f3 ~. Q8 L
4.png # x' N1 ~7 j/ @1 c! ~+ H4 q' _

2 N9 D$ w/ y1 a& ?2 G这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。
1 f# s' d  m$ I$ |
2 X2 d3 z% B% U: D+ w第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。
+ L# V, _- l6 K4 d5 G
3.png
8 P% `) X8 b0 R0 p. M
; y* |& l* r/ {( b& S( B
明明4次触发,怎么只得到2个ADC结果呢?( |3 I3 [  C* J- g# R. W! Q( M

6 U- w" J: H" K- ]8 Z1 [原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】. H4 R7 I9 i9 h2 i; y6 A) o  M. F
. k: o! c* O5 ~: Z9 q  ]0 t. V
2.png ; X, ?# c2 m/ Z9 A3 u% F
( b8 _) \& \, P! U" K) U  I
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。6 c, G& I2 A5 X& o8 Z
7 @) w: t4 R  P) p6 A( ^
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);. x1 M9 T/ m: H0 h! m8 e% I
* H8 M. d' j1 P3 z8 i
HAL_ADCEx_InjectedStart_IT(&hadc1);4 k1 t% W$ g6 I: s. ~0 V( F

$ A9 r: Q9 H8 }
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。: |2 d/ V7 ^1 q# k
/ W, |& m$ ~5 R# R! N
微信图片_20240229135801.png
4 d( j! o2 @4 ]- ~: w
8 Y4 |  \- _; l
这里的3个结果又是怎么出来的呢?
# V, W9 C% I/ d; s. `+ q$ j' m: |; t% b, y' x, n
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。) r/ N; {/ }/ Q) X1 B& T

. x! j( d5 N) s/ q
微信图片_20240229135745.png 2 H0 S& z6 _2 f- D/ }

! [/ @1 E* I! J  q6 e0 K3 d9 Z$ g5 C/ d
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。3 O) |$ \: `1 @1 ]
' q6 ]; l  F8 }2 U( M- S
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。
0 D' l: l8 G( b" G* g4 L' w% _4 o6 `& @( |  L
) S; ]9 F- A: H

! ~7 F1 Q0 _3 r. I, Z! c8 ~+ z转载自: 茶话MCU, M3 Z7 I" v% Y0 v
如有侵权请联系删除
3 K% f1 l/ t1 A- [7 y4 F
3 g0 P  T" v0 O# F7 K" i% P
* V  e6 C- N: h6 [6 @& A& _0 p+ }! z& p5 B1 u
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

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