深入解析FlexPWM:从基础原理到电机驱动实战应用
2026/6/15 13:49:50 网站建设 项目流程

1. 深入理解PWM:从基础概念到电机控制的核心

脉冲宽度调制,也就是我们常说的PWM,本质上是一种用数字信号来“模拟”模拟信号电平的技术。听起来有点绕,但它的原理其实很直观:想象一下你手里有一个高速开关的水龙头,一秒钟内,你快速地打开和关闭它。如果你打开的时间长,关闭的时间短,那么平均下来,流出的水量就多;反之,平均水量就少。PWM就是这个“高速开关”,只不过它控制的是电信号的“通”与“断”。这个“通”的时间占整个开关周期的比例,就是我们所说的占空比。通过微控制器内部的定时器,我们可以精确地生成不同占空比的方波信号。

在电机控制,尤其是无刷直流电机和永磁同步电机的驱动中,PWM技术扮演着绝对核心的角色。我们常用的三相全桥逆变电路,其六个功率开关管(通常是MOSFET或IGBT)的导通与关断,就是由六路精确定时的PWM信号来控制的。通过调节这六路信号的占空比和相位,我们可以在电机绕组上合成出所需幅度、频率和相位的交流电压,从而精确控制电机的转速和转矩。因此,一个强大、灵活的PWM模块,是高性能电机驱动器的硬件基石。

FlexPWM模块正是为此而生。它不仅仅是一个简单的定时器加比较器,而是一个为复杂电机控制算法量身定制的子系统。它解决了传统PWM在电机驱动中的几个关键痛点:如何实现多路同步且相位可调的PWM输出?如何在硬件层面自动插入死区时间以防止桥臂直通短路?如何支持无传感器控制算法所需的强制换相?如何提供丰富的故障保护机制?接下来,我们将深入FlexPWM的内部,看看它是如何通过精妙的硬件设计来回答这些问题。

2. FlexPWM模块架构与核心设计思路

FlexPWM模块的设计哲学是“分而治之”与“高度可配”。它将整个PWM系统划分为多个完全相同的子模块,每个子模块都具备独立且完整的功能。这种架构带来了极大的灵活性,你可以将多个子模块组合起来控制一个多相电机(例如用三个子模块控制三相),也可以让每个子模块独立工作,驱动不同的负载。

2.1 子模块:独立运行的PWM引擎

每个子模块的核心是一个16位向上计数器。这个计数器的运行时钟、计数周期(决定PWM频率)和初始化值都可以独立配置。与计数器并行工作的,是多组16位比较器及对应的数值寄存器。这正是FlexPWM“灵活”的精髓所在。传统的PWM生成可能只用一个比较器来设定占空比,而FlexPWM为每个PWM输出通道(如PWMA和PWMB)都分配了两个比较器:一个用于控制脉冲的上升沿(开启时刻),另一个用于控制脉冲的下降沿(关闭时刻)。这意味着软件可以独立且精确地控制PWM波形的每一个边沿,为实现诸如中心对齐PWM、非对称PWM等高级调制方式提供了硬件基础。

注意:理解“边沿控制”是掌握FlexPWM的关键。在边沿对齐模式下,计数器从INIT值开始向上计数到VAL1(周期值),然后复位。PWMA的开启由VAL2决定(当计数器>=VAL2时置高),关闭由VAL3决定(当计数器>=VAL3时置低)。通过独立设置VAL2和VAL3,你可以生成任意位置和宽度的脉冲,而不仅仅是改变从周期起点开始的脉冲宽度。

2.2 时钟与同步:让多个子模块步调一致

在电机控制中,三相PWM必须严格同步,否则会导致转矩脉动甚至失控。FlexPWM提供了强大的同步机制。每个子模块的时钟可以从IPBus时钟、外部时钟或来自子模块0的辅助时钟中选择。更重要的是,子模块0的“本地同步”信号可以被广播为“主同步”信号,其他子模块可以选择此信号作为自己计数器的复位源。这样,所有子模块的计数器都将以子模块0的周期为基准,严格同步启动和复位,确保了多路PWM输出之间的相位关系恒定。

寄存器重载逻辑是另一个确保同步更新的关键。PWM参数(如周期值VAL1、比较值VAL2/VAL3等)通常采用双缓冲机制:软件写入“外缓冲器”,在特定的“重载时机”硬件自动将外缓冲器的值拷贝到“内缓冲器”生效。FlexPWM允许你设置重载频率(如每1个、每4个PWM周期重载一次),并可以选择在完整周期结束时或半周期点时进行重载。子模块0的重载信号也可以作为“主重载”信号广播出去,强制所有子模块在同一时刻更新PWM参数,这对于实现磁场定向控制等需要同时更新三相占空比的算法至关重要。

3. 核心功能深度解析与实操配置

3.1 Force Out功能:实现无传感器BLDC换相的关键

对于无传感器BLDC电机控制,换相点的判断至关重要。算法通过检测反电动势的过零点来估算转子位置,并在合适的时刻进行换相(改变施加在电机绕组上的电压序列)。这个“合适的时刻”必须非常精确,且延迟要尽可能小。如果依赖软件中断来改变PWM输出,中断响应、上下文切换、寄存器写入等延迟会导致换相时刻偏差,在高转速下引起转矩波动甚至失步。

FlexPWM的Force Out功能就是为了消除这个软件延迟而生的。其工作流程如下:

  1. 预先配置:软件根据算法预测出下一个换相点,并提前计算出换相后六路PWM输出引脚应有的状态(哪路高、哪路低、哪路PWM调制)。
  2. 写入缓冲:将这些预期的引脚状态写入到相应的控制寄存器(如OUT23, OUT45)或选择外部控制信号(EXTA, EXTB)。
  3. 选择信号源:通过SEL23和SEL45字段,为每对PWM输出预先选择好信号源(例如,正常PWM信号、反相PWM信号、软件强制电平OUTx、或外部信号EXTA/B)。
  4. 触发切换:当换相时刻到来(由定时器比较事件触发),硬件立即产生一个FORCE_OUT信号。该信号瞬间将PWM输出切换至预先配置好的状态,整个过程无需CPU干预,实现了纳秒级的响应。

FORCE_OUT信号的来源可以灵活选择:可以是本子模块的软件强制位、子模块0的主强制信号、本地重载/同步信号、主重载/同步信号或外部强制信号。这使得换相动作既可以在单个子模块内独立触发,也可以在所有子模块间严格同步触发。

实操心得:在配置无传感器BLDC控制时,通常将换相定时器的比较事件连接到EXT_FORCE信号源,并将其配置为FORCE_OUT的触发源。这样,当反电动势过零点延迟30度电角度后,定时器比较事件会直接触发PWM输出的强制换相,精度极高。务必确保在触发前,新的PWM输出状态(SELx和OUTx)已经配置完毕,否则会输出错误的状态。

3.2 互补模式与死区时间插入:保护功率电路的生命线

在驱动三相全桥电路时,每个桥臂的上管和下管绝不能同时导通,否则会造成电源直接短路,瞬间烧毁功率管。因此,我们需要一对互补的PWM信号来控制上下管,并且必须在其中一个信号关闭后,延迟一段时间再开启另一个信号。这段延迟就是死区时间

FlexPWM通过将INDEP位清零来启用互补模式。在此模式下,一对PWM输出(如PWMA和PWMB)被配置为互补对。模块内部集成了两个独立的死区时间发生器,分别对应上升沿和下降沿的延迟。

死区时间插入逻辑

  • 当PWMA信号需要从低变高(开启上管)时,死区逻辑会先保持两个输出都为低(关闭上下管),并启动一个基于IPBus时钟的递减计数器(初值由DTCNT0设定)。直到计数器归零,PWMA才被允许变高。
  • 同理,当PWMA需要从高变低(关闭上管)时,在PWMB被允许变高(开启下管)之前,会插入由DTCNT1设定的延迟。

这样,无论信号如何变化,在状态切换时都会插入一段两者均为低电平的“死区”,确保了安全。

死区时间带来的电压失真及其补偿: 然而,死区时间的插入会带来一个副作用:输出电压失真。在死区期间,上下管都关闭,电机绕组的电流会通过续流二极管继续流动。此时加在电机端的电压取决于电流方向,而非PWM信号。这导致实际施加到电机的平均电压与PWM占空比设定的电压存在偏差,在低速时会引起转矩脉动和噪音。

FlexPWM支持通过硬件检测和软件补偿来纠正这种失真。模块可以在每个PWM周期的死区结束时,采样PWMX引脚(在互补模式下用于电流状态检测)的电压,并将结果锁存到DT0DT1状态位中。软件可以读取这些位来判断当前是上管在控制电压(电流为正)还是下管在控制电压(电流为负)。

基于电流方向,软件可以采用不同的PWM占空比补偿值:

  • 边沿对齐模式:通常补偿值等于死区时间对应的计数值。
  • 中心对齐模式:通常补偿值为死区时间对应计数值的一半。 补偿的方法是在计算出的目标PWM比较值(VAL2/VAL3VAL4/VAL5)上加上或减去这个补偿值。通过IPOL位或直接根据DTx状态,可以切换使用哪一对比较寄存器,从而实现动态的失真补偿。

3.3 故障保护:系统的紧急制动按钮

工业电机驱动必须具有可靠的故障保护功能。FlexPWM提供了可灵活映射的硬件故障保护机制。多个故障输入引脚(FAULTx)可以任意映射到任何一个或一组PWM输出引脚上。

当故障条件发生时(如过流、过温、母线欠压),故障引脚电平跳变,硬件会立即动作:

  1. 快速响应:存在一条组合逻辑路径,能够近乎瞬时地强制受影响的PWM输出进入安全状态(高电平、低电平或高阻态),由PWMxFS位配置。这是第一道硬件防线。
  2. 滤波防误触:每个故障输入都有可编程的数字滤波器(通过FILT_PERFILT_CNT配置采样周期和一致采样次数),可以有效滤除毛刺干扰,避免误触发。
  3. 灵活的恢复策略:故障清除可以是自动或手动的。
    • 自动清除:当故障引脚电平恢复且一个新的PWM周期开始时,输出自动恢复。
    • 手动清除:需要软件在确认故障解除后,手动清除故障标志位。还可以配置安全模式,要求故障引脚电平恢复后,输出才允许重新使能。

注意事项:故障保护电路甚至在PWM模块未使能(RUN=0)时也是激活的。这意味着一旦故障被锁存,即使你还没启动PWM,它也会阻止输出。在初始化PWM模块前,务必先检查并清除所有故障标志位(FFLAGx)。否则,一使能输出就可能立即进入故障状态。

4. 高级功能与配置指南

4.1 输出比较与触发功能

FlexPWM的比较器不仅可以生成PWM,还可以用作精密的定时输出比较。通过将VALx寄存器设置为一个特定的计数值,并配置对应的翻转触发器,可以在计数器到达该值时,将某个PWM输出引脚设置为指定电平(高或低),并同时产生中断或触发信号给其他外设(如ADC启动转换)。

例如,要实现一个在计数器到达1000时输出高电平的比较事件,你可以将VAL2设为1000,并将VAL3设为一个大于计数器模值VAL1的数(如0xFFFF)。这样,当计数器到达1000时,比较器触发,输出置高;而由于永远不会满足VAL3的比较条件,输出将保持高电平不变,直到被其他事件(如FORCE_OUT)复位。这个功能非常适用于生成精确的时序控制信号或同步其他外设。

4.2 增强型输入捕获

与灵活的输出生成相对应,FlexPWM也提供了增强型输入捕获功能。它不仅能捕获单个边沿的时刻,还能以“乒乓”模式连续捕获信号的上升沿和下降沿,从而精确测量输入信号的脉冲宽度和周期。

更有特色的是其边沿计数与比较功能。输入信号可以先经过一个8位计数器,每检测到一次边沿(可配置为上升沿、下降沿或任意边沿)计数器就加一。当计数值达到用户预设的EDGCMPx值时,产生一个事件。这个事件可以替代原始引脚信号,送入捕获电路。这相当于一个硬件的前置分频器,允许你对高频信号进行分频后再捕获,避免产生过多的CPU中断。你也可以单纯用它来在计数到N个边沿后产生一个中断。

4.3 中心对齐PWM生成

中心对齐PWM因其谐波特性更优,在电机控制中广泛应用。在FlexPWM中生成中心对齐PWM,需要将计数器配置为先向上计数再向下计数的模式(通过CTRL寄存器设置)。

在这种模式下,PWM的对称中心是计数器的峰值点。以PWMA为例,其开启和关闭由两组比较器控制:一组用于向上计数阶段,一组用于向下计数阶段。通常,我们会将VAL2设置为“峰值计数值 - 脉宽/2”,将VAL3设置为“峰值计数值 + 脉宽/2”。这样就能生成一个以计数器峰值为中心对称的PWM脉冲。中心对齐PWM的死区补偿计算与边沿对齐模式有所不同,通常补偿量减半,这一点在配置时需要特别注意。

5. 实战配置流程与常见问题排查

5.1 一个三相PWM输出的基础配置流程

假设我们需要用FlexPWM的子模块0、1、2来生成三相对称的中心对齐PWM,驱动一个三相电机。

  1. 时钟与同步配置

    • 配置子模块0的时钟源和预分频器,设定基础计数时钟频率。
    • 设置子模块0的计数器为“先上后下”模式,并设定VAL1为周期值(决定PWM频率)。
    • 将子模块0的INIT_SEL配置为使用本地同步,使其自成周期。
    • 将子模块0的RELOAD_SEL配置为本地重载,并设置合适的重载频率(如每个PWM周期重载)。
    • 对于子模块1和2,将其INIT_SELRELOAD_SEL都配置为使用来自子模块0的“主同步”和“主重载”信号。这样,三个子模块的计数器周期和参数更新时刻将完全同步。
  2. PWM生成配置

    • 在每个子模块中,根据所需的占空比,计算并写入VAL2VAL3寄存器(对于中心对齐模式,需分别计算上计数和下计数时的比较值)。
    • INDEP位清零,启用互补模式。
    • 根据驱动电路逻辑,配置POLAPOLB位,确定输出有效电平。
    • 根据功率器件的开关特性,计算并设置DTCNT0DTCNT1寄存器的死区时间值。
  3. 输出与保护配置

    • 使能需要的PWM输出引脚(PWMA_EN,PWMB_EN)。
    • 配置故障输入引脚映射(DISMAP寄存器),将过流故障信号映射到所有六个PWM输出。
    • 配置故障安全行为(PWMxFS),例如故障时将所有输出强制为低电平。
    • 使能故障输入滤波,并设置自动或手动清除模式。
  4. 启动

    • 在所有参数配置完成后,一次性设置子模块0、1、2的LDOK位,同步加载所有参数。
    • 最后,置位所有子模块的RUN位,启动PWM输出��

5.2 常见问题与排查技巧

问题1:PWM没有输出或输出异常。

  • 检查时钟和计数器:确认子模块的RUN位已置1。用调试器读取计数器CNT寄存器的值,看它是否在循环计数。如果没有,检查时钟源选择和预分频器配置。
  • 检查输出使能和极性:确认PWMA_EN/PWMB_EN已使能。用万用表或示波器测量引脚电平,结合POLA/POLB配置判断输出是否反相。
  • 检查死区时间:如果启用互补模式但没有输出,可能是死区时间设置过大,导致整个周期内有效电平时间被全部“挤占”。尝试暂时将DTCNT0DTCNT1设为0进行测试。
  • 检查故障状态:读取FFLAGx寄存器,确认是否有故障被锁存。故障会强制关闭输出。

问题2:多相PWM不同步,导致电机振动或噪音大。

  • 检查同步源:确保子模块1和2的INIT_SEL选择了来自子模块0的“Master Sync”。示波器测量各相PWM的周期是否严格一致。
  • 检查重载时机:确保所有子模块的RELOAD_SEL配置一致(例如都使用Master Reload),并且HALF/FULL配置相同。错误的重载时机会导致各相参数更新不同步,产生相位抖动。
  • 检查LDOK操作:修改PWM参数(如VALx)后,必须在所有子模块上设置LDOK,并在同一个重载周期内启动更新。最好使用主重载信号来同步所有子模块的加载。

问题3:使用Force Out换相时,电机运行不平稳,尤其在高速时。

  • 检查换相时刻精度:用于触发FORCE_OUT的定时器比较事件,其时间基准必须与PWM计数器同步。最佳实践是使用与PWM计数器同步的另一个定时器,或者直接使用PWM子模块自身的比较事件(通过交叉触发单元连接)。
  • 检查预配置时机:必须在FORCE_OUT事件触发前,提前配置好SEL23/SEL45OUT23/OUT45等位。如果配置太晚,可能会输出上一拍的状态或不确定状态。建议在换相中断服务例程的早期就完成这些配置。
  • 验证FORCE_OUT信号源:确认FORCE_SEL字段选择了正确的信号源(如EXT_FORCE)。可以通过将FORCE_SEL暂时改为软件FORCE位,并在代码中手动置位该位来测试Force Out逻辑是否正常工作。

问题4:死区补偿效果不理想,低速转矩仍有脉动。

  • 检查电流采样与DTx状态:确保用于死区补偿的电流方向判断是准确的。在低电流区域,DT0DT1可能都处于不确定状态(如一个为0一个为1)。此时进行补偿切换可能会引入噪声。一种策略是在低电流区禁用补偿,或采用平滑的过渡算法。
  • 验证补偿值计算:确认补偿值(死区时间对应的计数器值)计算正确。这个值需要根据实际的IPBus时钟频率和所需的死区时间(纳秒级)进行换算。可以用示波器测量插入的死区时间是否与设定值相符。
  • 检查补偿值应用方向:根据电流方向,补偿值可能是加也可能是减。逻辑错误会导致失真加剧。务必结合电路拓扑(上管导通时电流方向为正还是负?)和DTx状态,仔细推导补偿公式。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询