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

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

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

7 `4 C8 c# s; Y7 R3 g: X% O下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】
' j9 G4 b& B, g7 T
& l# u, d; V' d7 U1 E
7.png
0 x3 S2 M% R& P4 n6 D8 S! |

: y/ U2 b' @* g$ u使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:
/ {8 P3 a6 b: G" q/ I8 p+ h1 q- u* A7 H, D! `( C+ t8 T$ g: {
6.png
* G% r* \7 N- s- {4 `

+ b1 W& l- G8 D. M4 q. W2 ~5 D利用STM32CubeMx对ADC的配置如下:+ E& H5 S" Y7 t" M" H( M7 l
. x3 [# {8 o- E* X) \& F
5.png
, s/ r6 T$ H$ Y' ~: h
2 T' |0 _* y4 w. r
保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。. P% p& g( A5 f( Q
: @7 m/ l! g6 B1 v- B  F# M
第一种情形,先启动ADC,之后启动TIMER。
% f! L: ?: Y1 F8 q8 D# x
4 M) v7 |  ]/ Q& d+ R5 f6 s6 ^. OHAL_ADCEx_InjectedStart_IT(&hadc1);
( A9 Z$ F3 o- D# f
& X( \- L$ m* z  T0 M, I8 }
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
: v+ C# B4 o; Z" F" D0 i
  g+ ]. F+ @; C+ p+ [) fCCR5和CCR6的参数如下图配置。
) m: w5 r6 k6 s" C* h- ?5 E# n, b3 T0 M4 m' j4 i- O7 r
4.png ! [9 D) |7 h, r& ?2 n) J5 I2 S
$ B( q2 N* Y$ L1 W; @) A
这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。
- A# F" v, a4 t" t6 D' Y" l
# ]. q/ `2 |+ U第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。
' l4 H. T/ d  }6 G: h  w3 k
3.png 1 H8 L( f0 L. a

7 E9 T  D* l% O9 s$ r! D/ x明明4次触发,怎么只得到2个ADC结果呢?
- e: E: s( B5 f0 z
- H1 w( I- t' z原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】2 Y/ u$ A+ e2 [' C0 u2 o4 }

5 u2 R6 S* Z. c; b" L$ c- q
2.png ! q3 m' x* ]8 O/ v' Q3 X
/ f- _3 d8 c, c" P
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。) ^0 F" m4 Z2 p
. T; e+ I7 s" I! o7 ]
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);4 E' Z' T8 P1 h  l

6 C4 v  B& o8 [- B- C( _
HAL_ADCEx_InjectedStart_IT(&hadc1);; G+ G" D- X8 T6 o& e3 z6 M

& ]  `) O2 r* z7 y: A/ z9 ?. c1 \" p
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。# Q. F: K4 s9 i7 D. f/ T5 G4 E
% [7 T5 d9 e8 r( z' g7 p, {+ a
微信图片_20240229135801.png ( g- {0 G( M0 Y5 B- U' e8 a/ v

; @8 T" x9 Q, z7 U  _! Y- i6 D- [
这里的3个结果又是怎么出来的呢?
+ F' b  V, Y9 }' B7 h: T* c: I
9 H/ ?1 i. W9 ]8 \: D4 Z- s; f8 ^6 p
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。' l/ Q) ?* \* M) E
: O& v  }5 m3 `& P
微信图片_20240229135745.png
0 S( R- i; K- A: x4 a5 ?. I+ u1 e2 V) n8 s- c' X# f5 y) M
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。2 Y2 `1 I1 F6 `

0 J4 _9 q# h! D) x% N
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。
& L  Z0 C: g" V% O2 s' q$ W' w. d) U- Y" `! v: P) {8 m

* A9 C9 _. e2 H. L# x
8 i0 Z& P# d+ Z: v: X! L" c转载自: 茶话MCU
' n% P3 p3 P9 b) s+ \* U# \% W如有侵权请联系删除3 J- E" F8 w# N/ ~- h
" r% K$ c2 k' }0 X. ~

( Z5 p' r; y( g  }8 {
( a- [6 g. \$ ?- ~6 M5 _
赞 收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版