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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。9 O, }* g8 t  Q& \, \% o) e3 D
0 Q, R% ?4 k* e: G+ S
下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】
& K- H% G# a9 K3 ^1 @) e! l
' A, G% Y5 [) r5 i) G+ F0 X, ]
7.png
) h+ |2 ^. x5 C+ `0 b

* N! Q2 g1 m) X1 B' L5 |) h/ D3 G使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:
6 f: i( s9 m% A0 w7 l9 y, a9 D5 G. U, W# r4 O1 z. K( \
6.png ( w, X- p2 O* j2 ~% V' U; r

: f$ q6 e  ]* H6 W1 n- w+ O. a利用STM32CubeMx对ADC的配置如下:) H8 x# f3 K% {9 J9 F. {* G/ q% ]

# @9 ~! t; I" W& |3 D1 y# N
5.png 9 }0 U1 J+ b! L) N
3 F: |. V* g+ ~) X2 N) T2 M5 P
保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。
. {1 i% }  B. b, \: {5 z% d: s/ P
0 V5 o# m, ~  j. i第一种情形,先启动ADC,之后启动TIMER。
' {5 P) F' ]+ L/ n' O, t7 h
3 D! ^9 M& o. a5 C# P1 G- h& oHAL_ADCEx_InjectedStart_IT(&hadc1);
2 e5 A1 u: E( J9 \. Q" ~) j+ V  o! c& Y
/ a1 c, M4 ~7 n2 d6 \3 l
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
1 i: f; M" F) _- T8 C1 v
# C) ~; q- Q/ H* l" J0 L+ K2 e: SCCR5和CCR6的参数如下图配置。
( C3 Q4 `- r/ F" k3 e& l  D
- U6 N( C1 x# g
4.png 1 o+ `2 R* B$ E2 J; s" s
5 a* H: `. U/ V
这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。
+ h& F6 W2 C0 P/ m2 D4 j
0 o: U" G0 k" y第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。
' r3 s, M1 m, |3 c+ R
3.png 6 A0 C* B3 \- G; ?  `/ m  L9 B4 x# I
+ V/ C2 S2 w4 J& B& z
明明4次触发,怎么只得到2个ADC结果呢?
* [4 h" y, G* F% S. ]# ?) A( p7 H% W, s: m1 u
原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】
, }8 h, ^. K5 e; F4 ?9 `. x
. a) O7 {  ]3 ~; f/ J8 G
2.png % V% [, i7 t  a8 f1 k

( _9 R3 t, l+ b$ _# p/ v# q第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。9 y5 u1 b7 \. d. b) m) N; x
8 n$ k0 s2 ~' ?; V. P2 C
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);' t$ Z+ E( Z1 z2 w0 B' Q1 |/ [
, G) A/ |3 V/ ^6 `' [
HAL_ADCEx_InjectedStart_IT(&hadc1);
: ^2 v3 J# u& j+ u) J) K, V* b9 [9 k" [
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。4 Z) J" V& |! T9 U( X1 h
) M$ P( T" \# L; I) Y: S
微信图片_20240229135801.png % U0 ^4 ]: K& k+ m% n- B
/ j6 J& h" x6 g: e
这里的3个结果又是怎么出来的呢?* ]- Y9 z& n8 x8 |' `! }( Y4 i

6 L# u) N: P% e6 `
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。+ N7 l8 D( a6 h

, f( z5 V2 Q7 Z2 C- g( R, y, K, b
微信图片_20240229135745.png , `3 G- T" N9 j

' d0 _5 }1 I7 m6 l
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。4 b% W( {  _* }3 p  g# |
5 f- q# i' ~  W% l; ]
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。
* z8 I( g' B: [0 b$ E+ D
- G+ s: F% f4 Q# K/ Q0 Q& l  z- o$ f/ P4 v2 N/ ]9 \: o& S

5 {) _5 ~! Z( \" u9 `! e8 E' x转载自: 茶话MCU
) @- K+ h* ^: h* c- G( z; P如有侵权请联系删除
2 t8 A1 |: r2 t3 k# d6 e/ S9 v% C$ d5 k; z* Y5 q6 w  T" c

* Y' d/ P1 v! i  g( f: p9 h7 O* Q0 [- Z1 N  w* u  M7 _
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版