1. 项目概述:从芯片手册到实战,拆解MCU定时器的核心玩法
如果你玩过单片机,那定时器这个外设你一定不陌生。它就像单片机内部一个不知疲倦的“秒表”,是几乎所有嵌入式项目里都绕不开的核心模块。但很多人对它的理解,可能还停留在“配置一下,产生个中断”的层面,至于它内部到底是怎么计数的,PWM的占空比和频率到底由哪些寄存器决定,输入捕获怎么才能抓得准,这些问题往往一知半解。
最近在调一个基于MC9RS08LA8的老项目,正好把它的16位定时器/PWM模块(TPM)和8位模数定时器(MTIM)的芯片手册又啃了一遍。我发现,官方手册虽然严谨,但更像一本字典,知识点是散的。今天,我就结合自己踩过的坑和实际调试经验,把这些零散的知识点串起来,为你彻底讲清楚定时器的两种核心计数模式(上计数与上/下计数)、PWM的两种对齐方式(边沿对齐与中心对齐),以及输入捕获和输出比较这两个“神器”到底该怎么用。无论你是刚入门的新手,还是想深化理解的老鸟,相信这篇近万字的深度解析都能让你有所收获。
2. 定时器核心:计数模式是这一切的基石
定时器的一切功能,都建立在“计数”这个最基本的操作之上。MC9RS08LA8的TPM模块提供了两种计数模式,这直接决定了你能用它来做什么。
2.1 上计数模式:简单直接的定时器
上计数模式是定时器最基础、最直观的工作方式。你可以把它想象成一个水桶,从0开始,时钟每来一个脉冲,就向桶里加一滴水(计数值加1)。这个水桶的容量是固定的,对于16位的TPM,最大可以装65535滴水(0xFFFF)。
关键寄存器:TPMMODH:TPMMODL(模数寄存器) 这个寄存器决定了水桶的“满水位”。在普通上计数模式下,计数器从0x0000开始,一直加到“满水位”(即TPMMOD寄存器设定的值),然后下一秒,它不会溢出到0xFFFF+1,而是直接“哗啦”一下倒空,回到0x0000,并置位溢出标志TOF,然后开始新一轮的加水。
注意 :这里有个容易混淆的点。当TPMMOD设为0xFFFF(或默认的自由运行模式)时,计数器会从0一直加到65535,然后回到0。但如果TPMMOD被设置为一个小于0xFFFF的值,比如1000,那么计数器就只从0计数到1000,然后归零。这为你精确控制定时周期提供了可能。
应用场景 :
- 产生精确的周期性中断 :比如你需要一个每10ms执行一次的定时任务。假设系统总线时钟是8MHz,经过预分频后输入定时器的时钟是1MHz(周期1us)。如果你将TPMMOD设置为9999,那么计数器从0数到9999正好是10000个时钟周期,即10ms,此时产生溢出中断。
- 为边沿对齐PWM提供时间基准 :这是上计数模式最典型的应用之一,后文会详细展开。
2.2 上/下计数模式:为电机控制而生的优雅方案
上/下计数模式,也叫中心对齐模式,它的行为更像一个悠悠球。计数器从0开始向上计数,达到模数寄存器(TPMMOD)设定的峰值后,不是归零,而是调头向下计数,一直减到0,然后再调头向上,如此往复。
模式开关:CPWMS控制位 在TPM的状态控制寄存器中,有一个关键的位叫CPWMS。当CPWMS=0时,定时器工作于上计数模式;当CPWMS=1时,则切换到上/下计数模式。 这是一个全局设置 ,意味着一旦你选择了中心对齐PWM模式,这个定时器模块的所有通道都必须用于中心对齐PWM,不能再混用输入捕获或输出比较功能。
溢出标志TOF的差异 : 在上计数模式中,TOF在计数器从模数值回到0x0000时置位。而在上/下计数模式中,TOF的置位点发生了变化:它是在计数器达到模数值(峰值)并准备开始向下计数的那一瞬间置位的。 这一点非常重要 ,因为它意味着在中心对齐PWM中,TOF标志实际上标记的是每个PWM周期的“中心峰值点”或说是周期结束/开始点,而不是传统的“溢出归零”点。
为什么需要上/下计数?—— 噪声抑制的艺术 想象一下,在一个多通道的电机驱动器中,如果所有PWM通道都在计数到顶时(上计数模式的终点)同时翻转电平,会产生一个巨大的瞬时电流变化,从而在电源线上引入高频噪声(开关噪声)。这种噪声可能干扰敏感的模拟电路,如ADC采样。
中心对齐PWM巧妙地缓解了这个问题。因为它的电平翻转发生在两个时间点:一次在向上计数过程中匹配比较值时,另一次在向下计数过程中再次匹配同一个比较值时。这两个翻转点分散在周期内,而不是全部集中在周期的边界。这样,多个通道的电平翻转时刻就被错开了,从而显著降低了集中开关带来的噪声。因此,在变频器、无人机电调、伺服驱动器等对电磁兼容性要求高的场合,中心对齐PWM几乎是标配。
3. 通道功能解析:输入捕获、输出比较与PWM
一个定时器模块通常有多个通道,每个通道都可以独立配置成不同的功能。TPM的每个通道通过MSnB和MSnA这两个控制位来选择三大功能:输入捕获、输出比较和边沿对齐PWM(当CPW
360



被折叠的 条评论
为什么被折叠?



