深入解析ePWM模块:从核心原理到电机控制与数字电源实战
2026/7/25 1:06:54 网站建设 项目流程

1. 项目概述:为什么我们需要ePWM?

如果你在嵌入式领域,特别是电机控制、数字电源或者逆变器这些行当里摸爬滚打过,那对PWM(脉宽调制)肯定不陌生。说白了,它就是让一个数字引脚一会儿高一会儿低,通过调节高电平时间(脉宽)占整个周期的比例(占空比),来等效出一个模拟量,比如电压或者电流。早期的单片机PWM外设功能比较单一,基本上就是设定一个周期和一个比较值,输出固定占空比的方波,高级点的能支持互补输出和死区。

但当你开始玩无刷电机驱动、三相逆变器或者需要多路严格同步的精密电源时,就会发现基础PWM不够用了。你需要能灵活控制多路波形的相位关系,需要硬件级的故障保护能在微秒级内关断输出,需要动态调整占空比而不产生毛刺,还需要用PWM波形本身来触发ADC采样……这时候,增强型脉宽调制(ePWM)模块就该登场了。

ePWM不是一个简单的定时器加比较器,它是一个高度模块化、可编程的波形生成“流水线”。它把PWM生成的各个环节——定时、比较、动作决策、死区插入、故障保护、事件触发——都拆分成独立的子模块。每个子模块就像工厂里的一道工序,你可以独立配置,然后它们通过硬件自动衔接。这种设计带来的最大好处是灵活性与可靠性的统一:软件只需要在合适的时机(比如一个PWM周期开始或结束时)更新配置,硬件就能确保波形连续、无毛刺地输出,同时还能响应紧急故障。

我经手过不少从基础PWM迁移到ePWM的项目,初期会觉得寄存器多得让人头疼,但一旦理清各个子模块的职责和信号流,你就会发现它带来的设计余量和系统可靠性是基础PWM无法比拟的。接下来,我们就抛开数据手册的平铺直叙,以工程师的视角,把这套“流水线”的每个工位都拆开揉碎了讲明白。

2. ePWM核心架构与信号流拆解

理解ePWM,最关键的是建立起清晰的信号流概念。数据手册里的框图往往很复杂,我们把它简化成一条核心流水线,并看看关键的控制信号是如何在其中传递的。

2.1 核心子模块流水线

ePWM模块的运作,可以想象成一条精心设计的装配线:

  1. 时间基准(TB)子模块:这是流水线的“节拍器”。它产生一个不断循环计数的核心计数器(TBCNT),决定了PWM波的“时间轴”。计数模式(向上、向下、上下)、频率(周期TBPRD)、相位(TBPHS)都由它控制。它输出关键的时间标签事件:CTR=0(计数器零)和CTR=PRD(计数器等于周期值),以及计数方向信号CTR_dir
  2. 计数器比较(CC)子模块:这是“标尺工位”。它持续将TB送来的“当前时间”(TBCNT值)与两个预设的“标尺”(CMPA和CMPB寄存器)进行比较。当时间走到标尺刻度时,它就发出事件信号:CTR=CMPACTR=CMPB。这两个事件是控制占空比的关键。
  3. 动作限定(AQ)子模块:这是“决策中心”。它接收来自TB和CC的所有事件(CTR=0,CTR=PRD,CTR=CMPA,CTR=CMPB),并结合当前的计数方向(CTR_dir),根据程序员预先设定的规则,决定此刻对两个输出引脚EPWMxAEPWMxB采取什么“动作”:置高、拉低、翻转,或保持不动。PWM波形的基本形状就是在这里被定义的。
  4. 死区(DB)子模块:这是“安全间隔插入器”。在电机驱动等H桥电路中,同一桥臂的上下两个开关管不能同时导通,否则会短路。AQ模块输出的原始波形经过DB模块,会被自动插入一个可配置的延迟(死区时间),确保两个互补信号在状态切换时,总有一个“全关断”的安全间隔。
  5. PWM斩波(PC)子模块:这是一个“高频调制器”。它可以将AQ/DB模块生成的PWM波,再次用一个更高频率的载波进行调制,生成一串脉冲群。这个功能主要用于驱动隔离型栅极驱动器或变压器的原边开关,因为这类器件通常需要高频交变的信号来维持磁芯复位或传递能量。
  6. 故障保护(TZ)子模块:这是流水线的“紧急制动拉绳”。它连接外部故障引脚(如过流、过温、硬件故障信号)。一旦故障发生,TZ模块可以无视当前流水线的任何状态,在几个时钟周期内,强制将PWM输出设置为预定安全状态(高、低、高阻),实现硬件级保护,速度远超软件中断。
  7. 事件触发(ET)子模块:这是“质量检测与报告点”。它监控流水线上的关键事件(如周期开始、比较点匹配),并可以据此产生中断(EPWMxINT)或触发ADC启动转换(SOC),实现控制环路(如电流环)的精准同步采样。

这七个模块中,TB、CC、AQ是生成任何PWM波都必需的“核心三件套”。DB在驱动半桥/全桥时必不可少。PC和TZ属于特定应用场景的“增强包”。ET则是实现高级控制算法的“连接器”。

2.2 关键控制信号与寄存器映射

每个子模块都由一组专用寄存器控制。理解寄存器功能的关键,是区分“影子寄存器”“活动寄存器”

  • 活动寄存器:直接控制硬件逻辑,其值的变化会立刻影响波形输出。
  • 影子寄存器:是活动寄存器的缓冲。软件平时读写的是影子寄存器。在硬件约定的一个安全时刻(通常是CTR=0CTR=PRD时),影子寄存器的值被自动、同步地加载到活动寄存器。

为什么需要影子寄存器?想象一下,你正在用PWM驱动电机,此时需要改变占空比(即修改CMPA值)。如果你直接写入控制硬件的活动寄存器,而这个写入动作恰好发生在计数器值与旧CMPA值相等的瞬间,可能会导致输出产生一个极窄的毛刺脉冲,甚至使桥臂直通,这是灾难性的。影子寄存器机制确保了所有参数更新都发生在PWM周期的边界(0或周期点),从而保证了波形切换的平滑和无毛刺。

主要的影子寄存器包括周期寄存器TBPRD、比较寄存器CMPA/CMPB。它们的加载时机可以通过对应的控制位(如CMPCTL[LOADAMODE])来配置,非常灵活。

3. 核心子模块深度配置与实战

了解了整体架构,我们深入到最核心的三个模块(TB, CC, AQ),看看如何通过配置它们来生成我们想要的波形。

3.1 时间基准(TB)子模块:一切节奏的起源

TB模块的核心是16位计数器TBCNT和周期寄存器TBPRD

3.1.1 计数模式与波形对称性TB支持三种计数模式,这直接决定了PWM波的对称性:

  • 向上计数模式(Asymmetric Up)TBCNT从0开始累加,到达TBPRD后归零,循环往复。此模式下,CTR=PRD事件在周期末尾发生一次。生成的PWM波是非对称的。
  • 向下计数模式(Asymmetric Down)TBCNTTBPRD开始递减,到0后重置为TBPRD,循环往复。CTR=0事件在周期末尾发生一次。生成的PWM波也是非对称的。
  • 向上-向下计数模式(Symmetric Up-Down)TBCNT从0开始加到TBPRD,然后从TBPRD减回0,循环往复。此模式下,CTR=PRDCTR=0事件在一个周期内各发生一次。生成的PWM波关于中心对称,是对称PWM。

如何选择模式?

  • 电机控制(如SPWM, SVPWM):通常使用对称向上-向下模式。因为对称PWM的谐波特性更好,能有效降低电机损耗和噪音,并且其波形中心对齐的特性便于在峰值��进行电流采样。
  • 普通开关电源:向上或向下模式更简单,计算占空比更直观(占空比 = CMPA / TBPRD)。
  • 需要中心对齐事件的应用:如果需要在PWM周期中间点触发某些操作,对称模式是唯一选择。

3.1.2 频率与周期计算这是最基本的配置,但容易出错。PWM频率Fpwm由系统时钟SYSCLKOUT、TB时钟预分频器、TBPRD值以及计数模式共同决定。

假设系统时钟SYSCLKOUT = 100 MHz,TB预分频器HSPCLKDIV:CLKDIV = 2:2(即先2分频,再2分频,共4分频),则TBCLK = 100MHz / 4 = 25 MHz,周期Ttbcik = 40 ns

  • 向上/向下计数模式Tpwm = (TBPRD + 1) * TtbcikFpwm = 1 / Tpwm例如,TBPRD = 2499,则Tpwm = (2499 + 1) * 40 ns = 100 usFpwm = 10 kHz这里有个坑:公式是TBPRD + 1,因为计数器从0计数到TBPRD,总共是TBPRD+1TBCLK周期。很多人直接TBPRD * Ttbcik,会导致频率比预期慢一点。

  • 向上-向下计数模式Tpwm = 2 * TBPRD * TtbcikFpwm = 1 / Tpwm同样TBPRD = 2499,则Tpwm = 2 * 2499 * 40 ns = 199.92 usFpwm ≈ 5 kHz注意:在对称模式下,为了获得相同的开关频率,TBPRD值需要是向上计数模式的一半。例如,要得到10kHz对称PWM,需设置TBPRD = (100MHz / 4 / 10kHz) / 2 = 1250

3.1.3 同步与相位控制这是ePWM的精华功能之一,用于协调多个ePWM模块,实现多相整流、交错并联等拓扑。

  • 同步链:每个ePWM模块有一个同步输入EPWMxSYNCI和一个同步输出EPWMxSYNCO。你可以将ePWM1的SYNCO连接到ePWM2的SYNCI,以此类推,形成一个主从同步链。当主模块(如ePWM1)的计数器达到特定条件(如CTR=0),它会发出一个同步脉冲,从模块(ePWM2)收到后,可以将其计数器TBCNT重置为相位寄存器TBPHS的值。
  • 相位控制:通过设置从模块的TBPHS寄存器,可以精确控制其波形相对于主模块的相位差。例如,在交错并联Boost电路中,两个通道需要180度错相。如果主模块ePWM1的TBPRD=1000,设置从模块ePWM2的TBPHS=500,那么在同步点,ePWM2的计数器会从500开始计数,从而实现半周期(180度)的相位延迟。

实操心得:同步配置顺序配置同步时,务必遵循“先配置,后启动”的原则。正确的初始化顺序是:1)停止所有相关ePWM模块的时钟(TBCLKEN=0);2)配置主从模块的TB参数(模式、周期、相位);3)配置同步源和同步使能(TBCTL[PHSEN]);4)最后再统一启动时钟(TBCLKEN=1)。这样可以避免计数器在混乱的初始状态下产生错误的同步行为。

3.2 计数器比较(CC)与动作限定(AQ)子模块:波形的雕塑家

CC模块负责发出“时刻”事件,而AQ模块则决定在这些“时刻”做什么。它们共同定义了PWM波的形状。

3.2.1 占空比计算与影子寄存器加载占空比由比较寄存器CMPACMPB的值决定,但计算方式因计数模式而异。

  • 向上计数模式占空比 = CMPA / TBPRD。当TBCNT从0增加到CMPA时,AQ可以设置输出高电平;当TBCNTCMPA增加到TBPRD时,输出低电平。
  • 向下计数模式:逻辑类似,但方向相反。
  • 向上-向下计数模式:情况复杂。在一个完整的上下周期内,CTR=CMPA事件会发生两次(一次在上升沿,一次在下降沿)。通常我们通过配置AQ,在CTR=CMPA且计数器向上时清除输出,在CTR=CMPA且计数器向下时置位输出,这样可以生成一个关于中心对称的PWM波。此时,占空比 = CMPA / TBPRD仍然成立,但CMPA值控制的是脉冲两侧的边沿位置。

影子寄存器加载时机:为了动态调整占空比且无毛刺,必须使用影子寄存器。CMPACMPB的加载时机(LOADAMODE/LOADBMODE)通常配置为在CTR=PRDCTR=0时加载。在对称模式下,CTR=PRDCTR=0都可以作为加载点,但选择CTR=0更为常见,因为它是一个周期的绝对起点,逻辑更清晰。

3.2.2 AQ配置:从事件到动作的映射AQ模块的配置是ePWM编程中最体现技巧的部分。它通过AQCTLAAQCTLB两个寄存器,为EPWMxAEPWMxB分别指定在特定事件(ZRO,PRD,CAU,CAD,CBU,CBD)发生时的动作。

  • ZRO:CTR=0事件
  • PRD:CTR=PRD事件
  • CAU:CTR=CMPA且计数器向上时
  • CAD:CTR=CMPA且计数器向下时
  • CBU,CBD: 类似,针对CMPB

经典配置示例1:生成一路简单的PWM(EPWMxA输出)假设使用向上计数模式,希望EPWMxA在周期开始时为高,当TBCNT等于CMPA时变低。

  • AQCTLA配置:ZRO = SET(计数器为0时,置位输出高),CAU = CLEAR(计数器向上等于CMPA时,清除输出低)。
  • 这样,每个周期开始输出变高,在CMPA时刻变低,直到周期结束归零后再次变高。占空比 = CMPA / TBPRD。

经典配置示例2:生成一对互补带死区的PWM(EPWMxA和EPWMxB)假设使用向上-向下计数模式,希望生成一对中心对称的互补PWM,用于驱动一个半桥。

  • AQCTLA配置:CAD = SET(计数器向下等于CMPA时,EPWMxA置高),CAU = CLEAR(计数器向上等于CMPA时,EPWMxA清除低)。
  • AQCTLB配置:CAD = CLEAR(计数器向下等于CMPA时,EPWMxB清除低),CAU = SET(计数器向上等于CMPA时,EPWMxB置位高)。
  • 这样,EPWMxAEPWMxB的输出在逻辑上是完全互补的。然后再将这两路信号送入死区(DB)模块,插入硬件死区。

注意事项:AQ事件优先级如果多个事件在同一时刻发生(例如在向上-向下模式中,CMPA=TBPRD,那么CAUPRD事件可能同时发生),AQ模块内部有固定的优先级裁决逻辑。通常,PRDZRO的优先级高于CAU/CAD。在编写复杂波形(如空间矢量PWM)时,必须仔细考虑事件发生的顺序和优先级,避免出现非预期的输出跳变。最稳妥的方法是确保比较值CMPA/CMPB严格介于0和TBPRD之间,避免与边界值相等。

4. 高级功能模块:死区、斩波与故障保护

核心波形生成后,ePWM还提供了几个关键模块来增强其在实际功率电路中的应用能力。

4.1 死区(DB)子模块:桥臂安全的守护神

死区时间是互补PWM信号在状态切换时,人为加入的一段两者均为低电平(对于高侧有效、低侧有效的驱动逻辑)的延迟时间,目的是防止上下管“直通”短路。

DB模块独立地对AQ输出的两路信号(通常称为EPWMxAEPWMxB的原始信号)进行处理。它提供四种主要模式:

  1. 完全禁用:信号直通。
  2. 仅对A路引入上升沿延迟EPWMxA的上升沿被延迟,下降沿不变;EPWMxB不变。
  3. 仅对B路引入下降沿延迟EPWMxA不变;EPWMxB的下降沿被延迟,上升沿不变。
  4. 完全使能(最常用):对EPWMxA的上升沿和EPWMxB的下降沿同时引入延迟。或者反过来,取决于极性配置。

配置要点

  • DBRED(上升沿延迟寄存器):定义信号从非有效态切换到有效态时需要插入的延迟时间(以TBCLK周期为��位)。
  • DBFED(下降沿延迟寄存器):定义信号从有效态切换到非有效态时需要插入的延迟时间。
  • DBCTL[POLSEL](极性选择):决定哪路信号被视为“高有效”,哪路是“低有效”,从而决定对哪一路的哪个边沿施加延迟。这是最容易配置出错的地方。务必根据你驱动的功率器件(IGBT, MOSFET)和栅极驱动器逻辑(高有效还是低有效)来仔细设置。

死区时间计算Tdead = DBRED_Value * Ttbcik。例如,TBCLK=25MHz (40ns),需要500ns死区,则DBRED_Value = 500ns / 40ns = 12.5,应向上取整为13。实际死区时间= 13 * 40ns = 520ns死区时间并非越长越好,过长的死区会降低输出电压利用率,增加谐波。通常根据功率器件的开关特性(开通/关断时间)和驱动器传播延迟来设定,留出足够余量即可,一般在数百纳秒到一两微秒之间。

4.2 PWM斩波(PC)子模块:驱动隔离器与变压器的利器

PC模块用于生成高频脉冲串,主要目的是驱动需要交流耦合的器件,如:

  • 隔离型栅极驱动器(如采用变压器隔离的驱动器):需要高频载波来传递能量和信号。
  • 门极驱动变压器的原边:需要交变电压防止变压器磁芯饱和。

工作原理:PC模块内部有一个高频载波发生器(频率由CHPFREQ配置,是TBCLK的分频)。它将输入的PWM波(来自DB模块)与这个高频载波进行“与”操作。在输入PWM为高电平期间,输出是一串高频脉冲;在输入PWM为低电平时,输出持续为低。

  • CHPDUTY:控制高频脉冲串中,第一个脉冲的宽度。
  • CHPFRQ:控制高频载波的频率。
  • OSHTWTH:控制单次触发脉冲的宽度(如果使能)。

应用技巧:在使用PC功能时,输入PWM的频率(即主开关频率)应远低于斩波频率(通常至少10倍以上),以确保有足够多的高频脉冲来维持被驱动侧的能量。同时,需要根据隔离变压器或耦合电容的参数来调整第一个脉冲的宽度CHPDUTY,以优化启动特性。

4.3 故障保护(TZ)子模块:硬件级的最后防线

TZ模块是系统安全的关键。它连接外部数字故障引脚(如TZ1~TZ6),一旦故障发生,可以在极短时间(几个时钟周期)内绕过CPU,直接控制PWM输出状态。

两种触发模式

  • 单次触发(One-Shot):故障信号有效后,PWM输出立即被强制到安全状态(高、低、高阻),并且锁定在该状态,直到软件通过写TZCLR寄存器来清除故障标志。
  • 周期循环(Cycle-By-Cycle):故障信号有效后,PWM输出被强制到安全状态,但仅持续当前PWM周期。在下一个PWM周期开始时,如果故障信号已消失,输出自动恢复正常;如果故障依然存在,则再次动作。这种模式适用于过流保护等需要逐周期限流的场景。

配置核心

  1. TZSEL:选择哪些TZ引脚(TZ1~TZ6)可以触发本ePWM模块的故障保护,以及每个引脚是单次触发还是周期循环模式。
  2. TZCTL:定义当故障发生时,EPWMxAEPWMxB输出应被强制为何种状态(高、低、高阻、忽略)。
  3. TZEINT:选择是否在故障发生时产生中断,以便软件记录故障原因或进行恢复操作。

安全设计铁律对于任何可能导致硬件损坏的故障(如过流、桥臂直通、过热),必须配置为单次触发模式,并将输出强制为高阻或关断状态。周期循环模式仅适用于需要动态限流、且不会立即损坏硬件的场景。故障保护电路的响应时间必须远快于软件中断响应时间,这是ePWM硬件保护的核心价值。

5. 事件触发(ET)与中断管理:实现精准控制环路

ET模块将ePWM的内部事件(如周期开始、比较点到达)与系统中断、ADC启动转换(SOC)关联起来,是实现数字控制环路(如电流环、速度环)同步采样的基石。

5.1 中断与ADC触发源

ET模块可以产生两种类型的中断/触发:

  • EPWMx_INT:ePWM模块自身的中断。可以配置由多种事件触发,如CTR=PRD,CTR=0,CTR=CMPA/CMPB等。
  • **EPWMx_SOCAEPWMx_SOCB:用于触发ADC开始转换的信号。这是实现**同步采样**的关键。例如,在电机控制中,我们希望在PWM波形的中心点(对称模式的峰值点)或谷底点采样相电流,此时电流纹波最小,采样最准确。通过配置ET模块在CTR=0(对称模式的中心点)或CTR=CMPB时产生SOCA` 信号去触发ADC,就可以实现硬件级的精准同步,完全消除软件延迟带来的抖动。

5.2 中断初始化与防误触发

数据手册中特别强调了一个至关重要的初始化顺序,这是无数人踩过的坑:

  1. 关闭全局中断(操作CPU的INTM位)。
  2. 禁用ePWM模块中断(清除ETSEL[INTEN]等)。
  3. 初始化所有ePWM寄存器(配置TB, CC, AQ, DB等)。
  4. 清除可能存在的虚假ePWM中断标志(写ETCLR[INT])。
  5. 使能ePWM模块中断
  6. 最后,打开全局中断

为什么必须按这个顺序?在ePWM模块时钟刚使能、寄存器还未正确配置的混沌期,硬件可能因为随机状态产生一些虚假的事件,从而置位中断标志。如果你先使能了中断,这些虚假标志会立即触发中断,导致程序跑飞。这个顺序确保了在打开中断水龙头之前,水池(中断标志寄存器)已经是空的,并且水龙头连接到了正确的管道(中断服务程序)。

5.3 高级同步采样模式

利用ET和CC模块的联动,可以实现更复杂的采样模式。例如,在交错并联PFC电路中,需要在两个开关管电流的峰值点分别采样。可以配置两个ePWM模块(ePWM1, ePWM2)同步运行但相位差180度。为每个模块的ADC触发信号SOCA选择不同的触发源:ePWM1在CTR=CMPA时触发,ePWM2在CTR=CMPB时触发。通过精心设置CMPACMPB的值,就可以让两个ADC采样时刻精确对准各自通道的电流峰值。

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

理论说再多,不如动手调一遍。下面以一个典型的电机控制应用——生成一对中心对称、带死区、可同步ADC采样的互补PWM为例,梳理配置流程和避坑指南。

6.1 完整配置流程清单

  1. 时钟与引脚初始化

    • 使能ePWM模块的时钟。
    • 配置GPIO MUX,将所需引脚功能设置为ePWM输出模式。
  2. 时间基准(TB)模块配置

    • 设置TBCTL[CTRMODE] = 2,选择向上-向下对称计数模式。
    • 根据目标PWM频率和系统时钟,计算并设置TBPRD值。例如,SYSCLKOUT=100MHzTBCLK=25MHz,目标Fpwm=10kHz,则TBPRD = (TBCLK / Fpwm) / 2 = (25MHz / 10kHz) / 2 = 1250
    • 设置时钟预分频TBCTL[HSPCLKDIV]TBCTL[CLKDIV]
    • 如果需要同步,配置TBCTL[PHSEN]TBPHS(相位寄存器),并设置同步输出源TBCTL[SYNCOSEL]
  3. 计数器比较(CC)模块配置

    • 配置CMPCTL[LOADAMODE] = 0(在CTR=0时加载影子寄存器),确保占空比更新无毛刺。
    • 初始化CMPACMPB为初始占空比对应的值(例如,50%占空比则CMPA = TBPRD / 2)。
    • 使能CMPA和CMPB的影子寄存器模式(CMPCTL[SHDWAMODE] = 0,SHDWBMODE = 0)。
  4. 动作限定(AQ)模块配置

    • 配置AQCTLACAD = SET(向下过CMPA时置高),CAU = CLEAR(向上过CMPA时清除低)。这将使EPWMxA输出一个中心对称的PWM。
    • 配置AQCTLBCAD = CLEAR,CAU = SET。这将使EPWMxB输出与EPWMxA互补的波形。
    • (可选)配置软件强制寄存器AQSFRC,用于调��时手动控制输出。
  5. 死区(DB)模块配置

    • 使能DB模块,DBCTL[MODE] = 3(完全使能模式)。
    • 根据功率器件需求计算死区时间,并设置DBREDDBFED寄存器。例如,需要500ns死区,TBCLK=40ns,则设置DBRED = DBFED = 13(520ns)。
    • 根据驱动逻辑设置DBCTL[POLSEL]。假设使用高电平有效驱动上管,低电平有效驱动下管,且AQ输出的原始互补信号中,A路驱动上管,B路驱动下管,则通常选择ACTV_HICACTV_LOC模式,具体需参考数据手册和驱动器数据表。
  6. 故障保护(TZ)模块配置

    • 配置TZSEL,选择用于故障保护的TZ引脚,并设置为单次触发模式(CBCn=0, OSHTn=1)。
    • 配置TZCTL,定义故障发生时输出状态,例如TZA = TZ_FORCE_LO(强制低),TZB = TZ_FORCE_HI(强制高),或两者都强制为高阻TZ_HIZ,具体取决于安全状态需求。
    • 使能TZ中断(TZEINT)以便记录故障。
  7. 事件触发(ET)模块配置

    • 遵循“防误触发初始化顺序”。
    • 配置ETSEL[INTSEL]选择中断源,例如选择CTR=PRD在周期结束时产生中断。
    • 配置ETPS[INTPRD]设置中断分频(例如每个事件都中断ET_1ST)。
    • 配置ETSEL[SOCASEL]选择ADC触发源,例如选择CTR=0在计数器为0(对称PWM的中心点)时触发ADC采样。
    • 使能SOCA触发ETSEL[SOCAEN]
  8. 启动与同步

    • 如果涉及多模块同步,确保所有从模块配置完毕。
    • 最后,通过设置PWMSS_CTRL寄存器中的TBCLKEN位,同时启动所有ePWM模块的时基时钟。

6.2 常见问题与排查技巧实录

以下是我在调试中常遇到的“坑”及其解决方法:

问题现象可能原因排查步骤与解决方案
无PWM输出1. 模块时钟未使能。
2. GPIO引脚未正确复用为ePWM功能。
3. 输出被强制(AQSFTC或TZ模块强制)。
4. 计数器未启动(TBCTL[CTRMODE]=FREEZE)。
1. 检查外设时钟使能寄存器(如PCLKCR0)。
2. 检查GPIOxMUXGPIOxGMUX寄存器。
3. 检查AQSFTCAQCSFTC寄存器,确保没有软件强制。检查TZFLG寄存器,看是否发生故障锁定。
4. 检查TBCTL[CTRMODE]是否为0,1,2。
PWM频率不对1.TBPRD计算错误,忽略了+1*2
2. 时钟预分频器HSPCLKDIV/CLKDIV配置错误。
3. 系统时钟SYSCLKOUT频率与预期不符。
1. 重新核对频率计算公式,区分向上计数和向上-向下计数模式。
2. 核对TBCTL寄存器中分频位设置。
3. 检查PLL配置,确认系统时钟频率。
占空比无法改变1. 比较寄存器CMPA/CMPB配置在影子寄存器模式,但未在正确时机写入。
2. 写入的是影子寄存器,但加载事件未发生(如未使能加载,或计数器未达到加载点)。
3. 写入了错误的寄存器地址。
1. 确认CMPCTL[LOADAMODE]配置,并确保在CTR=0PRD后更新CMPA值。
2. 可以暂时切换到立即加载模式(SHDWAMODE=1)测试,但注意可能产生毛刺。
3. 使用调试器查看CMPA活动寄存器的值是否随写入变化。
互补波形有重叠(直通风险)1. 死区模块未使能或配置错误。
2. DB模块的输入信号极性DBCTL[POLSEL]配置错误,导致延迟加在了错误的边上。
3. AQ模块生成的原始互补信号本身就有重叠(逻辑错误)。
1. 首先用示波器观察DB模块输入的两路信号(即AQ直接输出的信号),确认它们是理想的互补方波。
2. 再观察DB模块输出的信号,检查死区时间是否出现,以及出现在哪个边沿。根据结果调整POLSEL
3. 检查AQCTLAAQCTLB配置,确保是真正的互补逻辑。
ADC采样时刻不精准1. ET模块的SOC触发源选择错误。
2. ADC模块的SOC触发配置未正确关联到ePWM的SOC信号。
3. 存在软件延迟,未使用硬件触发而使用了软件触发。
1. 确认ETSEL[SOCASEL]选择了正确的事件(如CTR=0)。
2. 检查ADC配置,确认其SOC触发源设置为对应的ePWM SOC信号(如EPWM1_SOCA)。
3.务必使用硬件触发。在中断服务程序中启动ADC会引入不可控的抖动。
多路ePWM不同步1. 同步链未正确连接或使能。
2. 从模块的相位寄存器TBPHS未配置。
3. 主从模块的时钟预分频或计数模式不一致。
4. 同步发生在配置完成之前。
1. 检查TBCTL[SYNCOSEL]配置主模块的输出源,检查从模块的TBCTL[PHSEN]是否使能。
2. 设置从模块的TBPHS为期望的相位差对应的计数值。
3. 确保主从模块的TBCTL[HSPCLKDIV],CLKDIV,CTRMODE一致。
4. 严格按照第8步的启动顺序操作。

调试ePWM,示波器是最好用的朋友。一定要养成同时观察多路信号的习惯:看TB的同步信号SYNCI/SYNCO,看AQ输出的原始波形,看DB插入死区后的波形,最终再看驱动芯片输入端的波形。通过分段观察,可以快速定位问题出在哪个模块。

最后,再分享一个软件架构上的小技巧:将ePWM的所有配置参数(TBPRD,CMPA,CMPB, 死区时间等)封装在一个结构体中,并编写一个统一的EPWM_Config()函数。在控制环路中,更新占空比时,不要直接写CMPA寄存器,而是更新结构体中的变量,然后在安全点(如CTR=0中断中)统一批量写入影子寄存器。这样不仅代码清晰,也更安全。ePWM是一个强大的工具,理解其模块化思想,你就能像搭积木一样,构建出满足各种复杂需求的功率控制波形。

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

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

立即咨询