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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。
* `  k' t8 `( D5 r6 i, Y( B1 m. ]+ L0 q! ~7 U. @
下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】9 m) O2 l8 ~& B5 f2 E, i  R/ ^
3 v9 V/ \0 @: d# h6 Y8 G6 {% T/ X
7.png # Z" |" V8 v1 `$ S- ~4 \6 s( |! w. N
5 M" l* @  S9 s- l
使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:6 D/ H) ~- \# c: b
* ^: t! D( |( T% i( k
6.png # P  f0 f" }/ c* Y
5 {5 q) e; q7 Z, J6 ~; _* L% E/ a
利用STM32CubeMx对ADC的配置如下:7 L. W! r& ~% c0 C2 I# s0 G& y

: M% h& h! _( s  H0 q0 b
5.png $ W* d1 s2 a% T* @/ V1 |

. B+ l' L5 q6 L$ W; T" F. v5 G保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。
5 \- y/ \( n. H  x( t7 o1 [6 F
第一种情形,先启动ADC,之后启动TIMER。4 l9 ]; ~" M" E+ F4 W8 D" ^( @; f- U
: b/ \" w  ]6 T7 u
HAL_ADCEx_InjectedStart_IT(&hadc1);# g2 [) G5 y% [& S
) q/ r  t- ~4 P/ v4 D
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
2 e+ _4 R$ O8 k& N4 D& J! O$ p, p2 e' X) g: P* x+ k
CCR5和CCR6的参数如下图配置。; t# G8 @, B8 w( ?, N2 `) w# n8 i

: r: ^8 U. F0 s
4.png
6 v% I' h# d7 `8 U

  @/ c/ t# J; w* B3 p# g0 a这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。1 }  O1 _* s- Y) N

8 U( |1 K9 e1 Q0 g/ P  T2 n+ Z; u& `第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。
6 U. ?4 B$ d' a3 s" O( c
3.png , H' P- g) t7 j$ i

& \; P6 K7 f$ ~" A* Z明明4次触发,怎么只得到2个ADC结果呢?: K  {' O. e$ x  z8 Z$ G% t6 a! F

: `! }7 K3 Q" z0 o9 I7 @7 ?原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】! E1 n) A8 r: c' t5 O

2 {. |+ m- t6 o7 S% S& i
2.png
  w4 w9 F( w; E( G/ ^& _

, H; @( d( I+ M! o, `2 ?( u: E第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。2 r( G- }* j3 Y% D, W* g! C

/ n$ M7 O8 S& d
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);6 Y  T2 e# ]6 C% G7 Q! J4 f
! p* @' M" V/ h- Q6 H
HAL_ADCEx_InjectedStart_IT(&hadc1);
& ?+ |  V! G$ I2 j
9 H+ Y' r5 Y! X& s2 d5 m2 A8 w( M
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。
0 v7 a7 J# Y/ V% b: X6 x3 V& V: U" D9 D
微信图片_20240229135801.png ; O1 p( S. m  }( u) m
1 v3 ]1 ^1 o. m% u  j5 M
这里的3个结果又是怎么出来的呢?- ?, G* u: S' f( L

4 V5 X5 [( i& `0 F  \( G+ q' u
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。
! v& f5 ~$ X$ K- o$ \
* o# o6 g  y* M# ~, Q  O
微信图片_20240229135745.png
6 n$ w! y" U( [5 Y5 U  C" u; e. a. V% O1 G
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。0 P& k- f# r) P1 Y, e

# o1 X9 d6 O8 k7 x
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。5 p/ @  w+ }& d/ O/ H7 Q

' @" @& u1 k! w3 M$ f3 c! n8 b. O; J  J; M
& e! J8 E( ?8 D' W& i
转载自: 茶话MCU4 L; t# i2 R% n- D" n* @
如有侵权请联系删除
; V! p8 ^- c/ ]7 m( |
5 U) ~- T$ p9 Y* r1 ~. C8 d0 i+ i0 @* V" b, Q' K/ D8 i& C
( q, g* ?2 W4 Q$ o1 |% g
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

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