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

使用定时器输出指定个数脉冲的几种方式

[复制链接]
STMCU小助手 发布时间:2022-8-14 15:40
在实际产品开发中有时可能需要实现一些指定个数脉冲的输出,这里介绍几种基于STM32定时器的实现方式。
1、 利用RCR寄存器结合单脉冲模式;
2、 利用DMA实时修改CCR寄存器的模式;
3、 利用定时器主从模式;
4、 利用中断对脉冲实现计数模式;

6 t& ]; M( l& k, v2 f9 k  w/ j
一、利用RCR结合单脉冲模式
这种方式仅限于带RCR寄存器的高级定时器,配合单脉冲模式,实现起来非常方便。

; {  v7 M! x( L- L( l- W5 }; t" K* c
基本原理:计数器发生RCR+1个溢出动作后触发更新事件,在单脉冲模式下,定时器发生更新事件时将停止计数并实现指定个数的脉冲输出。

$ v' H. f8 h5 O- t
微信图片_20220814153816.png

' {! G) [1 z- J: h
参考配置:& c3 X1 {! ?9 {% d, I
微信图片_20220814153812.png
; Y# E6 j4 O$ C% h( a( q
微信图片_20220814153809.png
0 }( A( Y( ]  I+ k0 w
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);//TIM1通道1输出一串脉冲。
% \# X! }% [! w! h
微信图片_20220814153805.png

0 @- S4 Y. {2 ]# c6 P1 I. p) z% N) n0 D
二、利用DMA实时修改CCR寄存器的模式;

4 W: u$ s: w* b+ A% p0 B
基本原理:基于定时器事件触发DMA从而动态修改CCR寄存器的值最终实现指定个数的脉冲输出。

# X+ a1 ]3 K0 F
下面示例使用定时器更新事件触发DMA,输出10个脉宽各不一样的脉冲.
uint16_t DataforCCr[]={25,43,18,65,27,44,66,38,76,11,00};

6 g' _6 x/ `* f, q5 Y1 ^
参考配置:
微信图片_20220814153802.png

3 g( o5 u- |0 D" U
TIM_CCxChannelCmd(htim3.Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
; ^- h) Q* |% t1 ~* D
__HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_UPDATE);
  g  j7 N- |  \; p/ W( G7 h' j0 u5 L
__HAL_TIM_ENABLE_DMA(&htim3, TIM_DMA_UPDATE);
* Y, y/ N+ J  C5 \6 @
HAL_DMA_Start(&hdma_tim3_up, (uint32_t)DataforCCr, (uint32_t)&htim3.Instance->CCR1, 11);

) }7 k$ Q- q8 q1 r$ F
__HAL_TIM_ENABLE(&htim3);

5 K* c# Q* T( e7 J
TIM3->EGR = TIM_EGR_UG;
% F5 @# I3 ?0 `/ Y
微信图片_20220814153758.png
& N. Q, C+ b% o5 s+ h
眼尖的人可能发现上图中最后有个额外的尖脉冲,那是因为这里是基于更新事件触发DMA,DMA传输新数据过来时有点延迟导致下一个PWM脉冲已经发生作用。这时,我们可以调整触发事件,比方这里将触发事件调整为比较事件,并开启预装功能即可以消除这个问题。上面测试过程是关闭了CCR寄存器的预装功能的。
+ ]# K! \8 n" k: C( [% c
该方式可以做到非常灵活精准,但要多用个DMA外设。
" P0 j: J, I8 d, \. m* c5 q6 u  K
三、利用定时器主从模式
基本原理:利用两个定时器级联成主从模式,一个定时器输出门控信号,控制另外一个定时器的计数工作。
% Y7 W6 d# O: m; Q; d* h/ G
微信图片_20220814153755.png
6 q/ E  q# Z. _) A) P
下面TIM4工作在主模式,其OC输出作为触发信号给到TIM8,TIM8工作在门控模式。

  t5 p& V! b% E, c! b+ o
TIM_CCxChannelCmd(htim4.Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
__HAL_TIM_ENABLE(&htim4);
2 _$ ^" y! K, G% k8 R- U3 w' p/ S
TIM_CCxChannelCmd(htim8.Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE);
__HAL_TIM_MOE_ENABLE(&htim8);
__HAL_TIM_ENABLE(&htim8);
) r8 Y% k  X0 @' ?% C
微信图片_20220814153749.png

# O3 F0 ?; @; V+ K& C3 j& P
微信图片_20220814153744.png
+ \" t3 O& o& U6 h% }! S/ A1 f
此模式实现起来简单快捷,但当门控信号与从定时器时钟缺乏同步关系时,输出脉冲个数可能有偏差,尤其结尾的电平可能摇摆不定。
! C0 L' L% \. {0 W* s2 X7 s
四、利用定时器中断模式
  • 基本原理:基于定时器更新事件或比较事件对脉冲个数进行实时计数,到达指
  • 定数据后通过修改CCR或ARR寄存器的值来停止后续PWM的输出。具体操
  • 作需结合PWM输出模式和最后希望停止输出时的电平来对CCR进行赋值。
  • 2 W9 D2 w+ y/ q. D% J
    : l1 U, [7 ?' \' R1 ]! O; P# A  s
640.png

$ n1 O/ [! ^( V$ D8 Z
比如:输出10个脉冲,最后电平停留在高电平。我们可以基于比较事件来对脉冲进行,并开启CCR寄存器的预装功能。若选用PWM1模式,极性选择为高有效,向上计数模式时,则在第10个比较中断里修改CCR=ARR+n[n大于等于1];若选用PWM2模式,极性选择为高有效,则在第10个比较中断里修改CCR=00。
' n  ^( @- a: o' M: [
该模式实现起来较为简单,只需对定时器有些基本的了解即可,无需涉及定时器更多知识及DMA方面的应用等。
3 k1 n4 ~0 ~$ C" M1 k2 l8 A
上面大体介绍了利用STM32定时器实现指定个数脉冲输出的四种模式,各有特色,供君参考。我们实际应用中可以灵活采用。
! B) `) b0 B8 O* \  U6 h' z
赞 收藏 评论0 发布时间:2022-8-14 15:40

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版