本文整理于 https://www.sohu.com/a/292903672_807475

原文作者:茶话MCU

STM32定时器单脉冲输出模式

单脉冲输出模式是定时器比较输出应用中的一种特殊情况或者特殊应用,是一种特殊的PWM输出模式。

1.比较输出【Compare Output】功能

定时器通过对预设的比较值与计数器的值做匹配比较之后,依据比较结果结合相应的输出模式从而实现各类输出。如PWM输出、电平翻转、单脉冲输出、强制输出等。一般来讲,STM32的通用定时期和高级定时器都具有输入捕获、比较输出功能,不同的定时器可能通道数量上有差异。

这里提到的比较值就是指放在CCR寄存器中的值,计数器的值当然就是CNT寄存器的值。一般来讲,在计数过程中,CNT寄存器的值往往是连续动态变化并呈现周期性,其变化规律跟我们设置的计数器的计数模式有关,比如向上计数模式、向下计数模式或者中心对齐计数模式等。这里的比较结果无非三种情况:①CCR = CNT②CCR > CNT③CCR < CNT

2.三种比较输出模式:

a.强制输出模式  b.匹配输出模式  c.PWM输出模式


强制输出模式:无视比较结果,直接根据配置指令输出相应电平;

匹配输出模式:只关注CCR=CNT值的时候,做相应电平的输出;

PWM输出模式:根据CCR是小于CNT还是CCR不小于CNT的比较结果做不同的输出;

上面提到的输出信号,其中多次提到有效信号,无效信号,是指比较输出控制器输出的信号,我们称之为中间参考信号,即OcxREF信号。该OCxREF源于输出模式控制器,并硬件约定高电平为有效信号,低电平为无效信号。它经过极性选择后,再经输出控制电路输出到芯片管脚Ocx端。简单来说,当极性选择位CCxP=0时,Ocx输出与OcxREF信号同相;当CCxP=1时,Ocx输出与OcxREF信号反相 。

下图是当CCxP=0时 Ocx 与 OcxRef信号的相位情况【二者同相】

下图是当CCxP=1时 Ocx 与 OcxRef信号的相位情况【二者反相】

也就是说,OCXref信号只是个中间参考信号,并非最终输出信号。最终输出端OCX的active state【有效状态】/inactive state【无效状态】所对应的电平取决于极性选择控制位CCxP/CCxNP。

当然,如果是高级定时器的互补输出,最后的输出波形形状除了与极性选择有关外,输出波形还跟插入的死区有关。即对于互补输出时 Ocx =OCxREF + 极性 + 死区

3.PWM比较输出模式实现原理及相应波形

从前面介绍中我们了解到PWM输出模式可以分两种,即PMW模式1与模式2,结合不同的计数模式可以实现多种输出组合。我们不妨以PWM模式1、计数器向上计数、极性选择高有效【CCxP=0】为例来看看比较输出过程中输出PWM波形的实现原理。

上面图由两部分组成,上面部分是计数器周期性计数的示意图。深红色斜线表示计数器从0开始计数,记到ARR后重装(即计数到了最大值,计数器清零),再重新计数,这样循环。下面绿色方波是依据PWM模式1基于某个CCR值经过比较输出而得到PWM波形。

根据上面介绍,我们知道在PWM输出模式1的前提下,当计数器的值小于CCR的值时输出有效电平,即高电平,当计数器值大于或等于CCR的值时输出无效电平,即低电平。由于计数器计数会发生周期性地溢出和重装,使得计数器的值可以周期性地循环计数,当CCR的值固定的时候,CNT与CCR的值二者的比较结果也往往呈现出周期性,此时也就输出规律性、周期性的PWM波形。

不难理解,当我们修改CCR的值,其它不动的时候,PWM输出波形会相应变化。

上图的波形是在之前基础上将CCR值往上调大以后所得到的比较输出波形。

    看到这里,我们不禁会想:既然PWM输出模式的输出结果取决于CCR与CNT的比较结果的周期性变化,那么,当我们把CCR的值设置为0或者比ARR的值还大的时候,此时CCR与CNT的比较结果将不再变化,因为这里CNT的值不可能比0还小或比ARR还大。此时,自然就不会有变化的PWM波形输出,而是输出固定的电平,具体什么电平取决于CCR与CNT的比较结果与当前所选择的PWM输出模式。

不妨用个具体的案例来理解。比如,在PWM模式1的前提下:

当CCR=0时,由于计数器CNT的值永远不会小于CCR,此时将始终输出无效电平。

当CCR=ARR+n【N不小于1】时,因CNT的值总小于CCR的值,此时始终输出有效电平。

上面主要是基于PWM输出模式1、计数器向上计数模式来理解定时器比较输出中的PWM输出原理。至于PWM输出模式1、计数器向下计数模式或者PWM输出模式2等其它情形,我们可以结合STM32参考手册自行分析。

结合上面的分析,我们不难看出,定时器之所以能输出PWM波形,原因在于定时器的计数器的计数的动态连续性和周期性,具体到这里,从0开始计数到ARR,溢出重装,再从0开始从新计数,循环往复,导致计数器与CCR的比较结果也具有周期性,从而产生周期性的PWM输出。

根据定时器时基单元相关介绍,我们知道计数器计数发生溢出后,可以触发更新事件。对于通用定时器,每次溢出都可以产生更新事件;对于高级定时器,每发生RCR+1次溢出就可以产生更新事件。

如果说,在PWM输出模式下,当定时器发生溢出产生更新事件时,通过硬件机制令计数器停止计数,既然计数器被停止计数了,计数器【CNT】的值将不再变化,之后的CNT与CCR的比较结果将维持不变,自然也就没有后续变化的的PWM波形输出了。这时我们就可以实现单个或几个PWM脉冲的输出了。

基于上述原理或应用场景,便衍生出了单脉冲输出模式。所以,我们说单脉冲输出模式是一种特殊的PWM输出模式。

4.单脉冲输出模式的实现原理

计数器启动后,在更新事件来临之前的时间段内实现一定个数的脉冲输出,当发生更新事件时计数器停止计数,导致后续不再有变化的PWM波形输出。输出的脉冲个数可以一个或几个。如果是通用计数器就是1个,如果是高级定时器,脉冲个数与RCR数值和计数模式二者有关。

上图是个单脉冲输出实现的示意图。定时器工作在从模式,在外部触发信号【TI2】的作用下开启计数器,输出一个脉冲后发生更新事件并停止计数。

关于单脉冲输出模式应用的提醒:

1、使用单脉冲输出模式时,计数器的使能启动可以通过软件使能启动,也可以将定时器配置在触发从模式经过信号触发启动.

2、单脉冲输出模式是PWM输出模式的特例,利用该模式并不一定只是输出单个脉冲。如果是通用定时器,每次使能计数器后只输出一个PWM脉冲,如果是高级定时器,每次使能计数器后可能输出多个PWM脉冲,具体多少除了与RCR寄存器的值有关外,还跟计数器的计数模式有关;

3、要用好定时器的单脉冲输出模式,需了解下面三方面的知识点:

A:了解基本的PMW输出模式的基本特性;

B:了解定时器的更新事件;

C:了解计数器的溢出与重装;

好,下面一起来看看几个基于单脉冲输出模式的实例以加深理解。

下面案例都是基于高级定时器的。因为高级定时器可以使用单脉冲输出模式输出1到N个脉冲,如果使用通用定时器每次触发后就只能产生1个脉冲,产生多个脉冲就不那么方便。

案例一:使用高级定时器,单脉冲输出模式,借助RCR寄存器实现3个PWM脉冲输出

条件:UP counting + PWM1,RCR=2; 极性:高有效[CCxP=0]

RCR=2,意味着发生RCR+1次溢出时产生更新事件,计数器停止计数,后续不再输出PWM波形。从上面来看输出基本是正确的,不过最后电平停在高电平,结尾这个地方怎么感觉不符合PWM1的输出特性呢?

一起来看看,现在计数器是向上计数模式,它在第3个周期计到ARR时产生溢出,触发更新事件,计数器停止计数了,那计数器的值不是应该停留在ARR吗?如果计数器的值停在ARR,那此时CNT>CCR的值,按照PWM模式1的输出特性,输出应该停留在低电平,那怎么是高电平呢?

前面提到过,要用好定时器的单脉冲输出模式,还得了解计数器溢出与重装。

具体到这里,当计数器在第3个周期计到ARR时发生溢出,产生更新事件,计数器不再计数。但计数器溢出后重装还是照例执行,此时计数器被重装为0,因为计数器被停止,所以该0值保持不变。这样的话,后续的比较结果总是CNT<CCR值,按照PWM模式1的输出特性,输出自然应该是高电平并保持,这跟上面输出波形就吻合了。

好,那我们基于上面的条件,换成PWM输出模式2看看结果。

案例二:使用高级定时器,单脉冲模式,借助RCR寄存器实现3个PWM脉冲输出

条件:UP counting + PWM2,RCR=2; 极性高有效[CCxP=0]

这次跟上面的案例1只是PWM模式做了变更,使用PWM输出模式2。仍然是输出3个PWM脉冲,跟上面输出波形相比,第3个脉冲最后停留的电平不一样,这里是低电平。分析过程跟上面一样,当计数器发生第3次溢出时,计数器依然重装为0,此时CNT<CCR,但此时PWM输出模式变更为模式2了,根据PWM模式2的输出特性此时就应输出低电平。

至于其它不同的组合模式,这里就不一一分析了。我下面再放几副图进来,大家可以自行分析。

案例三:使用高级定时器,单脉冲模式,借助RCR寄存器实现3个PWM脉冲输出。

条件:Down counting + PWM1,RCR=2; 极性选择高有效 [CCxP=0]

案例四、使用高级定时器,单脉冲模式,借助RCR寄存器实现3个PWM脉冲输出。

条件:Down counting + PWM2,RCR=2; 极性选择高有效[CCxP=0]

小小结:Up+PWM1 = Down+PWM2    

              Up+PWM2 = Down+PWM1

案例五、使用高级定时器,单脉冲模式,借助RCR寄存器实现PWM脉冲输出

条件:Center counting / pwm1/ RCR=6 极性选择:高有效[CCxP=0]

最后小结:

    在使用定时器单脉冲输出模式做指定个数PWM波形输出时,我们要根据实际需求来选择合适的pwm输出模式、计数模式以及RCR寄存器的值。比方上面案例1与案例2的输出波形不能说谁对谁错,关键看你需要的是哪种输出结果。另外,一种输出结果可以有多种实现方案,比方上面案例2与案例3虽是不同的方案,但产生了相同的效果,此时我们可以根据具体的应用场景来选择合适的方案。

    关于定时器的单脉冲输出模式的应用就介绍到这里,大致介绍了单脉冲输出模式的来龙去脉以及实现原理。我们常常使用单脉冲模式是输出指定个数的PWM脉冲,当然还有别的方式可以灵活使用,比方通过通过统计比较事件或更新事件后修改CCR等。

寄存器的配置可以参考:http://news.eeworld.com.cn/mcu/article_2016101130329.html

STM32定时器单脉冲输出模式相关推荐

  1. STM32的单脉冲模式实现精确个数脉冲

    我们在做嵌入式产品的开发过程中,有时需要输出指定数目的脉冲.实现它的方法较多,这里介绍一种利用 STM32定时器的单脉冲模式来实现的方法. STM32定时器的单脉冲输出功能,其实是定时器输出比较功能的 ...

  2. STM32F103单片机PWM单脉冲输出模式

      通常输出PWM波形的时候是一直输出的.但是在电机控制中往往只需要输出一定个数的脉冲,不需要一直输出,那么这就需要每次输出PWM时,输出的脉冲个数可控.要实现这个功能,一般有三种方法.   方法一: ...

  3. STM32 基础系列教程 7 - 单脉冲PWM

    前言 学习stm32 基本定时器的使用,用基本定时器实现产生一个PWM,实现单脉冲PWM的功能. 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c ...

  4. STM32 - 定时器基础应用说明 - 04 - N-pulse waveform generation using one-pulse mode - 用OPM模式产生N次脉冲

    前言:N-PULSE模式,就是PLUS模式+Mask(利用UDIS的屏蔽) Repetition的特性: 那么首先-N-PULSE可以定制波形的各个方面,然后,将这个定制进行重复,那不就是可以无限的定 ...

  5. STM32定时器间的同步 主TIM1产生PWM 从TIM4精确控制TIM1 PWM脉冲数量

    STM32 定时器间的同步 主TIM1产生PWM 从TIM4精确控制TIM1 PWM脉冲数量 文章目录 STM32 定时器间的同步 主TIM1产生PWM 从TIM4精确控制TIM1 PWM脉冲数量 编 ...

  6. STM8学习笔记----PWM单脉冲模式输出

    先看看官方资料对单脉冲模式的介绍 下面看C代码的实现 void PWM_GPIO_Init( void ) {PC_DDR_DDR6 = 1; //输出管脚 PC6 TIM1_CH1PC_CR1_C1 ...

  7. stm32捕获占空比_「话说定时器系列」之六:STM32定时器输入捕获话题

    STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍.去年,电堂推出了<STM32 TIMER基础及常规应用介绍>,为大家梳理了 STM32 TIMER 的庞大内容, ...

  8. STM32 定时器编码器模式时,如何理解编码器计数

    编码器的使用 增量式编码器倍频技术 增量式编码器输出的脉冲波形信号形式常见的有两种: 一种是占空比 50% 的方波,通道 A 和 B 相位差为 90°: 另一种则是正弦波这类模拟信号,通道 A 和 B ...

  9. STM32 定时器中断相关知识及配置

    实验工具:MDK5,STM32F103ZET6开发板 使用固件库编程 上一次学习的是利用定时器4,CH2通道产生PWM波来控制LED灯的闪烁,具体可以参考鱼撞烟花,在最后有代码连接. 这次学习定时器的 ...

最新文章

  1. 如何在Linux实现自动运行程序
  2. 18行代码AC——PTA 二叉树的遍历 (10分)——解题报告
  3. [MS评估文档]SharePoint Portal Server 2003 的 10 大优点
  4. 重大调整!余承东兼任华为云与计算 BG 总裁
  5. Python入门--元组的遍历,获取元组元素
  6. ubuntu16.04安装python3.6-dev超时_vitrualBox+ubuntu16.04安装python3.6最新教程及详细步骤...
  7. Could not find class
  8. 三阶魔方CFOP cross总结
  9. wifi共享代码实践java_笔记本实现共享wifi上网
  10. 最小攻击超过最大攻击_贪婪洞窟攻击力解析 最大攻击与最小攻击对比分析
  11. 最小二乘法直线拟合、圆拟合
  12. 苹果加快创新步伐 美国制造一去不复返
  13. c语言,判断整数 m 是否素数
  14. awk 处理反算日志流量
  15. 全志F1C600芯片处理器介绍
  16. 《The One!团队》:BETA Scrum metting1
  17. 摩根大通银行被黑客攻克, ATM机/网银危在旦夕,winxp退市灾难来临了
  18. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第36讲:PHP错误与异常处理
  19. Android Studio 搜索快捷键不起作用
  20. Authorware快捷键

热门文章

  1. OPPOr7s有android5.0,这一次用上了Android 5.1_OPPO R7s - CNMO
  2. python实现远程ssh登录
  3. 苹果手机截屏分辨率,注意视图的标准与放大的差异
  4. 在 Python 中如何将字符串转换为整数
  5. 【Python绘图】柱状图
  6. mysql中整数类型后面的数字,是不是指定这个字段的长度?比如int(11),11代表11个字节吗?...
  7. Linux嵌入式开发版贪吃蛇,嵌入式之贪吃蛇
  8. 《世界因你不同》——我与中国大学生的不了缘
  9. 修改git 项目后进行内容提交操作
  10. python中矩阵转置4种方法