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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。
: r8 `8 I( }' A. K
, W9 f% ^+ ?) H* B( L+ C' u下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】
3 Y  c2 m7 p/ e0 q
+ o* T7 K$ A! M( u! e
7.png * y+ [/ L5 ]7 G
% R: r: v' [4 I8 ?
使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:8 U1 s' J: y! y* S
" J: A- B# s, t0 {
6.png
* t" M8 Y; Y5 j
1 t. S0 v: B0 g* f% Y
利用STM32CubeMx对ADC的配置如下:$ Q+ _& P8 e* y! w4 O7 E

7 K3 c! Z0 A+ w$ Y+ b/ N
5.png
# z  y) V& ~( M2 W4 w7 i  L7 i8 C2 W1 Q

, A$ h) A- E. p/ u) y保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。2 K1 n+ o% m8 p
4 L7 b) Q3 o! o. ?3 b/ @
第一种情形,先启动ADC,之后启动TIMER。
# w5 ?5 T' ]) j$ V6 E8 ]1 |6 I2 k5 x9 \
HAL_ADCEx_InjectedStart_IT(&hadc1);0 Y* C! [" o8 A+ g3 e6 Z
: Y: j; H, k' i; ]- x4 C  s% m
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
, m7 }% [, s6 N  c% S  Z2 W' g7 f0 b) d
CCR5和CCR6的参数如下图配置。
8 v8 f( L. O0 u
+ B, y6 R* v# v$ G/ V8 k- q# e
4.png
1 L7 i  z! Q0 _

9 D1 Y0 Q' n6 K0 U" ?$ H+ c# e这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。
; A% {# K6 V% K- r6 w! L" q) S) {
第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。% f% T5 `* T# [5 R* s( B
3.png
2 @/ u9 n. g0 s7 k; N
: w$ Y$ w* M7 r+ V# u
明明4次触发,怎么只得到2个ADC结果呢?, s/ ~4 X) L' Z6 ?' {# C
+ u3 B; R" P5 k6 s/ H; \! X
原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】5 a1 t& {" ]" L( s. \
. x2 n# ~1 j* M, n) [* J
2.png
* J- _$ L2 Q$ {
( @2 t+ ~/ g- I0 f
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。+ x8 f: Z  m" ~$ U8 F
1 f8 L$ A8 X9 @4 N* Z
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);) i' c$ p; i* H* g' i" }1 E

, d2 p4 F- g5 t+ r/ r2 @8 P: v
HAL_ADCEx_InjectedStart_IT(&hadc1);& ~3 A0 F" _( I6 V, {' N

4 C, q7 y; ^8 e9 R  S% p' C
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。3 h! \) G( V$ c/ {  m4 V. a6 C% x9 b- c

) e3 M  D* W& `. N/ e 微信图片_20240229135801.png / _/ \+ [1 n) p

2 T! Q: @9 h8 c0 @
这里的3个结果又是怎么出来的呢?
4 P; m' Z! I1 b! e( Q  c& w. \0 Z3 T3 Q2 ?! K. {* s2 \: I
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。
9 R  Z& B1 w  }- e4 [0 T5 J8 r) L4 p4 y7 U7 }# q% _! E
微信图片_20240229135745.png
8 M) i9 H: g& [* T% E. l7 a
+ ^& w9 J5 M; W4 l0 w' c
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。
$ f8 d: p2 E; l. A7 N7 ^9 V) X. A6 t# F8 F8 v4 u
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。! _6 F+ |: Q( \( p6 L

/ O5 G- U  A; _3 Z9 A* f. n7 v+ B8 ]/ q% y

* H" _- Y6 [7 Y. v  D; j# Q4 @转载自: 茶话MCU
3 P8 n2 ?/ i$ K如有侵权请联系删除
. [# f5 B7 X5 Y$ a% x* r( ?- K2 V6 `

( ?+ A% ~  c9 |9 R
1 p+ q; r% a! ~, k- Q( V
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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