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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。
* ~; z( j4 D0 N( D" K, a5 X% c& Q/ s5 k, g7 x: {
下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】
3 @6 j% h9 U9 M$ G7 h8 E6 [" W( ]& J7 _  |4 n' Y1 b! f
7.png ) L$ a5 _! |! i6 }& h

, Z/ S! A6 s0 r, F1 T9 U使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:
7 D+ x# _- ]) V. H
3 [$ q: O7 f9 C. W4 _3 l( P1 d
6.png
) R. A8 {* |0 ~- R' b, ^
5 `4 e9 \2 U& Y0 t
利用STM32CubeMx对ADC的配置如下:
( |! _2 ?6 P2 ^& M! \5 x  T  h
9 |- a3 H5 W* p" t! J) F* i& {# d
5.png
, q$ ~5 O( L2 f7 I/ x% O

  T$ @( |+ d0 {7 q保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。% I$ S9 U1 Y2 ^: o1 \! F5 R, g
- k/ q& f; d2 a/ D3 r( w# c
第一种情形,先启动ADC,之后启动TIMER。! E- j* U* o8 `% u0 Z" b4 ~

$ ?5 [! q6 {" D& XHAL_ADCEx_InjectedStart_IT(&hadc1);2 n8 j2 p/ z  T7 J0 g3 J
  p2 Q6 W& m+ O$ u! n; Z2 b6 r4 @
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);5 l5 v& M4 k4 g
. I6 s' ~+ V: D* N/ @( t4 V
CCR5和CCR6的参数如下图配置。
* h( e1 S) \4 U6 \4 S9 J( o2 `6 w! R& {% j7 `: I: s8 |
4.png 8 a0 `8 p# @2 S; L; E2 `) G
4 F( B/ N& J4 T9 B: @# b9 _
这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。  p; D& {; S  W7 r3 a% V. j' |
4 l& w" l+ B( U8 p, o- Q
第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。- c6 e5 c  A# }( g% d  T
3.png * N8 ^7 J- b8 a8 {

  |; \1 F0 d' _5 q% ?明明4次触发,怎么只得到2个ADC结果呢?; H2 [. N# A0 p/ e) r- z( U. [+ z
- }2 e. |* B$ r0 ~
原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】1 O) t/ K# S7 t" @
$ r* g* b# `% v% f
2.png
) p; s% h. w/ U3 Y& W# E

! R8 [7 @" m% P# K第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。
  M9 S  |9 m) \7 t3 f
$ G1 b) {8 `; ?& c5 `" Z; T
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);+ {8 ^1 B7 @0 I8 |. y4 }. I) i0 p. f
! s: G, A1 j& T  o1 X0 R
HAL_ADCEx_InjectedStart_IT(&hadc1);' J0 v8 N$ D# _3 v

+ E; Z  `9 l+ D7 B" [) n
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。
0 }, @& a9 q' {% c% s: c) J% c  E" K$ e7 u4 T* t" S
微信图片_20240229135801.png 7 a1 V8 ^0 v# L
. p/ [: p" f$ R- n: T0 H5 M
这里的3个结果又是怎么出来的呢?: u! k+ b0 h7 v3 ]& t+ E) p' }

4 e( [) u: E. ?4 X- a% r- ~/ o7 n
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。. q: E9 M+ }3 \' ?. u0 o
$ i/ m- `- _# R6 W' p
微信图片_20240229135745.png
+ g: h* j! H0 X3 _% u) |( L: c0 ~" C" m% h" g  V/ i
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。9 ^, L0 i$ G& V; j5 }  b, p8 z

- r$ j$ h# b0 g# D
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。- S  M& l6 }8 C) Y6 y  o
) o2 [  C" h* t' E# e
* i( [8 `( s; W& `. k4 n5 {$ i, R. m# c
9 l5 p: u4 y) B+ M! j3 q: a" I
转载自: 茶话MCU; u2 H7 v3 p3 C
如有侵权请联系删除7 j, a0 P1 X% r# }. P" \9 s! ?

# b* D/ y! Z- Z+ O7 t2 G+ `* M6 i6 @9 C2 B3 s, b

, |7 a9 ~" O4 o" H' n0 e% o- Q- }9 i: e
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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