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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。# k1 g# o6 S& O1 @7 O8 a! W3 ~
( p* j. K/ r' Y- {+ Q  W
下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】
. M8 I8 F; A+ R, a
$ A6 ~7 y3 m1 W; z# {; a2 g# j
7.png
  [- _6 l1 F4 R4 F0 N
& ?6 _! m4 x( x# H4 J  W
使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:+ I+ K4 g$ Q1 y+ J1 Z6 b
; L$ {% h/ p) d# T. ~- L2 k) v1 g8 J2 x
6.png
  w& D1 f. D0 C5 i3 [# R0 [) H. w

( z7 X6 J7 A' _& F利用STM32CubeMx对ADC的配置如下:' j) L5 a& H( j' e  S( e
) v. x' r0 c- E" N5 [+ C  j7 g
5.png
- T  G; w( ~/ k

" k* d; s1 ^$ M) p+ M4 ?保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。5 i6 b0 N3 O- Y! n: u4 W

! N+ _# g! \8 Y) l第一种情形,先启动ADC,之后启动TIMER。
6 |3 B& U5 y1 J' M
- D  {$ |+ h; kHAL_ADCEx_InjectedStart_IT(&hadc1);7 Q; g( S7 }; V. G  F: G. r
( R. `8 N3 @. s3 [
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);  O7 B: G! _- d8 k

5 \1 H2 B$ g4 z6 p0 ICCR5和CCR6的参数如下图配置。
. M! i1 v3 A2 O$ u( L: g: }! P1 p8 I6 L9 i
4.png
! C$ K! `6 S- b: z. G# Y# N" _
# F7 E8 G8 L- d" F% d% F
这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。: u& `. g# W( J5 S. e/ I
. P8 f( u8 N* @" v+ }
第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。
* q; n4 C4 m/ H% J4 N7 P
3.png
9 v7 G5 E! q$ l. p1 E. V" W9 q9 C

) F: I, N* o. v" ~: f. t: J; U明明4次触发,怎么只得到2个ADC结果呢?1 S, e1 B* q$ w( U6 ^

2 F& i2 |7 Q% v& N$ p, o. }7 a原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】  ~9 q; {" n4 f2 c4 i8 f

, W& O7 `$ a. O' Y, K
2.png ; I6 M. Q$ h4 @3 Q* y/ O, V- }# T

, {4 h% D$ r, M) r- W第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。
' n* j2 V) h4 |5 E. H; E# K* k( C2 j. `
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);% |3 q# Q. O2 `5 r& z, Q) W
. h/ r, g) J/ i- M! D' I+ J* N5 v
HAL_ADCEx_InjectedStart_IT(&hadc1);+ B1 @6 u& |8 F. P) T
6 U! y4 n1 R# i1 E) s. B
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。
: `4 E- P2 I1 u" i4 c; B0 [7 j& k  Q0 ]6 I
微信图片_20240229135801.png
, Y  G& L; O: j3 s* |: I; W- s5 ~! v& S& @
这里的3个结果又是怎么出来的呢?
- [# }; `0 g3 Z% M0 F# {) t, t- w# K7 V4 o. }8 O; [* ?+ X5 _
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。4 q+ C( i. g+ }: u% n8 x
% w: i3 ]5 Q9 h$ s2 b
微信图片_20240229135745.png ( y2 a& m& M5 E
; ?* F8 \! b1 A3 {2 N2 [' x
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。. d- p4 ^; R- \3 D* Z% U

2 ^  g: j. Z4 x4 K6 d" [3 W1 C3 M
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。
* k2 W" v4 S+ `
7 d5 P9 Q* l/ z  ]4 s; P# T5 m3 X& S' z4 q3 r5 q7 M  N0 R
2 B; E) F5 s- l& T
转载自: 茶话MCU6 c' k4 ]3 C! V& @
如有侵权请联系删除
- }" d3 Q$ o2 n9 I; h; K( l1 |: \+ l5 {, Y
2 T( n  |1 E. Z* }, G: R- s
8 p; s: p4 j: ]% _
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

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