Tiva™ ARM Cortex-M PWM模块深度解析:从基础原理到电机驱动实战
1. PWM模块核心架构与工作模式解析
在嵌入式系统里玩PWM,尤其是像Tiva™这类ARM Cortex-M微控制器,你得先把它当成一个精密的数字信号合成器,而不是一个简单的“开开关关”模块。我接触过不少项目,从简单的LED调光到复杂的无刷电机FOC控制,核心都绕不开对PWM模块底层机制的透彻理解。很多人调不通PWM,问题往往不是代码写错了,而是根本没搞明白计数器是怎么跑的,比较器是怎么触发的,以及那些“同步”、“故障”到底在什么时机起作用。
Tiva™的PWM模块,比如TM4C1294NCPDT上的这个,其设计非常模块化且功能强大。它提供了4个独立的PWM发生器(Generator 0-3),每个发生器能独立产生两路PWM信号(pwmA和pwmB)。你可以把它想象成4个独立运作的“小型信号工厂”,每个工厂里有自己的核心生产流水线(计数器),和两个质量控制员(比较器A和B)。流水线的速度(计数频率)和质检员的触发点(比较值),共同决定了最终输出产品的规格(PWM波的频率和占空比)。
这个模块支持两种根本性的工作模式:非同步模式和同步模式。在非同步模式下,每个PWM发生器都是“各自为政”的孤岛。它们的计数器时钟源可以不同,启动停止独立,彼此输出的信号在相位上没有任何固定关系。这种模式适合那些彼此无关的控制任务,比如用一个发生器控制LED亮度,另一个发生器的输出作为蜂鸣器的音调,它们之间不需要协调。
而同步模式则是实现复杂控制系统的基石。当你的应用需要多路PWM信号之间保持精确的相位关系时——例如驱动三相全桥逆变电路、生成多相交错并联的DC-DC变换器驱动信号,或者需要严格对齐的精密定时——就必须让这些“工厂”的流水线步调一致。同步的本质,就是让多个PWM发生器的计数器共享同一个时间基准,确保它们在任意时刻的计数值都是相同的,或者具有确定的偏移量。这样,由这些计数器驱动的比较动作所产生的PWM边沿,其相对时间关系就是确定且稳定的。
1.1 计数器工作模式:增/减计数与波形生成逻辑
每个PWM发生器的核心是一个可配置的计数器,它主要支持递减计数模式。在初始化示例中,我们写PWM0CTL = 0x0000.0000,其MODE位为0,就选择了递减模式。在这个模式下,计数器从LOAD寄存器装载的值开始,每个时钟周期减1,直到减到0,然后自动重载LOAD值,周而复始。
那么PWM波形是怎么来的呢?这就要靠两个比较器(CMPA和CMPB)和动作发生器(GENA/GENB)的配合了。以生成一个简单的PWM波为例:我们设定计数器模式为递减。假设LOAD值为399(对应40us周期,10MHz时钟),CMPA值为299。我们配置动作发生器GENA,让它在“计数器等于CMPA匹配值”时,将pwmA输出置低;在“计数器等于0”时,将pwmA输出置高。
工作流程是这样的:计数器从399开始递减,在它经过299这个点时,比较器A匹配,触发GENA中设定的“匹配动作”,将输出拉低。计数器继续减到0,触发“下溢动作”,GENA将输出拉高,同时计数器重载为399,开始下一个周期。于是,高电平时间对应计数器从0计数到CMPA值(0-299)的区间,低电平时间对应从CMPA值到LOAD值(299-399)的区间。占空比就是(CMPA值 + 1) / (LOAD值 + 1)。这里有个关键细节:在递减模式下,CMPA值实际上定义的是低电平时间的起始点。这个逻辑和递增计数是反的,初次接触时很容易混淆。
注意:
LOAD和CMPx寄存器的值,以及计数器的实际值,共同决定了时间长度。LOAD值决定了周期,CMPx值决定了脉冲宽度。在计算时,务必根据计数模式(增/减)来理解比较值对应的物理意义。在递减模式下,CMPA设置得越接近LOAD值,高电平时间越短,占空比越小。
1.2 死区生成器:电力电子驱动的守护神
在驱动H桥、半桥等电路时,绝对不能允许同一桥臂的上管和下管同时导通,否则会造成直通短路,瞬间烧毁功率器件。因此,我们需要在互补的PWM信号(比如pwmA和pwmB)之间插入一个短暂的“全关”时间,这就是死区时间。
Tiva™的PWM模块为每个发生器的两路输出都集成了硬件死区生成器。它位于动作发生器(输出pwmA/pwmB)和最终引脚(输出MnPWMn)之间。它的工作原理是对原始信号的边沿进行延迟。你可以独立配置上升沿延迟(DBRISE)和下降沿延迟(DBFALL)。例如,对于一对互补信号,你可以让其中一个信号的上升沿延迟(即开通延迟),另一个信号的下降沿延迟(即关断延迟),从而确保在任何切换瞬间,都存在一个两者都为低电平的安全窗口。
这里有一个极其重要的点,也是很多数据手册容易让人忽略的:中断和ADC触发是基于原始事件(raw events)的。这句话在原文开头就提到了。意思是,死区生成器引入的延迟,不会影响中断的产生时机和ADC的触发时机。例如,你设置当“计数器等于CMPA”时触发ADC采样,那么即使你为这个边沿配置了死区延迟,使得实际引脚上的电平变化延后了,ADC的触发仍然会在计数器匹配的那一刻立即发生,而不是等到延迟结束。这在设计电流采样等关键时序时至关重要,你必须根据计数器的匹配点来规划采样时刻,而不是根据实际引脚波形。
2. 同步机制深度剖析:从理论到寄存器操作
让多个PWM发生器协同工作,是发挥其强大功能的关键。同步(Synchronization)不是简单的同时启动,它关乎整个运行过程中时间基准的精确对齐和更新动作的协调。
2.1 时间基准同步:让所有计数器从同一起跑线出发
最基础的同步是计数器同步,通过PWMSYNC寄存器实现。该寄存器的SYNC0-SYNC3位分别对应四个PWM发生器。当你向SYNCn位写1时,对应发生器的计数器会立即被复位到0。关键在于,你可以通过一次写操作同时设置多个SYNC位。例如,执行PWMSYNC = (1<<0) | (1<<1);,就会同时复位Generator 0和Generator 1的计数器。
这个操作是“立即生效”的。它常用于系统的初始同步启动。想象一下,你有三个发生器分别产生三相PWM,你首先独立配置好它们各自的周期(LOAD值)和占空比(CMP值),然后通过一条指令让它们的计数器同时归零开始计数,这样产生的三路PWM波自然就具备了120度的相位对称关系(前提是CMP值配置正确)。
实操心得:在进行计数器同步(
PWMSYNC)操作前,务必确保所有需要同步的发生器都已经完成基本配置(计数模式、LOAD、CMP等),并且处于禁用状态(CTL寄存器中的ENABLE位为0)。如果计数器正在运行,强行同步可能会导致一个周期内产生异常窄或宽的脉冲,这在电机驱动中是危险的。安全的流程是:配置 -> 同步 -> 使能。
2.2 寄存器更新同步:避免运行时产生“毛刺”
更精细的同步体现在运行时动态更新PWM参数。当你需要改变频率或占空比时,直接写入LOAD或CMP寄存器可能会引发问题。假设计数器正在递减,你突然把LOAD值改小,计数器可能会“错过”新的重载值,导致当前周期异常。或者,你改变了CMPA值,如果新值比当前计数值还大,在本周期内就无法匹配,波形会出错。
因此,Tiva™ PWM模块为关键寄存器提供了三种更新模式,由各个发生器的PWMnCTL寄存器中的LOADUPD、CMPAUPD、CMPBUPD等位域控制:
- 立即更新:写入新值立即生效。简单粗暴,但风险最高,只适用于对波形连续性要求不高的场景,或者在计数器停止时修改。
- 本地同步更新:新值被缓存起来,直到本发生器的计数器计数到0(一个周期结束)时,新值才被加载生效。这保证了参数变更总是在周期边界发生,避免了周期内的波形畸变。
- 全局同步更新:这是实现多路PWM参数“原子性”更新的关键。新值被缓存后,需要满足两个条件才生效:第一,该发生器的对应更新模式位被设置为“全局同步”;第二,并且向主控制寄存器
PWMCTL中对应的GLOBALSYNCn位写1。当你需要同时更新多个发生器的多个参数(例如,在三相电机控制中同时调整所有相的占空比)时,你可以先依次写入所有发生器的新CMP值(此时它们都被缓存),最后向PWMCTL的GLOBALSYNC0/1/2/3位(或它们的组合)写1。这样,所有被触发的发生器,都会在各自下一个计数器归零的时刻,统一采用新值。这确保了所有通道的变更严格同步在同一个时刻点,对于保持磁场矢量的平衡至关重要。
除了周期和比较值,输出使能(PWMENABLE)和发生器控制(PWMnGENA/B)等寄存器也支持同步更新,分别由PWMENUPD和PWMnCTL中的GENAUPD等位控制。例如,在驱动BLDC电机进行换相时,你需要同时关闭一组桥臂、开启另一组桥臂。通过配置为全局同步更新,然后先设置好PWMENABLE的新值,最后触发全局同步,可以实现无毛刺的平滑换相,避免上下管直通。
3. 故障处理系统:构建安全控制的生命线
在工业电机驱动、电源系统中,故障处理不是“功能”,而是“底线”。PWM模块的故障处理机制,就是在检测到危险时,绕过正常的信号生成逻辑,强制将输出引脚驱动到一个预设的安全状态(通常是全关),并通知CPU。
3.1 故障源与触发逻辑
Tiva™ PWM的故障源是灵活可配的,主要包括三类:
- 外部故障引脚(MnFAULTn):这是最常用的硬件故障输入。芯片提供了多个故障引脚,可以连接到过流保护电路、过温传感器、急停按钮等。每个PWM发生器可以独立选择响应哪个或哪几个故障引脚。通过
PWMnFLTSEN寄存器,可以配置每个故障引脚是高电平有效还是低电平有效,以适应不同的外部电路设计。 - 调试器触发:当CPU被调试器暂停(Halt)时,这本身可以被视为一种故障,防止电机在程序员单步调试时失控运行。
- ADC数字比较器触发:这是一个高级功能。ADC模块可以配置为当采样值超过某个阈值时,输出一个数字比较信号。这个信号可以直接作为PWM的故障源。例如,实时采样电机相电流,一旦超过设定阈值,ADC立即触发PWM故障,实现硬件级的快速过流保护,其响应速度远快于软件中断。
故障源的使能和逻辑组合在PWMnCTL和PWMnFLTSRC0/1寄存器中配置。你可以设定是“或”逻辑(任一故障源有效即触发)还是“与”逻辑(所有使能的故障源同时有效才触发)。
3.2 故障响应与安全状态输出
一旦故障条件成立,PWM模块会执行两件事:
输出控制:
PWMFAULT寄存器决定了每个输出引脚在故障时的行为。对于每个通道(PWM0-PWM7),你可以选择是“直通”(继续输出发生器产生的信号)还是“强制输出安全值”。安全值在PWMFAULTVAL寄存器中定义,每位对应一个输出通道,可以独立设置为0或1。 这里有一个关键顺序:安全值输出发生在信号逆变之前。也就是说,假设你设置故障时PWM0输出安全值1(高电平),但同时你在PWMINVERT寄存器中设置了PWM0输出反转。那么最终引脚上的实际电平将是安全值1经过反转后的0(低电平)。这个细节在设计安全逻辑时必须反复核对,否则你以为的安全状态可能恰恰是危险状态。故障锁存与清除:
PWMnCTL中的LATCH位决定了故障是“电平敏感”还是“边沿锁存”。如果LATCH=0,故障响应跟随故障输入信号,故障消失后PWM自动恢复正常输出。如果LATCH=1,故障一旦触发就被锁存,PWM输出将一直保持安全状态,直到软件通过PWMnISC寄存器明确清除故障标志。在涉及人身设备安全的系统中,强烈建议使用锁存模式,防止故障信号抖动导致系统反复启停。最小故障周期:
PWMnMINFLTPER寄存器用于滤除极短的干扰毛刺。只有当故障输入信号有效时间超过这个寄存器设定的时钟周期数,才会被确认为有效故障。这对于抗噪声干扰非常有用。
重要提示:当使用ADC数字比较器作为故障源时,数据手册特别建议将
LATCH和MINFLTPER都设置为1。因为ADC比较器的触发可能是非常短暂的脉冲,设置最小故障周期可以确保捕捉到它,而锁存模式则能确保故障状态被保持住,直到软件安全确认后手动清除。
3.3 中断与状态查询
故障事件可以触发中断,通知CPU进行高级别的错误处理(如记录日志、执行停机序列)。PWMINTEN寄存器中的INTFAULTn位用于使能每个发生器的故障中断。同时,PWMnFLTSTAT0/1寄存器提供了详细的故障状态信息,即使某个故障源没有被使能为触发条件,它的状态也会在这里显示,方便进行全面的系统诊断。
4. 完整配置流程与寄存器详解
让我们结合开头的初始化示例,走一遍完整的配置流程,并深入理解关键寄存器的每一个配置位。示例目标是配置PWM发生器0,产生25kHz频率,其中MnPWM0引脚占空比25%,MnPWM1引脚占空比75%。系统时钟假设为20MHz。
4.1 初始化步骤拆解与原理
步骤1-4:时钟与引脚复用配置这是所有外设配置的第一步。通过系统控制模块的RCGCPWM和RCGCGPIO寄存器使能PWM和对应GPIO模块的时钟。然后,在GPIO模块中,使用GPIOAFSEL寄存器将特定引脚(查表确定,例如PF0, PF1对应PWM0)的功能切换到“备用功能”,再通过GPIOPCTL寄存器的PMCn字段将PWM信号映射到该引脚。这一步是信号能否从芯片引脚输出的前提。
步骤5:PWM时钟配置PWMCC寄存器控制PWM模块的时钟源。示例中设置USEPWMDIV使用PWM分频器,并将PWMDIV设置为2分频。因此,PWM时钟 = 系统时钟 / 2 = 10 MHz。这是后续计算计数器周期和比较值的基准频率。
步骤6:配置PWM发生器0的工作模式
PWM0CTL = 0x0000.0000:这个值将所有控制位清零。意味着:选择递减计数模式(MODE=0),立即更新模式(LOADUPD=0,CMPAUPD=0等),禁用计数器(ENABLE=0),故障不锁存(LATCH=0)等。这是一个安全的初始状态。PWM0GENA = 0x0000.008C:配置发生器A(控制pwmA/MnPWM0)的动作。在递减模式下:0x8C的二进制是1000 1100。ACTCMPA位段(bit7:6)为10,表示“当计数器等于CMPA匹配时”,输出动作设为低电平。ACTZERO位段(bit1:0)为00,表示“当计数���等于0时”,输出动作设为低电平?等等,这里需要查表。实际上,对于输出动作,00代表“不动作”,01是驱动低,10是驱动高。示例中ACTZERO=00可能是个笔误或特定配置?根据常见配置,为了生成PWM,我们通常在计数器为0时���高,在匹配CMPA时拉低。所以更典型的GENA值可能是0x0000.008C(ACTZERO=00?)让我们重新核对:为了在递减模式下,计数器为0时输出高,匹配CMPA时输出低,ACTZERO应为01(驱动高),ACTCMPA应为10(驱动低)。因此,一个可能的正确值是0x0000.018C(ACTZERO=01)。这里凸显了查阅寄存器定义表的重要性,不能盲目照抄示例值。
PWM0GENB = 0x0000.080C:配置发生器B(控制pwmB/MnPWM1)。同理,0x080C的ACTLOAD(计数器等于LOAD值)和ACTCMPBD(计数器等于CMPB匹配,递减模式)等位段需要根据期望的波形解析。通常,为了产生互补或独立的PWM,需要仔细设置这些动作点。
步骤7:设置周期(频率)目标频率25kHz,周期T=1/25kHz = 40us。PWM时钟周期为1/10MHz = 0.1us。因此,一个PWM周期需要的时钟 ticks 数为:40us / 0.1us = 400。 在递减计数模式下,LOAD寄存器应设置为周期 ticks数 - 1。所以PWM0LOAD = 400 - 1 = 399 = 0x018F。
步骤8-9:设置占空比(脉冲宽度)
- 对于MnPWM0(25%占空比):高电平时间应为 40us * 25% = 10us。对应的时钟 ticks 为 10us / 0.1us = 100 ticks。在递减模式下,
CMPA值定义了低电平开始的点。计数器从0开始(此时输出被ACTZERO动作设为高),递减计数。当计数器值等于CMPA时,触发动作将输出拉低。因此,高电平持续的 ticks 数就是CMPA + 1。所以,CMPA = 100 - 1 = 99 = 0x0063?等等,示例中写的是PWM0CMPA = 0x0000.012B,即299。这显然对不上。 这里出现了矛盾。我们需要重新审视:如果LOAD=399,要得到25%占空比,高电平时间占比25%,即高电平 ticks = 400 * 25% = 100。在递减模式下,高电平区间是从0到CMPA(因为到CMPA时拉低)。所以CMPA应该等于高电平 ticks数 - 1 = 99 (0x63)。但示例给出的是299 (0x12B)。299对应的占空比是 (299+1)/400 = 75%。这似乎是MnPWM1引脚(75%占空比)的配置值。 我怀疑示例的步骤8和9的注释和数值可能标反了。合理的配置应该是:PWM0CMPA = 99 (0x63)// 对应25%占空比(高电平时间100 ticks)PWM0CMPB = 299 (0x12B)// 对应75%占空比(高电平时间300 ticks) 这个错误恰好是一个绝佳的教训:永远不要机械地复制示例代码,必须理解每个参数的计算逻辑,并用自己的逻辑验证一遍。
步骤10:启动计数器PWM0CTL |= 0x0000.0001;// 设置ENABLE位为1,启动计数器开始递减。
步骤11:使能PWM输出PWMENABLE = 0x0000.0003;// 二进制0011,即bit0和bit1置1。这意味着使能Generator 0的pwmA'信号输出到MnPWM0引脚,pwmB'信号输出到MnPWM1引脚。在此之前,即使计数器在运行,引脚上也没有信号。
4.2 关键寄存器功能速查表
为了方便查阅,我将核心寄存器分类总结如下:
| 寄存器类别 | 寄存器名称 | 主要功能 | 关键位/字段 |
|---|---|---|---|
| 主控制 | PWMCTL | 全局控制,触发全局同步更新 | GLOBALSYNC0-3: 触发对应发生器的全局同步更新 |
PWMSYNC | 计数器同步 | SYNC0-3: 写1复位对应发生器计数器 | |
PWMENABLE | 输出使能总开关 | PWM0EN-PWM7EN: 控制各引脚最终输出 | |
PWMINVERT | 输出极性控制 | PWM0INV-PWM7INV: 1=输出反相 | |
PWMFAULT | 故障时输出行为 | FAULT0-7: 0=直通,1=输出PWMFAULTVAL值 | |
PWMFAULTVAL | 故障安全值定义 | PWM0-PWM7: 定义各引脚故障时的输出电平 | |
PWMINTEN | 全局中断使能 | INTPWM0-3: 发生器中断使能;INTFAULT0-3: 故障中断使能 | |
| 发生器控制 | PWMnCTL | 单个发生器控制 | ENABLE: 计数器使能;MODE: 计数模式;LATCH: 故障锁存;LOADUPD/CMPAUPD: 更新模式 |
PWMnLOAD | 周期值 | LOAD: 计数器的重载值,决定PWM频率 | |
PWMnCMPA/B | 比较值 | COMPA/COMPB: 与计数器比较的值,决定占空比 | |
PWMnGENA/B | 动作发生器配置 | ACTLOAD/ACTZERO/ACTCMPA/ACTCMPB: 定义在计数点(LOAD, ZERO, CMPA UP/DOWN等)的输出动作(置高/置低/翻转) | |
PWMnDBCTL | 死区控制 | ENABLE: 死区使能 | |
PWMnDBRISE/FALL | 死区时间 | DELAY: 上升沿/下降沿延迟的时钟数 | |
| 故障处理 | PWMnFLTSEN | 故障引脚极性 | 配置各故障输入引脚高/低电平有效 |
PWMnFLTSRC0/1 | 故障源选择 | 选择该发生器响应哪些故障源(引脚、ADC比较器等) | |
PWMnMINFLTPER | 最小故障脉宽 | 滤除短脉冲干扰 | |
PWMnFLTSTAT0/1 | 故障状态 | 读取具体的故障来源 |
5. 高级应用场景与实战避坑指南
掌握了基本配置和原理后,我们可以探讨一些更复杂的应用场景和实际开发中容易踩的坑。
5.1 实现互补PWM与死区插入
驱动一个半桥电路,需要两路互补的PWM,并插入死区。假设使用Generator 0的pwmA和pwmB。
- 配置基本参数:设置
LOAD定频率,CMPA定占空比(主信号)。CMPB可以设置为与CMPA相同,或用于独立控制另一路占空比(在同步整流等场景有用)。 - 配置动作发生器:
PWM0GENA: 设置ACTZERO驱动pwmA高,ACTCMPAD(递减匹配CMPA)驱动pwmA低。PWM0GENB: 设置ACTZERO驱动pwmB低,ACTCMPAD驱动pwmB高。这样就得到了原始互补信号。
- 使能并配置死区:
PWM0DBCTL |= 0x1;// 使能死区发生器。- 计算死区时间对应的时钟 ticks。例如需要500ns死区,时钟10MHz(100ns周期),则 ticks = 500ns / 100ns = 5。
PWM0DBRISE = 5;// 设置上升沿延迟(对pwmA的上升沿和pwmB的下降沿生效,取决于极性)。PWM0DBFALL = 5;// 设置下降沿延迟。 死区生成器会自动处理两路信号的延迟,确保不会重叠。务必用示波器测量最终引脚波形,验证死区时间是否符合预期。
5.2 多发生器同步构建多相PWM
构建三相逆变器驱动,需要三路互差120度的PWM。可以使用Generator 0, 1, 2。
- 独立配置:设置三个发生器为相同的计数模式(如递减)和相同的
LOAD值(保证频率一致)。 - 计算相位偏移:对于三相120度,每相时间偏移为周期T的1/3。如果
LOAD=399,则每相偏移 ticks = 400 / 3 ≈ 133.33。由于计数器是整数,需要近似处理。一种方法是利用CMP值来模拟相位。设置三个发生器相同的LOAD,但为它们的CMPA设置不同的值,结合动作发生器的复杂配置,可以产生相位差。更直接的方法是使用PWM同步与计数器偏移高级技术(部分高级PWM模块支持),或使用一个主计数器,其他发生器以从模式运行。 - 同步启动:配置完成后,确保三个发生器均未使能(
ENABLE=0)。通过PWMSYNC寄存器,同时置位SYNC0、SYNC1、SYNC2,将三个计数器同时复位归零。 - 同时使能:然后同时置位三个发生器的
ENABLE位(或先使能再同步,取决于时序要求)。这样,它们就从完全相同的时刻开始计数,由于LOAD值相同,它们的计数器将始终保持同步。相位差则通过不同的CMP值来体现。
5.3 常见问题与调试技巧
没有输出信号:
- 检查时钟:确认
RCGCPWM和RCGCGPIO已使能,并等待了至少3个系统时钟周期后再操作PWM寄存器。 - 检查引脚复用:确认
GPIOAFSEL和GPIOPCTL已正确配置,将引脚功能切换到PWM。 - 检查输出使能:
PWMENABLE寄存器中对应位是否置1?这是最容易被忽略的一步。 - 检查计数器使能:
PWMnCTL中的ENABLE位是否置1? - 检查故障状态:如果故障引脚被意外拉高/拉低(取决于极性),或者故障被锁存且未清除,PWM输出会被强制为安全值。检查
PWMnFLTSTAT和PWMFAULT寄存器。
- 检查时钟:确认
频率或占空比不对:
- 重新计算:仔细核对
LOAD和CMP值的计算公式。牢记:PWM时钟频率 = 系统时钟 / (PWMDIV+1)。周期 ticks =LOAD + 1。占空比计算取决于计数模式和动作配置。 - 验证更新模式:如果你在运行时动态修改
LOAD/CMP,检查LOADUPD/CMPAUPD位。如果是同步更新模式,新值在下个周期才生效,你可能需要触发同步(GLOBALSYNC)。 - 示波器测量:这是最直接的方法。测量周期和脉宽,反推实际的ticks数,与你的计算值对比。
- 重新计算:仔细核对
死区时间不生效或异常:
- 确认使能:
PWMnDBCTL的使能位是否设置? - 检查延迟值:
DBRISE和DBFALL值是否过小(小于硬件最小值)或过大? - 理解极性:死区生成器作用于原始的pwmA‘/pwmB’信号。如果你同时配置了
PWMINVERT输出反转,最终的引脚波形顺序需要仔细分析。建议在调试阶段,先关闭输出反转,待死区波形正常后再开启反转。
- 确认使能:
同步不起作用:
- 检查计数器状态:同步操作(
PWMSYNC)对运行中的计数器立即生效,但可能产生毛刺。最佳实践是在计数器停止时(ENABLE=0)进行同步配置,然后再启动。 - 全局更新未触发:对于配置为全局同步更新的寄存器,写入新值后,必须向
PWMCTL的对应GLOBALSYNCn位写1,更新才会在下一个周期边界发生。只写LOAD/CMP寄存器是不够的。
- 检查计数器状态:同步操作(
故障保护不触发:
- 检查故障源配置:
PWMnFLTSRC0/1寄存器是否正确使能了预期的故障源(如特定故障引脚)? - 检查故障引脚极性:
PWMnFLTSEN寄存器配置的极性是否与实际硬件信号匹配? - 检查故障处理路径:
PWMFAULT寄存器是否将对应通道配置为“输出安全值”?PWMFAULTVAL寄存器设置的安全值是否正确? - 验证故障信号:用示波器或逻辑分析仪直接测量故障输入引脚的信号,确认其在异常条件下是否达到了有效电平。
- 检查故障源配置:
调试PWM,逻辑分析仪是比示波器更趁手的工具,因为它能同时捕获多路数字信号并显示时间关系,非常适合分析同步时序、死区、以及故障信号的响应时间。务必充分利用芯片的寄存器读取功能,在调试时定期读取PWMnCOUNT、PWMnLOAD、PWMnCMPA等关键寄存器,确认其值与你的软件设定一致,排除内存读写错误或位域操作失误的问题。PWM模块看似复杂,但将其分解为时钟源、计数器、比较器、动作发生器、输出控制、故障处理这几个逻辑层次,逐一配置和验证,就能建立起稳定可靠的控制系统。