STM32定时器系列 - STM32定时器输出比较

STM32 定时器除了基本计数定时功能外,还对外扩展了输入、输出通道,从而可以实现输入捕获、比较输出功能。

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

或者,我们可以使用比较输出功能来感知或提示某个时间段已经过去了。因为比较输出的基本特征是计数器CNT的值与比较寄存器CCR的值作比较,计数器数据变化意味着时间流逝,当计数器记到与比较值相等或向匹配时,也就表示相应时间段的过去。

具体应用到STM32定时器,在比较输出模式下,当捕获比较单元监测到计数器CNT的值与CCR寄存器值数字相等时,将根据相应的输出比较输出模式实现相应输出。比较输出功能主要靠捕获比较单元实现,同时定时器输出单元与时基单元协同配合。

捕捉比较单元有个重要的寄存器,捕捉比较寄存器CCR ,它由影子寄存器/预装载寄存器组成。用户访问时,访问预装载寄存器。预装载功能可以开启或关闭。由OCxPE@TIMx_CCMR控制。
需要修改的预装数据立即生效时将预装功能关闭。
需要修改的数据不影响当前周期的计数或波形输出时,我们就打开其预装功能。

比较输出流程:

在这里插入图片描述

捕获/比较通道的输出部分(通道1至3)

在这里插入图片描述
在这里插入图片描述
当定时器的比较输出单元检测到计数器CNT的值与捕获比较寄存器CCR的值发送匹配事件时,定时器的比较输出单元会根据比较输出模式输出相应的信号,该信号我们称之为 中间参考信号,即OCxREF。

该OCxREF源与输出模式控制器,并硬件约定高电平为有效电平 它经过极性选择后,在经过输出控制电路输出到到管脚。当极性选择位 CCxP = 0 时。高电平为OCx的有效输出电平,当CCxP = 1时,低电平作为OCx的有效输出。

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

也就是最终的输出需要由2个信号来控制,一个是 OCxREF中间参考信号,用来确定有效信号和与无效信号,另一个CCxP用来控制,有效信号或者无效信号的高电平和低电平。
在这里插入图片描述
在这里插入图片描述
总结为一张表:

OC1REFCC1P功能OC1描述
00OC1高电平有效0(低电平)无效
1OC1低电平有效1(高电平)无效
10OC1高电平有效1(高电平)有效
1OC1低电平有效0(低电平)有效

比较输出事件:

  • 当核心计数器的值CNT与比较寄存器CCR 的数值匹配时发生比较输出事件
  • 相应通道的比较输出标志位CCxIF@TIMx_SR被置位
  • 触发比较中断 (如果CCxIE@TIMx_DIER被置位使能)
  • 触发DMA请求 (CCxDE@TIMx_DIER CCDS@TIMx_CR2 使能允许)
  • 比较输出事件也可以软件方式产生。通过操作TIMx_EGR@CCxG位来实现

对于这些比较输出有关的事件,我们需要做到心中有数。因为在我们定时器中,往往需要基于相关事件来开展我们的应用开发。比如基于比较输出事件,做脉冲波形频率或占空比的变更、做脉冲个数的统计、做DMA的请求等等。。

另外,TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx的影子寄存器只能在发生下一次更新事件时被更新)。
下图给出了一个例子。

在这里插入图片描述

输出比较模式预览

在这里插入图片描述
总的来讲,这几个比较输出模式,我们有必要对它们的各自输出特征做基本了解,它是我们做比较输出应用时的基础。比方不同比较输出模式,结合不同的计数模式,相应的输出特征是什么。

边沿对齐PWM输出波形示例【Up Counting + PWM mode1】:

以下以PWM模式1为例。只要 TIMx_CNT < TIMx_CCRx。PWM的参考信号 OCxREF便为高电平,否则为低电平。
如果 TIMx_CCRx中的比较值大于自动重装载值(TIM_ARR中),则OCxREF保持为“1”,如果比较值为“0”,则OCxREF保持为“0”。
在这里插入图片描述

中心对齐PWM输出波形示例【Center aligned Mode + PWM1】

在这里插入图片描述

PWM输出频率计算:

定时器比较输出最常见的应用就是PWM输出,即脉宽调制输出。这里简单介绍下PWM输出波形参数的计算。

以计数器向上计数、PWM1为例:

PWM输出方波信号,信号的频率有TIMx的计数时钟频率和TIMx_ARR这个寄存器决定。输出信号的占空比由TIMx_CRRx寄存器和TIMx_ARR寄存器的值所决定。
占空比 = (TIMx_CRRx / (TIMx_ARR+1))* 100%。
频率 = CK_PSC / ((PSC + 1) * (ARR + 1)。

单脉冲模式

单脉冲模式(OPM)是上述模式的一个特例,在这个模式下,计数器可以在一个激励信号的触发下启动,并且可在一段可编程的延时后产生一个脉宽可编程的脉冲。

可以通过从模式控制器启动计数器。可以在输出比较模式或PWM模式下生成波形,将 TIMx_CR1 寄存器中的 OPM 位置1,既可以选择单脉冲模式。这样发,发生下一次更新事件 UEV时,计数器将自动停止。

只有当比较值与计数器初始值不同时,才能正确产生一个脉冲。启动前(定时器等待触发时),必须如下配置:

  • 递增计数模式下:CNT<CCRxARR(特别注意,0<CCRx)
  • 递减计数模式下:CNT>CCRx
原理:

计数器启动后,在下一个更新事件来临之前的时间段内实现固定个数的脉冲输出。当下一个更新事件来临时计数器停止计数。输出的脉冲个数可以一个或几个。如果是通用计数器就是1个,如果是高级定时器,脉冲个数与RCR数值和计数模式有关。

实现方式

使用OC比较输出或PWM输出模式。

启动

计数器的启动可以通过自身软件使能启动,也可以将定时器配置在触发从模式经过触发启动。

在这里插入图片描述
例如:你需要在从TI2输入脚上检测到一个上升沿开始,延迟tDELAY之后,在OC1上产生一个长度为tPULSE的正脉冲。
假定TI2FP2作为触发1:

  • 置TIMx_CCMR1寄存器中的CC2S=01,把TI2FP2映像到TI2。
  • 置TIMx_CCER寄存器中的CC2P=0,使TI2FP2能够检测上升沿。
  • 置TIMx_SMCR寄存器中的TS=110,TI2FP2作为从模式控制器的触发(TRGI)。
  • 置TIMx_SMCR寄存器中的SMS=110(触发模式),TI2FP2被用来启动计数器。 OPM的波形由写入比较寄存器的数值决定(要考虑时钟频率和计数器预分频器)
  • tDELAY由TIMx_CCR1寄存器中的值定义。
  • tPULSE由自动装载值和比较值之间的差值定义(TIMx_ARR - TIMx_CCR1)。
  • 假定当发生比较匹配时要产生从0到1的波形,当计数器达到预装载值时要产生一个从1到0的波形;首先要置TIMx_CCMR1寄存器的OC1M=111,进入PWM模式2;根据需要有选择地使能预装载寄存器:置TIMx_CCMR1中的OC1PE=1和TIMx_CR1寄存器中的ARPE;然后在TIMx_CCR1寄存器中填写比较值,在TIMx_ARR寄存器中填写自动装载值,设置UG位来产生一个更新事件,然后等待在TI2上的一个外部触发事件。本例中,CC1P=0。

在这个例子中,TIMx_CR1寄存器中的DIR和CMS位应该置低。
因为只需要一个脉冲,所以必须设置TIMx_CR1寄存器中的OPM=1,在下一个更新事件(当计数器从自动装载值翻转到0)时停止计数。

比较输出应用时的几个注意点

  1. 高级定时器相比通用定时器,它增加了主输出使能控制位,【MOE@timx_bdtr】,如果该位置零的话,此时OCx端没有波形输出;

  2. 高级定时器相比通用定时器,它增加了刹车控制机制,BKE@timx_bdtr】,如果使能了刹车控制并触发有效刹车电平,此时OCx端没有波形输出;

  3. 高级定时器相比通用定时器,使用互补输出时增加了死区插入机制,【DTG@timx_bdtr】,若插入的死区时间过大,当超过有效输出电平宽度时,会导致OCx/OCxN一端或两端没有变化的波形输出;

  4. 高级定时器的互补输出在OCxREF出来后、在极性选择之前,二者是互补的,经过极性选择后是否互补取决于两互补通道的极性选择。极性的选择最终由实际驱动电路需求决定的。

  5. 定时器的所有输出通道可以独立自由设置,如禁用/开启、输出模式选择、极性安排等。但高级定时器的做互补输出时,他们共用相同输出模式和CCR值。

  6. 对于通用定时器的Ocx通道,当使能该通道时,Ocx输出=OCxREF+极性;当禁用该通道时,Ocx的输出=0。

  7. 对于高级定时器Ocx/OCxN互补通道,没法同时实现实现有效输出。注意区分有效电平、无效电平与最终输出端的高、低电平。

  8. 对于高级定时器来说,Ocx/OCxN的输出除了跟输出使能位有关外,跟其它多个控制位【MOE/OSSI/OSSR/CCxP/CCxNP】有关。各个系列的STM32参考手册中有个Ocx/OcxN互补通道输出控制表格可以查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值