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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。
( S. V. a2 r  y: o( {
8 R8 h/ P/ J* K. w5 c+ w# a& `下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】& B( b. M0 y* k% e- r4 }

4 O0 I% I9 i3 j6 h' a; j1 i' N
7.png   r, F- c% W! ]7 z$ y+ n/ r' h8 H
* P9 u4 i! Z5 t" b8 \/ f1 L
使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:
9 K2 H$ b# W) ^: m* `  Q3 H( ~2 t' d; T
6.png 6 q1 l; E; ^2 O9 U3 @( o0 E

2 C& \' X- F& G/ Z2 L: S1 D利用STM32CubeMx对ADC的配置如下:
  a1 q" m$ k$ X2 J. H  q+ o
. _/ D: U: l7 i, M/ [* v* ?4 X
5.png & W7 b* v. Q. w- x3 w+ B& U

" v1 E' X0 N7 R保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。
4 o+ Q& A# K4 N2 }. r% ~5 [5 C; |6 o( [) ^1 j& T) |* g) S
第一种情形,先启动ADC,之后启动TIMER。
# F( O" |  u# S- F, w. G* v+ J8 ^+ E) Z. y2 b9 c) _
HAL_ADCEx_InjectedStart_IT(&hadc1);
  p5 |+ q1 {# B* c
8 [) Z7 f4 q5 G- x# W3 B" Z. m
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);# ~4 A+ ^" J/ \; q: D. E* ^$ u! Y6 S
! f' W1 a3 z2 h
CCR5和CCR6的参数如下图配置。
8 J4 m/ G- X* B& Q! l+ y/ ^: Y2 |7 k0 A- B1 d3 b6 [. l8 f* F
4.png % I+ h. u6 m4 X6 }) u6 q, k) u* T* O8 y
) W5 X$ K* `2 Y! e, W: ^
这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。/ k/ M' I' H9 s* q7 {+ F
) t! E; B/ @8 Q0 S+ Y: |
第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。/ F( h* E9 N9 N; R( @
3.png * `' }. c. H& D1 e- @
  R8 x- T8 M& d$ I. F
明明4次触发,怎么只得到2个ADC结果呢?
1 @; E5 W1 A9 v) u: \2 u% j. J7 F/ \$ W. w/ C
原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】4 i- b0 Y3 m% X. G( `4 v9 \
  P  \2 R) \! X
2.png
+ x# D, z5 m' v0 n& [7 E5 W
$ j+ n8 e, a) m+ R4 Y  j
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。* \, D2 s+ h& w

/ c2 q) `$ l! ^8 h6 [: E6 z; w
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
; s) F: k3 i* X2 c" T6 q5 J' R: n9 b
HAL_ADCEx_InjectedStart_IT(&hadc1);
* x2 @, \& x; x" J/ W2 \0 {; Y# b! D" e9 |% s$ X" P6 |
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。
+ X6 c+ N. b( ^. g' ?( F  X- z  W
; ~) ^4 e' ?% V 微信图片_20240229135801.png - ^. `3 w! b8 b1 B# t. Q* X0 G
; J" L3 _) p! Q% [* k# H( S+ A
这里的3个结果又是怎么出来的呢?
6 [0 F; d; G, j! I- G' @
% ?3 v! L" b: T# n8 M- v: ~4 Z
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。
3 @* r" G4 k3 b! e# P# h
1 P7 I. @% H: J- W
微信图片_20240229135745.png
" k; [) B) l6 C) X: r. i- _4 f: b# p" t" `9 N
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。
/ }$ \! G0 e; V# N
( W$ H7 A0 y, x  i# Q( ?
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。3 Y( h; |6 E$ ^. L
  m4 i6 b( o6 H, G) D& |$ \
  _, i- Z9 `0 `# y
% v, }& c" |$ H% u/ y# ?
转载自: 茶话MCU
+ @; r' S% u! m, B如有侵权请联系删除
8 C- Y7 {1 \+ r( C# z$ D2 P
+ F7 Q5 D0 B' @' e
* i, w# N# l% L0 \1 A# a; q: J# @, U+ e( J( O
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版