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

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

[复制链接]
攻城狮Melo 发布时间:2024-2-29 14:00
有人使用STM32G4芯片开发产品,其中有TIM8触发ADC1的操作。TIM8采用中心对齐计数模式,RCR=3,即每4次溢出产生1次更新事件。如下图所示,现在要求在每个计数周期的上坡段基于通道5、通道6的OCREF信号上升沿来触发ADC两次。ADC用到2个注入通道,工作在间断转换模式,即每来1次触发就转换1个通道,循环进行。3 ~% ^! s, D) y& B# L' J

; v& F$ g  ~9 @. r下面实验的两个ADC通道针对同一内部模拟信号进行分时采样,并基于ADC中断提取转换结果。【下图闪电符号表示定时器OCREF信号沿对ADC的触发】0 P7 @4 y% {( h" a
7 e* `' g1 ?- r; S  |) M
7.png
9 b* l. |' b( _4 g# `" }, G. |

6 A! K$ y8 g" K1 I  p6 `使用STM32CubeMx对TIM8的时基参数配置如下【注意绿色箭头所指的TRGO2】:2 D2 o3 e' q- }& o) v/ J

: w1 L/ z* z7 x6 E3 M( k* ^
6.png 6 j2 g, Y1 I) I) e( y& Y- T. @

' g; v4 u1 @3 v8 X' l# S) C利用STM32CubeMx对ADC的配置如下:
* @; {1 @. _3 x7 q, d" B
" d; B% ~! f3 |' d+ |- K
5.png
5 r) S2 C" b; R$ @1 o
! n, I3 `+ ?. V5 Q6 N7 x
保持上面TIM8和ADC1基本配置不变,并令TIM8工作在单脉冲模式,RCR=3的条件,我们通过调整部分用户代码顺序和CCR5/CCR6的参数,可能遇到下面几种情形。
* D, P0 a  d# x; F4 B9 T1 A9 q- j/ y
第一种情形,先启动ADC,之后启动TIMER。2 e2 I9 e; z* N
! H5 j+ @6 s# b- R5 x% t6 j8 A0 F
HAL_ADCEx_InjectedStart_IT(&hadc1);3 @( B! v4 l; V% {$ |+ j) q

; f# c  z$ g: g/ A' O4 d7 s; NHAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);& r& \0 Q# d% P! d; [- ~9 n5 g- @- w
5 a9 D, D3 \6 U# W5 l& G- s" h; m
CCR5和CCR6的参数如下图配置。" T; K) L) m2 Q" @4 C
; O9 R% n$ L- ?" `! q
4.png   M' l* b* C+ E/ R8 ]
1 k% m& b1 z- D. F4 ^
这里TIM8的RCR=3,工作在单脉冲模式,最后得到了我们预期的4个正确结果。9 ], _. Y1 J1 D! y% A

" c, k& j" P+ q4 W第二种情形,基于第一种情形的全部配置,我们仅将其中的CCR5/CCR6参数做调整,让二者的值尽可能贴近点。最后我们发现只能得到2个正确结果。4 R  |" T- ~2 N& Z
3.png
  g. |- J* T  P! L: l
* K4 v4 x0 j. s0 l- _/ Z3 X
明明4次触发,怎么只得到2个ADC结果呢?9 j9 _1 Y: ~: r. s0 C0 k' R

( J# e* p/ S9 E1 d原因是第一次通道5上沿信号触发ADC后,当通道6的上沿信号第二次来触发ADC时,此时ADC的前次转换还在进行中,使得第二次触发失效了。即每个上坡段实际上只有1次有效触发,最终2个计数周期下来自然只有2个转换结果。【下图黄色圈住的事件发生在前次触发的ADC过程中而失效】
! u1 V# z" k; k7 o, B$ X1 v( k
2.png
: n& Y) Y4 L6 k
9 ^# E; J  K. Z/ j- W6 P1 w+ Y
第三种情形,配置跟第一种情形基本一样,并避开第二种情形中CCR5/CCR6参数值过于贴近的配置。但用户代码跟第一种情形有点不一样,即像下面写法,先启动TIMER,然后启动ADC。1 L4 I! G4 f/ r& B$ p

* j9 V, B- ~, i: O0 n, h
HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
/ w" A5 f! ]5 k' h4 X1 k  e  T( X3 V% |) h
HAL_ADCEx_InjectedStart_IT(&hadc1);2 n0 r5 l( V9 W7 N1 Q5 B
1 P+ c5 g4 q! ^
CCR5/CCR6的参数配置如下图所示,最后我们却只得到3个正确的ADC结果。7 K" N# G4 A4 ~
1 D, I7 U" x& Y' b- `8 x2 M" V. {! u
微信图片_20240229135801.png % l0 Q. K1 L6 z+ L# y$ `( v' y
% I0 w2 y  ]5 g  R, w
这里的3个结果又是怎么出来的呢?/ e6 Q; S0 h) e9 Z+ g
' E4 U. |' H1 ?% h; j7 V1 u
原因在于第一次TIMER触发信号产生时,ADC的启动准备尚未完成,导致第一次触发无效,而后面的3次触发不再存在ADC尚未启动的情形,所以后面3次触发都得到有效转换。3个结果就是这么来的。结合代码和下图示意来理解。3 U. v+ m1 a+ P" o7 Y

7 L6 G5 _* l$ Y; w+ J9 K
微信图片_20240229135745.png 1 h1 |' |5 G0 R  s
0 Y# \: m/ ~0 _4 v% v
我在上面抛砖引玉似地介绍了基于TIMER的OCREF信号触发ADC可能遇到的情形,希望给相关同仁一些提醒、启示或参考。在使用定时器触发ADC时,注意定时器触发事件与ADC启动准备的前后关系、ADC转换时间与相邻两次的触发间隔的长短关系等等。
( E5 G9 p: e  C% X
: }5 n( _3 J( e; f) g: F
我们知道,TIMER触发ADC,既可以基于OCREF的边沿事件,也可以基于定时器的其它定时事件,比方更新事件、比较事件,使用这些定时事件触发ADC跟使用OCREF信号触发ADC还略有不同,我们在应用时也须加以注意。# z' _- N! [9 ^1 E* h/ o

4 V6 D) p9 C# M0 n6 z$ p* |: a/ Z3 b
. T. U# x; B$ }! q
$ d7 u  e" O3 A6 P( u- w转载自: 茶话MCU
  ~) T  b. r  d. o/ ?! X如有侵权请联系删除4 t; _6 G: O; U' a- J) g
7 Z- H$ Z5 X4 ^' t7 z! n) ]

; e9 T# w5 f3 l1 n8 l7 O! s2 J1 ~9 w; r9 k+ q9 ?
收藏 评论0 发布时间:2024-2-29 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

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