STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍。去年,电堂推出了《STM32 TIMER基础及常规应用介绍》,为大家梳理了 STM32 TIMER 的庞大内容,涵盖 TIMER 的基本应用原理、常规应用等。现在将课程内容整理为文章,针对STM32定时器有基本了解的用户,分享具体的应用实现环节及常见问题解决。
我们知道,STM32定时器除了基本计数定时功能外,还对外拓展了输入、输出通道,从而可以实现输入捕捉、比较输出功能。比较输出【Compare Output】功能:定时器通过对预设的比较值与计数器的值做匹配比较之后,并依据相应的输出模式从而实现各类输出。如PWM输出、电平翻转、单脉冲输出、强制输出等。一般来讲,STM32的通用定时器和高级定时器都具有比较捕获功能,不同的定时器可能通道数量上有差异。
或者,我们可以使用比较输出功能来感知或提示某个时间段已经过去了。这个不难理解,因为比较输出的基本特征是计数器CNT的值与比较寄存器CCR的值做比较,计数器数据变化意味着时间的流逝,当计数器记到跟比较值相等或相匹配时,也就表示相应时间段的过去。具体到STM32定时器,在比较输出模式下,当捕获比较单元监测到计数器CNT的值与CCR寄存器的数字匹配时,将根据相应的比较输出模式实现相应输出。比较输出功能主要靠捕捉比较单元实现,同时定时器输出单元与时基单元协同配合。
捕捉比较单元有个重要的寄存器,捕捉比较寄存器CCR ,它由影子寄存器/预装载寄存器组成。用户访问时访问预装寄存器。预装载功能可开启或关闭。由OCxPE@TIMx_CCER控制。至于什么时候需要开、什么时候需要关闭前面多次提到过。总之需要用户修改的预装数据立即生效时将预装功能关闭,希望用户修改的数据不影响当前周期的计数或波形输出时,我们就打开其预装功能。
比较输出的大致流程以及几个术语【OCxREF 、OCx 、输出极性】
当定时器的比较输出单元检测到计数器CNT的值与捕捉比较寄存器CCR的值发生匹配事件时,定时器的比较输出单元会根据比较输出模式输出相应的信号,该信号我们称之为中间参考信号,即OcxREF信号。
该OCxREF源于输出模式控制器,并硬件约定高电平为有效信号,即有效状态所对应的信号。它经过极性选择后,再经过输出控制电路输出到管脚。当极性选择位CCxP=0时,高电平作为Ocx的有效输出信号,当CCxP=1时,低电平作为Ocx的有效输出。
也就是说,OCXref信号只是个中间参考信号,并非最终输出信号。最终输出端OCX的active state【有效状态】/inactive state【无效状态】所对应的电平取决于极性选择控制位CCxP/CCxNP。
比方我们以通道1为例:
任一时刻计数器的值与CCR的比较结果,结合相应的比较输出模式决定了中间参考信号OC1REF的电平,而最终输出端OC1的输出电平取决于极性选择CC1P位的配置。即对于非互补输出时 Ocx =OCxREF + 极性 【+ 表示结合的意思】
当然,如果是高级定时器的互补输出,最后的输出电平除了与极性选择有关外,输出波形还跟插入的死区有关。即对于互补输出时 Ocx =OCxREF + 极性 + 死区
比较输出相关事件
- 当核心计数器的值CNT与比较寄存器CCR 的数值匹配时发生比较输出事件
- 相应通道的比较输出标志位CCxIF@TIMx_SR被置位
- 触发比较中断 (如果CCxIE@TIMx_DIER被置位使能)
- 触发DMA请求 (CCxDE@TIMx_DIER CCDS@TIMx_CR2 使能允许)
- 比较输出事件也可以软件方式产生。通过操作TIMx_EGR@CCxG位来实现
对于这些比较输出有关的事件,我们也需做到心中有数。因为在我们的定时器应用中,往往需要基于相关事件来开展我们的应用开发。比方基于比较输出事件,做脉冲波形频率或占空比的变更、做脉冲个数的统计、做DMA请求的触发等待等等,不一而足。
另外,对于 CCRx 影子寄存器的预装载功能可以软件开启或关闭 (OCxPE@TIMx_CCMR)也应该清楚,以便我们在定时器的应用中根据具体应用来打开或关闭CCRx寄存器的预装功能,前面有做个相关应用案例的分享。
输出比较模式概览
总的来讲,这几个比较输出模式,我们有必要对它们的各自输出特征做基本了解,它是我们做比较输出应用时的基础。比方不同比较输出模式,结合不同的计数模式,相应的输出特征是什么。
边沿对齐PWM输出波形示例【Up Counting + PWM mode1】
中心对齐PWM输出波形示例【Center aligned Mode + PWM1】
PWM输出频率的计算
定时器比较输出最常见的应用就是PWM输出,即脉宽调制输出。这里简单介绍下PWM输出波形参数的计算。
以计数器向上计数、PWM1为例:
- PWM输出方波信号,信号的频率是由TIMx的计数时钟频率和TIMx_ARR这个寄存器所决定。输出信号的占空比由TIMx_CRRx寄存器和TIMx_ARR这个寄存器的值所确定。
- 占空比=(TIMx_CRRx/(TIMx_ARR+1))*100%
- F_pwm = CK_PSC/((PSC + 1)*(ARR + 1))
以中央对齐计数、PWM1为例:
- 占空比=(TIMx_CRRx/(TIMx_ARR))*100%
- F_pwm = CK_PSC/((PSC + 1)*ARR )
单脉冲输出模式是定时器比较输出模式的一种特例。
原理:计数器启动后,在下一个更新事件来临之前的时间段内实现固定个数的脉冲输出。当下一个更新事件来临时计数器停止计数。输出的脉冲个数可以一个或几个。如果是通用计数器就是1个,如果是高级定时器,脉冲个数与RCR数值和计数模式有关。
实现方式: 使用OC比较输出或PWM输出模式。
计数器的启动可以通过自身软件使能启动,也可以将定时器配置在触发从模式经过触发启动。
高级定时器的互补输出及死区的插入:
这里所说的互补输出,特指高级定时器TIM1或 TIM8通过其专门的互补通道输出互补信号。即每一对互补通道,共用相同的输出模式和同一通道比较寄存器CCR来输出互补信号。
这里要提醒的是,这对互补信号的每一路都可以独立做输出极性配置,在极性选择前二者一定是互补的,但经过极性选择后是否还是互补波形取决于二者的极性选择情况。如果极性选择一致,即都选择高电平做为有效信号或者都选择低电平做为有效信号,这时互补通道的最终输出【OCX/OCXN】就是互补信号。如果二者的极性选择不一致,最终的互补输出波形则是同相的,而不是互补信号。对于我们用户来讲,具体做怎样的极性选择,取决于实际应用需求。
我们常常使用互补输出信号来驱动电机桥臂。电机的各个桥臂由功率器件组成,比如IGBT。实际应用中,每一相的上下两个桥臂不可以同时导通,否则电源会通过上下两个桥臂产生短路情况。一般来讲,每组桥臂的上下臂呈互开关驱动系,即上臂导通,下臂截止,反之亦然。但由于那些晶体管的开、关动作本身会有时延问题,而且不同晶体管开关动作的延时也有差异。鉴于此,为了避免上下臂同时导通的隐患,在输出控制信号中额外插入一个时段,保证让上下臂都呈截止状态,这个时段就是死区。对于高级定时器的互补输出通道,可以通过相关寄存器配置即可实现死区控制。不难看出,死区的插入是以牺牲有效输出为代价来保障电机驱动电路的安全性,所以该参数的设置除了考虑安全性外,也要考虑合理性。
比较输出应用时的几个注意点
【实际应用或芯片软硬件移植过程中经常遇到的情形】
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互补通道输出控制表格可以查看。
整体上讲,关于定时器的比较输出,基本原理并不复杂,但实际应用起来就非常灵活,尤其当多种比较输出模式,结合定时器的主从应用时,STM32定时器的强大功能可以因此而得到充分展现。
本节课主要介绍了比较输出相关的原理性的东西以及要注意的地方。后续课程会就定时器输入捕获、比较输出,并结合定时器的主从模式分享一些实际应用案例,敬请关注。