1. 项目概述:从“会配置”到“懂原理”的ePWM深度解析
在电机控制、数字电源和逆变器这些硬核的嵌入式应用里,PWM(脉冲宽度调制)信号的精度和灵活性直接决定了系统的性能上限。很多工程师朋友在初次接触德州仪器(TI)C2000系列微控制器中的增强型PWM(ePWM)模块时,往往会被其繁多的寄存器、复杂的子模块交互搞得一头雾水。大家可能都照着例程配通过,但一旦需要实现一个非标准的、带复杂同步关系的波形,或者调试一个诡异的输出毛刺时,就感觉无从下手。这背后的根本原因,是我们对ePWM三大核心子模块——时间基准(TB)、计数器比较(CC)和动作限定器(AQ)——的内在逻辑和工作机制理解得不够透彻。
今天,我就结合自己多年在电机驱动和数字电源项目中的踩坑经验,抛开数据手册的平铺直叙,带你深入ePWM的“心脏”,看看时间基准如何像乐队的指挥一样打拍子,计数器比较如何精准地标记关键节拍,而动作限定器又如何将这些节拍翻译成输出引脚上具体的“高”或“低”动作。我们不仅要搞懂每个寄存器位是干什么的,更要理解它们为什么这么设计,以及在实战中如何组合运用,生成从简单到复杂的各种PWM波形,并实现多个ePWM模块之间的精确同步。无论你是正在评估C2000用于新项目,还是已经在使用但想更上一层楼,相信这篇深度解析都能给你带来新的启发。
2. ePWM核心架构与设计哲学
在深入细节之前,我们有必要先俯瞰ePWM模块的整体架构和设计思想。ePWM不是一个简单的“计数器+比较器”,而是一个高度模块化、可配置的波形生成引擎。这种设计源于工业应用中对PWM信号的复杂需求:不仅仅是调节占空比,还要能控制死区时间、实现多通道同步、响应外部故障信号即时关断,并能触发ADC采样等。
2.1 模块化设计:各司其职的流水线
ePWM模块可以看作一条精心设计的信号处理流水线,每个子模块负责一个特定的阶段:
- 时间基准(TB)子模块:这是整个PWM波的“时钟源”和“节拍器”。它产生一个不断循环计数的核心计数器TBCTR,并定义了这个计数循环的周期(TBPRD)和起始相位(TBPHS)。它决定了PWM波的“时间轴”。
- 计数器比较(CC)子模块:它在时间轴(TBCTR)上设置关键的“事件标记点”。通过CMPA和CMPB两个比较寄存器,当TBCTR计数到与这两个寄存器值相等时,就会产生“CTR=CMPA”和“CTR=CMPB”两个关键事件信号。这两个点直接决定了PWM脉冲边沿的位置。
- 动作限定器(AQ)子模块:这是将“事件”转化为“动作”的翻译官和决策者。它接收来自TB子模块的“CTR=PRD”(周期点)、“CTR=ZERO”(零点)事件,以及来自CC子模块的“CTR=CMPA/B”事件。然后,根据用户配置的规则(AQCTLA、AQCTLB寄存器),决定在哪个事件发生时,对输出引脚EPWMxA和EPWMxB执行什么操作:置高(SET)、拉低(CLEAR)、翻转(TOGGLE)或保持(DO NOTHING)。
这种流水线式的设计带来了极大的灵活性。你可以独立配置TB的计数模式(向上、向下、上下)来生成对称或非对称PWM;可以独立设置CMPA和CMPB的值来精确定义脉冲的上升沿和下降沿;还可以独立定义每个事件对两个输出引脚的不同动作,从而生成互补、独立甚至带有复杂相位关系的多路PWM信号。
2.2 同步与影子寄存器:可靠性的两大基石
除了模块化,ePWM还有两个至关重要的设计,用于应对复杂系统和实时控制的需求:
- 同步链(Synchronization Chain):在多个ePWM模块(如ePWM1, ePWM2...)协同工作的场景下(例如三相全桥逆变器),确保它们之间的相位关系精确可控是必须的。ePWM模块通过EPWMxSYNCI(同步输入)和EPWMxSYNCO(同步输出)引脚,可以将一个模块(主模块)的特定事件(如计数器归零)作为同步脉冲,传递给下一个模块(从模块)。从模块的TB子模块在收到同步脉冲时,可以将其计数器TBCTR重载为相位寄存器TBPHS的值,从而实现从模块波形相对于主模块的固定相位偏移(领先或滞后)。这就构建了一条精确的同步链,是驱动多相电机或交错并联电源的核心。
- 影子寄存器(Shadow Register):在PWM波形实时运行的过程中,如果软件直接修改正在参与比较的CMPA/CMPB活跃寄存器,很可能导致在一个PWM周期内,比较值发生突变,从而产生非预期的窄脉冲或毛刺,这在功率电路中是极其危险的。影子寄存器机制就是为了解决这个问题。用户实际写入的是CMPA/CMPB的影子寄存器,硬件会在一个安全的时刻(如TBCTR计数到0或计数到周期值TBPRD时),自动将影子寄存器的值更新到活跃寄存器。这样,PWM波形的改变总是以完整的周期为单位进行,确保了输出的平滑和无毛刺切换。TBPRD(周期寄存器)也支持类似的影子寄存器机制。
理解了这套以TB为时间轴、CC标记事件、AQ执行动作为核心,并以同步和影子寄存器保障其可靠性和协同性的设计哲学,我们再深入每个子模块的细节时,就会感觉脉络清晰,不再是孤立地记忆寄存器功能了。
3. 时间基准(TB)子模块:PWM波形的节拍器
时间基准子模块是整个ePWM模块的“心脏”,它定义了PWM波形的根本时间属性。你可以把它想象成一个数字化的、可编程的“秒表”,这个秒表的走法(计数模式)、一圈有多长(周期)、以及从哪里开始跑(相位和同步),都由TB子模块控制。
3.1 核心计数器TBCTR与计数模式
TB子模块的核心是一个16位的向上/向下计数器TBCTR。它的计数行为由TBCTL寄存器的CTRMODE位域控制,主要有四种模式:
- 向上计数模式(TB_COUNT_UP):TBCTR从0开始,每个TBCLK时钟周期加1,直到等于周期寄存器TBPRD的值,然后在下一个时钟周期归零,并重新开始。这种模式产生非对称PWM波形。PWM周期
Tpwm = (TBPRD + 1) * Ttbclk。例如,TBPRD设为599,则计数器序列为0,1,2...599, 0,1,2...,一个周期内共有600个时钟滴答。 - 向下计数模式(TB_COUNT_DOWN):TBCTR从TBPRD的值开始,每个TBCLK时钟周期减1,直到等于0,然后在下一个时钟周期重新加载TBPRD的值。同样产生非对称PWM波形,周期计算公式与向上模式相同。
- 向上-向下计数模式(TB_COUNT_UPDOWN):TBCTR从0开始向上计数到TBPRD,然后立即转向向下计数回0,如此反复。这种模式产生对称PWM波形,波形关于周期中心对称。PWM周期
Tpwm = (2 * TBPRD) * Ttbclk。这是电机控制中常用的模式,因为它能产生中心对齐的PWM,有助于降低谐波。 - 停止模式(TB_FREEZE):计数器保持当前值不变,用于调试或紧急停止。
实操心得:模式选择背后的考量选择哪种计数模式,取决于你的应用需求。向上/向下模式简单,计算占空比直观(高电平时间 = CMPA值 * Ttbclk)。而上下模式虽然计算稍复杂(以CMPA为例,高电平时间 = 2 * (TBPRD - CMPA) * Ttbclk,假设在CAU置高、CAD拉低),但其产生的对称波形在驱动H桥时,能使得上下管开关时刻对称,减少电流纹波和电磁干扰(EMI),是电机矢量控制(FOC)的首选。在数字电源的移相全桥等拓扑中,上下模式也便于实现对称的软开关时序。
3.2 周期、相位与同步机制
- 周期设置(TBPRD):这个寄存器定义了计数器的最大值(向上模式)或初始值(向下模式),是决定PWM频率的关键。
PWM频率 = 1 / Tpwm。TBPRD通常也支持影子寄存器,确保频率切换平滑。 - 相位控制与同步(TBPHS & EPWMxSYNCI):这是实现多模块协同工作的关键。每个ePWM模块都有一个相位寄存器TBPHS。当该模块被配置为“相位加载使能”(TBCTL.PHSEN=1)时,一旦检测到同步输入脉冲EPWMxSYNCI,就会在下一个TBCLK时钟边沿,将TBPHS的值加载到TBCTR中。
- 应用场景:假设ePWM1驱动三相逆变器的U相,ePWM2驱动V相,ePWM3驱动W相。我们可以将ePWM1设为主模块,将其“CTR=ZERO”事件通过EPWM1SYNCO输出。将ePWM2和ePWM3的EPWMxSYNCI连接到这个输出,并设置ePWM2的TBPHS为
TBPRD/3,ePWM3的TBPHS为2*TBPRD/3。这样,当ePWM1计数器归零时,ePWM2和ePWM3会分别加载各自的相位值,从而生成三相互差120度电角度的PWM波,完美用于三相电机驱动。 - 同步源:同步脉冲不仅可以来自外部引脚或另一个ePWM模块,还可以由软件强制产生(写TBCTL.SWFSYNC位),或由数字比较(DC)子模块的事件产生,非常灵活。
- 应用场景:假设ePWM1驱动三相逆变器的U相,ePWM2驱动V相,ePWM3驱动W相。我们可以将ePWM1设为主模块,将其“CTR=ZERO”事件通过EPWM1SYNCO输出。将ePWM2和ePWM3的EPWMxSYNCI连接到这个输出,并设置ePWM2的TBPHS为
- 全局时钟同步(TBCLKSYNC):这是一个非常实用的功能。在系统初始化时,所有ePWM模块的TBCLK可能处于随机的相位关系。通过先配置好所有模块的预分频器和模式,然后统一将TBCLKSYNC位置1,可以确保所有ePWM模块的时基时钟在同一个上升沿同时启动,实现了绝对的初始时间对齐。
3.3 时基子模块的配置流程与避坑指南
一个稳健的TB子模块初始化流程通常如下:
- 禁用时基时钟同步(TBCLKSYNC = 0),停止所有时基计数器。
- 配置系统时钟分频(TBCTL.HSPCLKDIV和CLKDIV),确定TBCLK频率。这里有个坑:过高的TBCLK频率(即过细的时间分辨率)可能导致计数器溢出或达不到所需的低频PWM;而过低的频率又会影响PWM精度。需要根据PWM频率和分辨率需求折中计算。
- 设置计数模式(TBCTL.CTRMODE)。
- 设置周期值TBPRD及其影子加载模式(TBCTL.PRDLD)。
- 配置同步相关参数:是否使能相位加载(TBCTL.PHSEN)、设置相位值TBPHS、选择同步输出源(TBCTL.SYNCOSEL)。
- 将计数器TBCTR清零或设为一个初始值。
- 最后,使能全局时基时钟同步(TBCLKSYNC = 1),让所有ePWM模块开始同步运行。
常见问题排查:
- 问题:PWM输出频率不对。
- 检查:首先确认系统时钟SYSCLK是否正确。然后检查TBCTL的HSPCLKDIV和CLKDIV分频设置。最后核对TBPRD的计算公式:向上/向下模式为
(TBPRD + 1) * Ttbclk;上下模式为2 * TBPRD * Ttbclk。- 问题:多个ePWM模块之间不同步,相位关系乱。
- 检查:1) 确认同步链连接正确,主模块的SYNCO输出连接到从模块的SYNCI输入。2) 检查从模块的TBCTL.PHSEN是否使能。3) 确认TBPHS寄存器的值设置正确。4) 检查主从模块的TBCLK分频设置是否一致,不一致的时钟分频会导致同步后相位逐渐漂移。
4. 计数器比较(CC)子模块:PWM波形的雕刻刀
如果说TB子模块定义了画布(时间轴)的尺寸和起始点,那么CC子模块就是在画布上精确标记关键位置(脉冲边沿)的雕刻刀。它通过两个独立的比较寄存器CMPA和CMPB,将TBCTR的计数值与预设值进行比较,从而在精确的时刻产生事件信号。
4.1 CMPA/CMPB寄存器与比较事件
CC子模块的核心功能很简单:它持续比较TBCTR的值与CMPA、CMPB寄存器的值。当两者相等时,就分别产生“CTR = CMPA”和“CTR = CMPB”事件。这两个事件是后续动作限定器(AQ)生成PWM边沿动作的直接触发器。
关键点在于事件产生的频率,它取决于TBCTR的计数模式:
- 在向上或向下计数模式中:每个PWM周期内,TBCTR的值会线性地扫过从0到TBPRD(或反向)的整个范围。因此,只要CMPA/CMPB的值在[0, TBPRD]区间内,每个周期就会产生一次“CTR=CMPx”事件。
- 在向上-向下计数模式中:TBCTR的值会先上升后下降。因此,如果CMPx的值在(0, TBPRD)开区间内,每个PWM周期会产生两次比较事件:一次在上升沿(CAU/CBU),一次在下降沿(CAD/CBD)。如果CMPx等于0或TBPRD,则只会在计数到0或TBPRD时产生一次事件(这个事件同时是TB事件,由AQ子模块的优先级处理)。
4.2 影子寄存器机制:实现平滑无毛刺的PWM更新
这是CC子模块,乃至整个ePWM模块中,对于安全可靠运行至关重要的一个特性。在电机控制或数字电源中,我们经常需要实时调整PWM的占空比(即修改CMPA/CMPB的值)。如果软件直接写入正在参与当前周期比较的活跃寄存器(Active Register),可能会发生这样的危险情况:写入操作发生在TBCTR刚刚经过旧CMP值之后、但旧周期结束之前。这会导致硬件在同一个周期内,错误地使用新旧混合的值进行比较,产生一个极窄的、非预期的脉冲(即“毛刺”)。这种毛刺在功率电路中可能引起直通短路、电压尖峰等严重问题。
影子寄存器(Shadow Register)机制就是为了彻底杜绝这种情况。其工作原理如下:
- 双缓冲结构:CMPA和CMPB实际上各有一套“影子寄存器”和“活跃寄存器”。用户通过软件写入的地址,对应的是影子寄存器。
- 受控加载:影子寄存器中的值,不会立即生效。硬件只会在用户指定的、安全的“加载点”将影子寄存器的值复制到活跃寄存器。这两个加载点通常是:
CTR = PRD:TBCTR计数到周期值(在上下模式中,这是计数器转向点)。CTR = ZERO:TBCTR计数到零(在上下模式中,这也是计数器转向点)。 通过配置CMPCTL.LOADAMODE和LOADBMODE位,可以独立为CMPA和CMPB选择加载时机。
- 无毛刺更新:由于加载动作发生在计数器到达周期边界或零点的时刻,此时一个完整的PWM周期刚刚结束,新的周期正要开始。因此,新的比较值会在全新的周期中生效,确保了PWM波形在两个完整周期之间平滑过渡,完全避免了周期内的毛刺。
配置示例:在电机FOC控制中,我们通常在中断服务程序里计算得到新的占空比(对应新的CMPA/CMPB值),然后写入影子寄存器。通过配置为在CTR=ZERO时加载,可以确保在下一个PWM周期开始时,新的电压矢量被准确应用,实现精确的磁场定向控制。
4.3 计数器比较子模块的配置与波形生成逻辑
CC子模块的配置相对直接,主要围绕CMPCTL寄存器进行:
CMPCTL[SHDWAMODE]和CMPCTL[SHDWBMODE]:分别控制CMPA和CMPB是否启用影子模式。强烈建议在需要动态更新的应用中使能影子模式(设为0)。仅在调试或静态配置时,可设为立即加载模式(1)。CMPCTL[LOADAMODE]和CMPCTL[LOADBMODE]:选择影子寄存器到活跃寄存器的加载时机。CTR=PRD、CTR=ZERO或两者皆可。在上下计数模式中,选择CTR=ZERO是常见做法。CMPA和CMPB:这就是我们写入比较值的地方。注意:在上下计数模式下,为了生成对称PWM,我们通常让CMPA控制一个通道(如EPWMxA)的占空比。此时,CMPA的值决定了高电平的宽度。具体关系需结合AQ的动作配置来理解。
注意事项:比较值超出范围的处理这是一个容易忽略但重要的细节。如果CMPA或CMPB的值设置得大于TBPRD,在不同计数模式下的行为是不同的:
- 向上计数模式:如果CMPx > TBPRD,则“CTR=CMPx”事件永远不会发生,因为计数器最大只到TBPRD。
- 向下计数模式:如果CMPx >= TBPRD,则“CTR=CMPx”事件会在计数器等于TBPRD(即周期点)时发生。
- 向上-向下计数模式:如果CMPx >= TBPRD,则“CTR=CMPx”事件会在计数器等于TBPRD(即周期点)时发生(包括上升沿和下降沿的比较事件)。 理解这一点,可以帮助我们避免因计算错误或边界条件处理不当而导致的PWM输出异常。在编程时,对CMP值进行限幅(Clamp)操作,将其约束在[0, TBPRD]区间内,是一个好习惯。
5. 动作限定器(AQ)子模块:事件到动作的指挥官
时间基准提供了节拍,计数器比较标记了关键音符,而动作限定器就是那位指挥家,它决定在每一个节拍点,乐队(输出引脚EPWMxA/B)应该演奏什么音符(高电平、低电平或翻转)。AQ子模块是ePWM波形生成的最终执行层,它将TB和CC产生的事件,转化为对输出引脚的实际控制动作。
5.1 事件、动作与优先级机制
AQ子模块的输入是四种类型的事件:
CTR = PRD:计数器等于周期值(TBCTR = TBPRD)。CTR = ZERO:计数器等于零(TBCTR = 0x0000)。CTR = CMPA:计数器等于比较寄存器A的值(TBCTR = CMPA)。CTR = CMPB:计数器等于比较寄存器B的值(TBCTR = CMPB)。
对于每一个事件,用户都可以通过AQCTLA(控制EPWMxA)和AQCTLB(控制EPWMxB)寄存器,独立地配置当该事件发生时,对应的输出引脚应该执行什么动作:
- 置高(AQ_SET):强制输出为高电平。
- 拉低(AQ_CLEAR):强制输出为低电平。
- 翻转(AQ_TOGGLE):输出电平取反。
- 无操作(AQ_DO_NOTHING):输出保持不变。注意,即使配置为无操作,该事件仍然可以用于触发中断或ADC启动。
一个核心难点:事件优先级。在向上-向下计数模式中,由于计数器会两次经过同一个值(上升和下降),CTR=CMPA和CTR=CMPB事件每个周期可能发生两次。更复杂的是,在计数器转向点(ZERO和PRD),多个事件可能在同一时刻(实际上是一个TBCLK周期内)发生。例如,在上下模式中,当计数器从PRD向下计数时,CTR=PRD事件和CTR=CMPx(如果CMPx等于PRD)事件可能同时有效。
硬件为此定义了严格的优先级规则,以确保输出行为的确定性。以向上-向下计数模式为例,优先级从高到低大致为:
- 软件强制事件(最高)。
- 在计数上升阶段的
CTR=CMPB事件(CBU)。 - 在计数上升阶段的
CTR=CMPA事件(CAU)。 CTR=ZERO事件。CTR=PRD事件。- 在计数下降阶段的
CTR=CMPB事件(CBD)。 - 在计数下降阶段的
CTR=CMPA事件(CAD)(最低)。
理解优先级至关重要。例如,如果你在CAU事件设置“置高”,在ZERO事件也设置“置高”,由于ZERO事件优先级高于CAD但低于CAU,在计数器上升阶段,CAU的“置高”会生效;而在计数器下降阶段,如果CAD事件配置为“拉低”,那么ZERO事件的“置高”将在CAD之后发生(如果CAD事件存在),具体效果取决于你的完整配置。设计波形时,必须理清每个边沿由哪个事件、以何种优先级触发。
5.2 经典PWM波形配置实例解析
理论说了很多,我们直接看几个最常用的配置实例,这是理解AQ如何工作的最佳方式。假设TBPRD=4,TBCLK时钟周期为单位时间。
实例一:向上计数,非对称PWM,主动高电平
- 目标:在EPWMxA上生成一个占空比可调的主动高电平PWM。
- TB配置:向上计数模式(TB_COUNT_UP)。
- CC配置:CMPA存储占空比信息(例如CMPA=2)。
- AQ配置:
AQCTLA.ZRO = AQ_SET// 计数器为零时,EPWMxA置高。AQCTLA.CAU = AQ_CLEAR// 计数器等于CMPA(上升过程中)时,EPWMxA拉低。
- 波形分析:计数器从0开始上升到4。在0时刻,ZERO事件触发,输出置高。当计数器上升到等于CMPA(=2)时,CAU事件触发,输出拉低。计数器继续到4后归零,重复此过程。高电平时间对应CMPA的值(2个TBCLK),周期为(TBPRD+1)=5个TBCLK,占空比 = CMPA/(TBPRD+1) = 2/5 = 40%。这是最基础、最常用的非对称PWM生成方式。
实例二:向上-向下计数,对称PWM,互补输出
- 目标:在EPWMxA和EPWMxB上生成一对互补的、带死区的对称PWM,用于驱动H桥的上半桥和下半桥。
- TB配置:向上-向下计数模式(TB_COUNT_UPDOWN)。
- CC配置:CMPA控制占空比,CMPB = CMPA + DeadTime。假设CMPA=3, DeadTime=1,则CMPB=4。(注意:这里用CMPA和CMPB的差值模拟死区,实际应用中更常用专用的死区(DB)子模块,但此例有助于理解AQ)。
- AQ配置:
AQCTLA.CAU = AQ_SET// 上升过程中等于CMPA时,EPWMxA置高。AQCTLA.CBD = AQ_CLEAR// 下降过程中等于CMPB时,EPWMxA拉低。AQCTLB.CBU = AQ_CLEAR// 上升过程中等于CMPB时,EPWMxB拉低。AQCTLB.CAD = AQ_SET// 下降过程中等于CMPA时,EPWMxB置高。
- 波形分析:计数器从0上数到4(TBPRD),再下数回0。
- EPWMxA:在上升阶段,计数器到3(CMPA)时置高;在下降阶段,计数器到4(CMPB)时拉低。高电平中心对称。
- EPWMxB:在上升阶段,计数器到4(CMPB)时拉低;在下降阶段,计数器到3(CMPA)时置高。其波形正好与EPWMxA相反(互补)。
- 在计数器从3到4的上升过程中,EPWMxA已为高,EPWMxB仍为高(直到计数到4才拉低),这就产生了一个TBCLK宽度的“共同导通”危险区!这就是为什么需要死区。实际中,我们会让CMPB = CMPA + DeadTime,且让EPWMxB的拉低动作发生在CBD(下降过程的CMPB),这样就能确保EPWMxA上升沿和EPWMxB下降沿之间插入死区。更规范的做法是使用DB子模块。
5.3 软件强制与连续软件强制
AQ子模块还提供了AQSFRC和AQCSFRC寄存器,用于实现软件强制事件。这在某些调试或特殊控制场景下非常有用:
- 软件强制(AQSFRC):可以立即强制产生一个一次性的动作(置高、拉低、翻转)到输出引脚,优先级最高。例如,在故障测试中,手动强制输出关断。
- 连续软件强制(AQCSFRC):可以配置输出引脚被持续强制为高、低或翻转状态,直到强制被取消。这在初始化阶段或安全状态下非常有用。
实操心得:AQ配置的调试技巧
- 化繁为简:在调试复杂的多事件AQ配置时,先从最简单的配置开始(例如,只配置ZERO和PRD事件,让输出产生一个方波),验证TB和基本AQ功能正常。
- 利用仿真器观察:在CCS等IDE的实时仿真中,可以同时观察TBCTR、CMPA、CMPB的数值变化,以及EPWMxA/B的引脚波形。通过单步执行,查看在特定事件发生时,输出是否按预期动作,是排查AQ配置错误的最有效方法。
- 优先级验证:如果输出波形不符合预期,检查是否有可能发生了事件竞争。仔细对照数据手册中的优先级表格,分析在冲突时刻,高优先级事件的动作是否覆盖了低优先级事件的动作。
- 影子寄存器更新时机的影响:确保你理解CMPA/CMPB影子寄存器的加载时机(LOADAMODE/LOADBMODE)。如果你在周期中间更新了CMPA的影子寄存器,但加载点设在
CTR=ZERO,那么新占空比要到下一个周期零点才会生效。如果你的控制算法计算时刻和加载时刻不匹配,可能会导致���制环路延迟或错误。
6. 高级应用与系统集成
掌握了TB、CC、AQ三个核心子模块后,ePWM模块已经能够应对大多数PWM生成需求。但它的能力远不止于此,通过与其他子模块的配合,可以构建出极其强大和安全的功率控制系统。
6.1 与死区(DB)子模块的配合
在实际的功率桥臂(如H桥、三相逆变桥)驱动中,必须避免上下两个开关管同时导通(直通短路)。死区时间就是在互补的PWM信号中,插入一个两者都为低电平的短暂时间窗口。ePWM模块内置了专用的死区子模块(DB),它可以接收来自AQ子模块的原始信号,并自动为其上升沿、下降沿或双边添加可编程的延迟,生成带死区的最终输出信号。这比单纯用CMPA和CMPB差值来模拟死区更加精确和方便,且死区时间独立于PWM周期和占空比,便于管理。
6.2 与错误联防(TZ)子模块的配合
安全是工业系统的生命线。ePWM的错误联防子模块(Trip Zone, TZ)提供了硬件的快速保护机制。它可以监控多个外部错误信号(如过流、过压、过热传感器的输出)。一旦任何一个错误信号有效,TZ模块可以立即按照预设的模式(强制高、强制低、高阻、或者不动作)将ePWM输出引脚置于安全状态,这个反应是纳秒级的,远快于软件中断处理。同时,它还可以产生中断,通知CPU处理故障。这是实现系统功能安全(Functional Safety)的关键组件。
6.3 与事件触发(ET)和ADC的配合
在电机控制或数字电源的闭环控制中,需要在特定的时刻对电流、电压进行采样。ePWM的事件触发子模块(ET)可以将TB或CC产生的事件(如CTR=ZERO, CTR=PRD, CTR=CMPB)转化为ADC的启动转换(SOC)信号。例如,在对称PWM的中心点(即计数器从向上转为向下的时刻,CTR=PRD)和/或过零点(CTR=ZERO)进行电流采样,可以避开功率管开关的噪声,获得更准确的采样值。这种硬件级的自动触发,保证了采样时刻的精确性和可重复性,对于高性能控制算法至关重要。
6.4 多模块同步与相位控制实战
回到我们最初提到的三相电机驱动例子。假设我们需要生成三相互差120度的PWM。
- 硬件连接:将ePWM1的SYNCO输出连接到ePWM2和ePWM3的SYNCI输入。
- 主模块(ePWM1)配置:设置为上下计数模式,SYNCOSEL选择将其“CTR=ZERO”事件作为同步输出源。它不需要相位加载。
- 从模块(ePWM2, ePWM3)配置:
- 同样设置为上下计数模式,且时钟分频与主模块一致。
- 使能相位加载(TBCTL.PHSEN = 1)。
- 设置相位寄存器TBPHS。对于120度相位差,如果PWM一个电周期对应计数器从0到TBPRD再回到0,那么120度对应
TBPRD * 120 / 360 = TBPRD / 3。因此:- ePWM2(V相)滞后U相120度:
TBPHS_2 = TBPRD / 3。 - ePWM3(W相)滞后U相240度(或超前120度):
TBPHS_3 = (2 * TBPRD) / 3。
- ePWM2(V相)滞后U相120度:
- 注意:在上下计数模式下,相位加载发生在同步事件到来时,加载后计数器的方向由TBCTL.PHSDIR位决定,需要根据实际情况设置。
- 启动顺序:按照前面提到的流程,先配置所有模块,最后同时拉高TBCLKSYNC启动。这样,ePWM1的计数器归零时,会发出同步脉冲,ePWM2和ePWM3立即加载各自的TBPHS值,从而实现了精确的120度相位差。
通过这样的配置,三个ePWM模块就能像一支训练有素的乐队,在指挥(同步信号)下,各自按照精确的节拍(相位)演奏,共同驱动三相电机平稳运行。这种硬件同步的精度和可靠性,是软件模拟无法比拟的。