|
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。 , a5 X% c& Q/ s5 k, g7 x: { 下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】 7 h8 E6 [" W( ]& J7 _ |4 n' Y1 b! f
使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:
5 `4 e9 \2 U& Y0 t 利用STM32CubeMx对ADC的配置如下:
保持上面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 ~ HAL_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的参数如下图配置。 ! R& {% j7 `: I: s8 |
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
明明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
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。 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 CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。 % c E" K$ e7 u4 T* t" S
. p/ [: p" f$ R- n: T0 H5 M 这里的3个结果又是怎么出来的呢?: u! k+ b0 h7 v3 ]& t+ E) p' } 原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。. q: E9 M+ }3 \' ?. u0 o $ i/ m- `- _# R6 W' p
: c0 ~" C" m% h" g V/ i 我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。9 ^, L0 i$ G& V; j5 } b, p8 z 我们知道,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! ? 2 G+ `* M6 i6 @9 C2 B3 s, b |
经验分享 | 通过STM32 TIMER的PWM功能模拟输出正弦波
STM32H563 ADC+TIM+DMA应用演示
经验分享 | STM32N6 ADC DMA 传输失败案例分享
实战经验 | MC SDK V6.x软件HSO功能ADC采样设计说明
经验分享 | 利用TIMER定时和捕获功能实现编解码演示
STM32 LSE 不起振排查指南:五大核心原因与快速解决方案
我心中的ST中文论坛
经验分享 | 利用STM32 TIMER实现同频跟随输出示例
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
2025软件工具兔哥知道
微信公众号
手机版