有人使用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的触发】 使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】: 9 D5 G. U, W# r4 O1 z. K( \ 利用STM32CubeMx对ADC的配置如下:) H8 x# f3 K% {9 J9 F. {* G/ q% ] 3 F: |. V* g+ ~) X2 N) T2 M5 P 保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。 第一种情形,先启动ADC,之后启动TIMER。 HAL_ADCEx_InjectedStart_IT(&hadc1); / a1 c, M4 ~7 n2 d6 \3 l HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1); CCR5和CCR6的参数如下图配置。 5 a* H: `. U/ V 这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。 第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。 + V/ C2 S2 w4 J& B& z 明明4次触发,怎么只得到2个ADC结果呢? . ]# ?) A( p7 H% W, s: m1 u 原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】 第三种情形,配置跟第一种情形基本一样,并避开第二种情形中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); ) K, V* b9 [9 k" [ CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。4 Z) J" V& |! T9 U( X1 h ) M$ P( T" \# L; I) Y: S / j6 J& h" x6 g: e 这里的3个结果又是怎么出来的呢?* ]- Y9 z& n8 x8 |' `! }( Y4 i 原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。+ N7 l8 D( a6 h 我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。4 b% W( { _* }3 p g# | 5 f- q# i' ~ W% l; ] 我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。 - o$ f/ P4 v2 N/ ]9 \: o& S 转载自: 茶话MCU 如有侵权请联系删除 $ d5 k; z* Y5 q6 w T" c 7 O* Q0 [- Z1 N w* u M7 _ |
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
【狂欢三】STM32C031使用TIM定时器DMA方式实现PWM输出(二)
【狂欢三】STM32C031使用TIM定时器PWM输出
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
基于STM32使用ADC的多通道采样经验分享
基于STM32利用ADC+DMA采样显示经验分享
基于STM32的ADC+DMA采样与板载运放跟随经验分享
基于STM32F407和Cubemx的ADC采集+DMA传输实现简易示波器经验分享
基于STM32CubeMX实现ADC的经验分享
基于STM32的ADC+DMA采样与板载运放跟随经验分享