1. 项目概述从基础PWM到增强型ePWM的跃迁在嵌入式系统尤其是电机控制、数字电源和逆变器领域脉冲宽度调制PWM技术是驱动一切的“心脏”。简单来说PWM就是通过快速开关一个数字信号调节其在一个周期内高电平导通与低电平关断的时间比例即占空比来控制输出到负载的平均电压或电流。比如你想让一个直流电机转得慢一点不是直接降低供电电压而是让驱动它的MOSFET管以极高的频率比如20kHz快速开关通过减少每个周期内导通的时间等效地降低了平均电压从而实现无级调速。这种方法效率极高因为功率器件大部分时间工作在完全导通或完全关断状态避免了线性放大区的巨大功耗。然而基础的PWM外设往往功能单一一个定时器可能只能产生一路简单的PWM波。当面对三相电机驱动、交错并联电源、多电平逆变器等复杂应用时我们需要多路PWM信号并且它们之间必须有精确的相位关系、可编程的死区时间防止上下桥臂直通短路、灵活的故障保护机制以及触发ADC采样的能力。这时增强型PWMePWM模块的价值就凸显出来了。它不再是一个简单的定时器加比较器而是一个高度模块化、可配置的子系统。从我十多年的电机驱动开发经验来看能否玩转ePWM是区分嵌入式工程师能否涉足高性能功率控制领域的一道分水岭。本文将以德州仪器TIC2000系列微控制器中的ePWM模块为蓝本深入解析其核心架构。我们将重点拆解其“时间基准TB子模块”和“同步机制”因为这是整个ePWM系统协调工作的基石。同时我们会深入到寄存器配置的层面理解每一个控制位背后的硬件行为而不仅仅是罗列寄存器描述。无论你是正在评估C2000用于新项目还是已经在使用但对某些配置细节感到困惑相信这篇结合了手册原理与实战经验的深度解析能帮你建立起清晰、透彻的认知。2. ePWM模块的整体架构与核心子模块解析一个完整的ePWM模块例如ePWM1代表一个独立的PWM通道它能输出两路信号EPWMxA和EPWMxB。这两路信号可以是完全独立的也可以是互补的带死区这为驱动一个半桥上管和下管提供了天然支持。多个ePWM模块如ePWM1, ePWM2, ePWM3...在芯片内部是相同的副本它们通过同步信号链EPWMxSYNCI/EPWMxSYNCO串联起来形成一个可以协同工作的系统。2.1 八大子模块的分工协作ePWM的强大源于其内部八个各司其职的子模块。理解它们各自的任务和交互关系是进行有效配置的前提。我们可以将其想象成一个精密的生产流水线时间基准TB子模块这是整个PWM通道的“节拍器”和“指挥家”。它产生最基础的时基计数器TBCTR决定PWM波的频率周期并管理与其他ePWM模块的同步与相位关系。所有其他子模块的时序事件何时比较、何时动作都基于TB子模块产生的节拍。计数器比较CC子模块这是“调音师”。它包含两个比较寄存器CMPA和CMPB。当TB子模块的计数器TBCTR运行到与CMPA或CMPB设定的值相等时就会产生“比较匹配”事件。这个事件是改变PWM输出状态拉高、拉低、翻转最直接的触发器。简单理解CMPA/CMPB的值直接决定了PWM波的占空比。动作限定AQ子模块这是“执行导演”。它接收来自TB计数器等于0、等于周期值和CC计数器等于CMPA/CMPB的事件并根据用户配置的“剧本”AQCTLA/AQCTLB寄存器指挥EPWMxA和EPWMxB输出引脚做出具体的动作置高、置低、翻转或者不动作。死区生成DB子模块这是“安全员”。在驱动半桥或全桥电路时必须确保连接在同一桥臂上的两个开关管如上管和下管不会同时导通否则会造成电源直通短路瞬间烧毁器件。DB子模块接收来自AQ子模块的原始PWM信号对其上升沿和下降沿分别插入可编程的延迟时间从而生成一对带有“死区时间”的互补信号从根本上杜绝了直通风险。PWM斩波PC子模块这是一个“调制器”。它用一组高频载波信号对经过死区处理的PWM波进行二次调制生成一串高频脉冲序列。这个功能主要应用于需要隔离驱动的场景比如使用脉冲变压器驱动IGBT或SiC MOSFET的栅极可以减少变压器体积并改善驱动性能。故障保护TZ子模块这是“紧急制动系统”。它监控多个外部故障输入引脚TZ1-TZ6。当这些引脚上出现故障信号如过流、过压、过热时TZ子模块可以立即强制PWM输出进入预设的安全状态强制高、强制低或高阻态响应速度在纳秒级是硬件实现的最后一道安全防线。事件触发ET子模块这是“调度员”。它监控ePWM内部发生的各种事件如周期匹配、比较匹配并可以配置这些事件来触发CPU中断或者触发ADC启动转换SOC。这使得PWM波形与软件中断服务程序、ADC采样能够实现精确的硬件同步对于实现电流环、速度环等闭环控制算法至关重要。数字比较DC子模块这是“高级侦察兵”。它允许将内部数字信号如ADC转换结果经过比较器后的状态作为故障源或事件源提供了比单纯外部引脚更灵活的保护和触发机制。这八个子模块通过内部信号总线紧密连接构成了一个功能完整、响应迅速的PWM生成与管理系统。其中TB、CC、AQ、DB这四个子模块是生成基础PWM波形的核心链条而TZ和ET则是实现可靠控制和系统集成的关键。2.2 寄存器地图与硬件对话的窗口要配置上述子模块我们必须通过读写其对应的寄存器来实现。ePWM的寄存器组织得非常清晰按照子模块分组。每个ePWM实例都有一套完整的寄存器组地址偏移量相同。下表是一个简化的核心寄存器概览它揭示了软件控制硬件的路径子模块核心寄存器地址偏移影子寄存器主要功能时间基准 (TB)TBCTL0x00否控制计数器模式、时钟分频、同步使能等全局行为。TBPRD0x0A是周期寄存器。设定PWM波的周期值是计算频率的基准。TBPHS0x0E否相位寄存器。设定本模块相对于同步源的初始相位偏移。TBCTR0x08否计数器寄存器。实时反映当前计数值可读可写常用于调试或强制同步。计数器比较 (CC)CMPCTL0x10否控制CMPA/CMPB影子寄存器的加载方式。CMPA0x12是比较寄存器A。通常用于控制EPWMxA的占空比或特定事件点。CMPB0x14是比较寄存器B。通常用于控制EPWMxB的占空比或作为同步事件源。动作限定 (AQ)AQCTLA0x16否定义当TB/CC事件发生时EPWMxA输出引脚采取的动作置高、置低、翻转。AQCTLB0x18否定义当TB/CC事件发生时EPWMxB输出引脚采取的动作。死区 (DB)DBCTL0x1C否控制死区模块的使能、模式及输入信号选择。DBRED0x1E否上升沿延迟寄存器。设定互补信号中从低到高变化的延迟时间。DBFED0x20否下降沿延迟寄存器设定互补信号中从高到低变化的延迟时间。故障保护 (TZ)TZSEL0x32否选择哪些TZ引脚TZ1-TZ6可以触发本模块的故障保护。TZCTL0x34否配置当故障发生时EPWMxA和EPWMxB输出应被强制为何种状态高/低/高阻。事件触发 (ET)ETSEL0x3C否选择哪些ePWM事件如CTRPRD, CTRCMPA可以产生中断或ADC启动信号。ETPS0x40否设置事件触发分频例如每发生2次事件才产生1次中断以减轻CPU负担。提示表中“影子寄存器”一列非常重要。标记为“是”的寄存器如TBPRD, CMPA, CMPB拥有双缓冲机制。软件平时写入的是“影子寄存器”不会立即影响当前正在运行的PWM波形。只有在特定的同步时刻如计数器归零时影子寄存器的值才会一次性加载到“活动寄存器”中生效。这保证了PWM参数如周期、占空比可以无毛刺、平滑地更新对于在线调整电机速度或电源输出电压至关重要。而标记为“否”的寄存器写入后立即生效需谨慎操作以免打断正在进行的波形。3. 时间基准TB子模块PWM系统的节拍器如果说ePWM模块是一个交响乐团那么时间基准子模块就是乐团的指挥。它决定了演奏的节奏频率、起始拍子相位并确保所有乐手其他ePWM模块节拍一致同步。3.1 核心功能与寄存器控制TB子模块的核心是一个16位的向上/向下计数器TBCTR。它的计数节奏由时间基准时钟TBCLK驱动而TBCLK来源于系统时钟VCLK3经过两级分频HSPCLKDIV和CLKDIV得到。通过配置TBCTL寄存器的这两个分频字段我们可以灵活调整TBCLK的频率从而适应不同频率要求的PWM应用。TB子模块的关键控制寄存器是TBCTL。其中几个位域决定了计数器的基本行为模式CTRMODE[1:0]这是计数器模式选择位。00停止/保持模式。计数器停止在当前值用于暂停PWM输出。01向上计数模式。计数器从0递增到TBPRD然后归零重启。10向下计数模式。计数器从TBPRD递减到0然后重载TBPRD重启。11向上-向下计数模式。计数器从0递增到TBPRD再递减回0如此循环。PHSEN相位加载使能位。当此位置1且模块收到同步输入信号EPWMxSYNCI时计数器会将其相位寄存器TBPHS的值加载到TBCTR中。这是实现多通道间相位偏移的关键。PRDLD周期寄存器加载模式位。0影子模式。写入TBPRD寄存器的值先存入影子寄存器在CTR0事件时加载到活动寄存器。1立即加载模式。写入TBPRD的值直接生效。一般推荐使用影子模式以保证波形稳定。3.2 三种计数模式与PWM周期计算TBCTR的计数模式直接决定了PWM波的形态和周期计算公式。这是理解ePWM波形生成的基础。3.2.1 向上计数模式Asymmetric PWM在此模式下计数器从0开始每个TBCLK周期加1直到等于周期值TBPRD然后立即复位到0重新开始。它产生的是非对称PWM波。所谓非对称是指波形事件如比较点只发生在计数上升沿。假设TBPRD3波形如下TBCTR: 0 - 1 - 2 - 3 - 0 - 1 ... 事件点可能在此区间PWM周期Tpwm:Tpwm (TBPRD 1) * TtbclkPWM频率Fpwm:Fpwm 1 / Tpwm Ftbclk / (TBPRD 1)例如TBCLK频率为100MHz周期10nsTBPRD设置为999则PWM频率为 100MHz / (9991) 100kHz。3.2.2 向下计数模式Asymmetric PWM与向上计数模式镜像计数器从TBPRD值开始每个TBCLK周期减1直到等于0然后重载TBPRD重新开始。它产生的也是非对称PWM波事件发生在计数下降沿。PWM周期Tpwm:Tpwm (TBPRD 1) * Ttbclk公式与向上计数相同PWM频率Fpwm:Fpwm Ftbclk / (TBPRD 1)3.2.3 向上-向下计数模式Symmetric PWM这是最常用、也最能体现ePWM优势的模式。计数器从0开始递增到TBPRD然后立即转向递减回0如此循环。它产生的是对称PWM波。对称波形的特点是每个PWM周期内计数器会经过同一个值两次一次上升沿一次下降沿这为在一个周期内产生多个精确的事件点提供了可能常用于中心对齐的电机驱动。TBCTR: 0 - 1 - 2 - 3(TBPRD) - 2 - 1 - 0 - 1 ... 事件点可发生在上升和下降过程PWM周期Tpwm:Tpwm 2 * TBPRD * TtbclkPWM频率Fpwm:Fpwm Ftbclk / (2 * TBPRD)注意在相同TBCLK和TBPRD下向上-向下模式的频率是向上/向下模式的一半。例如TBCLK100MHzTBPRD999向上-向下模式的PWM频率为 100MHz / (2*999) ≈ 50.025 kHz。实操心得在电机控制中我们几乎总是使用向上-向下计数模式。原因有三第一对称PWM产生的谐波特性更好有利于降低电机噪音和损耗第二它天然为中心对齐的SPWM或SVPWM算法提供了便利第三计数器在峰值TBPRD和谷底0都会产生事件方便在周期中点进行ADC采样例如相电流采样这是实现高精度电流环的关键。3.3 影子寄存器机制实现无毛刺参数更新在电机调速或电源调压过程中我们经常需要在线改变PWM的频率或占空比。如果直接写入正在使用的活动寄存器可能会导致计数器在非预期值被修改产生一个畸变的PWM脉冲这可能引起电流尖峰甚至损坏设备。ePWM通过“影子寄存器”机制优雅地解决了这个问题。以周期寄存器TBPRD为例影子模式TBCTL[PRDLD]0这是默认模式。软件写入TBPRD地址的数据实际上是写入了其背后的影子寄存器此时活动的PWM周期不受影响波形照常运行。加载时机硬件会在一个安全的时刻——通常是CTR0事件计数器归零时——自动将影子寄存器的值复制到活动寄存器中。效果PWM周期从下一个完整的周期开始改变新旧波形之间平滑过渡没有任何毛刺或中间状态。CMPA和CMPB寄存器也有类似的影子寄存器其加载时机可以通过CMPCTL寄存器配置为在CTR0或CTRTBPRD时加载从而实现占空比的无毛刺更新。避坑指南务必在初始化时将TBPRD、CMPA、CMPB等寄存器的影子加载模式配置好。如果错误地配置为立即加载模式在运行中修改这些值将是危险的。一个良好的习惯是在初始化序列中先配置好加载模式和控制寄存器最后再使能计数器开始运行。4. 同步机制多模块协同工作的生命线单个ePWM模块可以独立工作但ePWM的真正威力在于多个模块可以精确同步生成具有固定相位差的多相PWM这对于三相电机驱动、交错式Boost电路等应用是必需的。4.1 同步信号链EPWMxSYNCI与EPWMxSYNCO每个ePWM模块都有一个同步输入EPWMxSYNCI和一个同步输出EPWMxSYNCO。它们像链条一样将模块连接起来ePWM1它的EPWM1SYNCI通常来自外部引脚或另一个外设如N2HET。它的EPWM1SYNCO输出可以作为ePWM2的同步输入。ePWM2它的EPWM2SYNCI连接ePWM1的SYNCO。它的EPWM2SYNCO输出可以作为ePWM3的同步输入。以此类推形成了ePWM1 - ePWM2 - ePWM3 ... 的同步链。这个链式结构意味着你可以通过给ePWM1一个外部同步脉冲让整个ePWM系统同时开始或重置其时间基准实现全局同步。4.2 同步的工作原理与配置同步的核心是“相位加载”。当一个ePWM模块的EPWMxSYNCI引脚上出现一个上升沿脉冲时如果该模块的TBCTL[PHSEN]位被使能则会触发以下动作模块会立即在下一个TBCLK时钟边沿将其相位寄存器TBPHS中的值加载到时间基准计数器TBCTR中。同时计数器会按照TBCTL[CTRMODE]设定的方向开始计数。举个例子假设我们有ePWM1、2、3驱动一个三相逆变器。我们希望三路PWM波互差120度。步骤1配置ePWM1为“主模块”。设置其TBCTL[PHSEN]0禁用相位加载因为它不受其他模块同步。它的TBPHS可以设为0。步骤2配置ePWM2为“从模块1”。设置TBCTL[PHSEN]1使其接受ePWM1的SYNCO同步。计算ePWM2相对于ePWM1的120度相位差对应的计数值。如果采用向上-向下模式一个完整电角度360度对应2 * TBPRD个计数时钟。那么120度对应的计数值偏移量PhaseOffset (120/360) * 2 * TBPRD (2/3) * TBPRD。将计算值取整写入ePWM2的TBPHS寄存器。步骤3配置ePWM3为“从模块2”。设置TBCTL[PHSEN]1使其接受ePWM2的SYNCO同步。同理计算240度或-120度的相位偏移PhaseOffset (240/360) * 2 * TBPRD (4/3) * TBPRD。注意由于是链式同步ePWM3的相位是相对于ePWM2的而ePWM2已经相对ePWM1偏移了120度。因此ePWM3的TBPHS应设置为使其相对ePWM1的总相位为240度。更简单的做法是将ePWM1的SYNCO同时连接到ePWM2和ePWM3的SYNCI如果芯片支持并将ePWM2和ePWM3的TBPHS分别设为120度和240度的偏移值。步骤4配置所有模块的TBCTL[SYNCOSEL]位选择同步输出的源。例如设置主模块ePWM1的SYNCOSEL 00CTR0这样每当ePWM1的计数器归零时就会产生一个同步脉冲输出给ePWM2。当系统启动ePWM1开始计数后每次其计数器归零都会发出一个SYNCO脉冲。ePWM2和ePWM3收到这个脉冲后会分别将自己的计数器加载为TBPHS中的值120度和240度偏移然后开始计数。这样三路PWM波就建立了稳定的120度相位差。4.3 全局时钟同步TBCLKSYNC除了计数器同步还有一个更底层的同步时间基准时钟TBCLK的同步。每个ePWM模块的TBCLK是独立分频得到的。即使它们使用相同的分频系数由于使能顺序的微小差异各模块的TBCLK相位也可能随机导致计数器步调在微观上不一致。TI在系统级控制模块如IOMM中提供了一个TBCLKSYNC位。其同步流程是先使能各个ePWM模块的时钟。将TBCLKSYNC位写0。这会冻结所有ePWM模块内部的TBCLK。配置各个ePWM模块的时钟分频器TBCTL[CLKDIV]和[HSPCLKDIV]。将TBCLKSYNC位写1。所有ePWM模块的TBCLK将从下一个系统时钟周期开始严格对齐地启动。这个操作确保了所有ePWM模块的“心跳”从第一个节拍就是同步的为后续的计数器同步打下了完美的基础。注意事项TBCLKSYNC是一个全局开关。一旦开启所有已使能时钟的ePWM模块的TBCLK都会被同步启动。如果你希望某些模块异步工作需要在设置TBCLKSYNC1之前不要使能其模块时钟或者在配置完并启动全局同步后再动态地使能/失能特定模块。5. 从寄存器到波形一个完整的配置实例理论说得再多不如一行代码。下面我们以一个具体的场景为例展示如何通过配置寄存器让ePWM1模块产生一个中心对齐、频率为10kHz、占空比为30%的对称PWM波EPWM1A并配置其在周期匹配时触发ADC采样。系统条件系统时钟VCLK3 200 MHz。我们希望TBCLK 100 MHz。5.1 步骤一计算并配置时间基准TB确定TBCLK分频VCLK3 200MHz目标TBCLK100MHz即2分频。查看TBCTL寄存器CLKDIV和HSPCLKDIV位域。假设我们使用CLKDIV进行2分频设置CLKDIV1代表/2HSPCLKDIV保持默认/1。则TBCLK VCLK3 / (CLKDIV * HSPCLKDIV) 200MHz / 2 100MHz。Ttbclk 10 ns。确定计数模式与周期值采用向上-向下模式对称PWM。目标频率Fpwm 10 kHz。 根据公式Fpwm Ftbclk / (2 * TBPRD)可得TBPRD Ftbclk / (2 * Fpwm) 100,000,000 / (2 * 10,000) 5000我们将TBPRD设置为5000。配置TB相关寄存器// 假设 EPwm1Regs 是映射到 ePWM1 模块的寄存器结构体 // 1. 配置时间基准控制寄存器 TBCTL // CTRMODE 11b (向上-向下计数模式) // PHSEN 0 (禁用相位加载本模块作为主模块) // PRDLD 0 (TBPRD使用影子寄存器模式) // SYNCOSEL 00b (同步输出选择 CTRZero) // SWFSYNC 0 (软件强制同步位初始为0) // HSPCLKDIV 0 (/1), CLKDIV 1 (/2) EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 宏定义通常为3 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; EPwm1Regs.TBCTL.bit.PRDLD TB_SHADOW; EPwm1Regs.TBCTL.bit.SYNCOSEL TB_SYNC_DISABLE; // 或 TB_CTR_ZERO EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV1; EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV2; // 2. 配置周期寄存器 TBPRD (写入影子寄存器) EPwm1Regs.TBPRD 5000; // 3. 相位寄存器 TBPHS 设为0 (主模块) EPwm1Regs.TBPHS.word 0; // 4. 可选将计数器 TBCTR 初始化为0 EPwm1Regs.TBCTR 0;5.2 步骤二配置计数器比较CC与动作限定AQ计算比较值目标占空比 30%。在向上-向下模式中PWM输出在CTRCMPA时跳变。为了生成一个中心对齐、高电平在中间的脉冲我们需要在计数上升和下降阶段各比较一次。但通常我们配置AQ模块在CTRCMPA且计数器向上时置高在CTRCMPA且计数器向下时置低即可得到一个对称的PWM波。 比较值CMPA TBPRD * DutyCycle 5000 * 0.3 1500。注意这是简化计算。在对称PWM中高电平时间对应2 * CMPA个TBCLK周期不完全是。占空比 高电平时间 / 周期。在向上-向下模式一个完整的周期是2*TBPRD个时钟。当在上升沿CTRCMPA置高下降沿CTRCMPA置低时高电平时间正好是2 * (TBPRD - CMPA)这里容易混淆。更准确的定义是在对称PWM模式下占空比 CMPA / TBPRD。当CMPA0时占空比0%CMPATBPRD时占空比100%。因此CMPA 5000 * 0.3 1500 是正确的。配置CC和AQ寄存器// 1. 配置计数器比较控制寄存器 CMPCTL // 设置CMPA影子寄存器的加载时机为 CTRZero 时加载 EPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; // 2. 写入比较值 CMPA (到影子寄存器) EPwm1Regs.CMPA 1500; // 30% 占空比 // 3. 配置动作限定寄存器 AQCTLA // 当事件发生时对 EPWM1A 输出进行操作 // - 当 TBCTR 在递增过程中等于 CMPA (CBU) 时将输出置高 (SET) // - 当 TBCTR 在递减过程中等于 CMPA (CBD) 时将输出置低 (CLEAR) EPwm1Regs.AQCTLA.bit.CAU AQ_SET; // CTR CMPA, 向上计数 EPwm1Regs.AQCTLA.bit.CAD AQ_CLEAR; // CTR CMPA, 向下计数 // 注意我们没有使用 CTRPRD 和 CTR0 事件来控制输出它们可以用于其他目的。5.3 步骤三配置事件触发ET以产生ADC启动信号我们希望在每个PWM周期结束时对称PWM的CTR0点也是中心点触发ADC采样相电流。// 1. 配置事件触发选择寄存器 ETSEL // 选择中断/ADC触发源为 TBCTR 0 (ETPS[INTSEL] 或 SOCASEL) // 这里我们配置ADC SOCA 由 CTRZero 事件触发 EPwm1Regs.ETSEL.bit.SOCASEL ET_CTR_ZERO; // SOCA 选择 CTRZero 事件 // 2. 配置事件触发预分频寄存器 ETPS // 设置 SOCA 触发为每次事件都触发一次 (单次触发) EPwm1Regs.ETPS.bit.SOCAPRD ET_1ST; // SOCA 每次事件触发一次5.4 步骤四使能计数器并启动在完成所有子模块配置后最后一步是启动计数器。由于我们之前可能停止了计数器或默认是停止的需要通过TBCTL寄存器将其设置为向上-向下模式。但我们在步骤5.1已经设置过了。确保全局时钟同步TBCLKSYNC已使能后计数器会自动开始运行。// 确保TBCLKSYNC已使能此操作通常在系统初始化时完成一次 // 例如SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC 1; // 我们的TBCTL.CTRMODE已经在步骤5.1设置为向上-向下模式(11b)。 // 如果之前是停止模式(00b)设置模式就会启动它。 // 或者如果之前是其他模式重新确认一下 EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 确保是向上-向下模式至此ePWM1模块的EPWM1A引脚就会输出一个10kHz、30%占空比、中心对齐的PWM波并且在每个周期的中心点计数器为0产生一个ADC启动SOCA信号。6. 高级话题与常见问题排查6.1 死区生成DB模块的配置要点死区时间是互补PWM驱动的灵魂。配置DB模块时需要理解两个关键寄存器DBRED上升沿延迟和DBFED下降沿延迟。它们定义的延迟时间单位是TBCLK周期。典型场景用EPWMxA和EPWMxB驱动一个半桥EPWMxA作为上管信号源EPWMxB作为下管信号源。我们希望两者互补且插入死区。配置AQ模块让EPWMxA产生一个原始的PWM波比如高有效EPWMxB配置为在相反事件动作例如EPWMxA置高时EPWMxB置低反之亦然或者更简单将EPWMxB配置为EPWMxA的反相。配置DB模块使能死区并选择输入源。通常将EPWMxA作为上升沿延迟RED和下降沿延迟FED的公共源。EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; // 使能两路输出的死区 EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HIC; // 根据实际高低有效选择极性 EPwm1Regs.DBCTL.bit.IN_MODE DBA_ALL; // 选择EPWMxA作为两路死区的输入源设置死区时间假设TBCLK100MHz (10ns)需要插入500ns的死区时间。DeadTime_Ticks 500ns / 10ns 50EPwm1Regs.DBRED 50; // 上升沿延迟50个TBCLK周期 EPwm1Regs.DBFED 50; // 下降沿延迟50个TBCLK周期最终硬件会自动生成两路信号一路是原始信号延迟上升沿DBRED另一路是反相后的信号延迟下降沿DBFED从而确保在任何切换时刻两路信号都不会同时为高。6.2 故障保护TZ模块的紧急响应TZ模块的配置关乎系统安全。常见的过流保护接线是将电流采样比较器的输出接到TZ1引脚。选择故障源在TZSEL寄存器中使能你需要的TZ引脚例如TZ1作为故障源并选择触发模式是单次One-Shot还是周期循环Cycle-By-Cycle。单次触发后需要软件清除标志才能恢复适用于严重故障周期循环则在每个PWM周期都会检查自动恢复适用于动态限流。EPwm1Regs.TZSEL.bit.OSHT1 TZ_ENABLE; // 使能TZ1作为单次故障源 // EPwm1Regs.TZSEL.bit.CBC1 TZ_ENABLE; // 使能TZ1作为周期循环故障源配置故障动作在TZCTL寄存器中配置当TZ1故障发生时EPWMxA和EPWMxB输出应被强制为何种状态。为了安全通常强制为高阻态Hi-Z或强制低驱动桥臂下管常闭上管常开具体看电路设计。EPwm1Regs.TZCTL.bit.TZA TZ_FORCE_HIZ; // TZ1故障时EPWM1A强制高阻 EPwm1Regs.TZCTL.bit.TZB TZ_FORCE_LO; // TZ1故障时EPWM1B强制低使能中断在TZEINT寄存器中使能TZ中断以便故障发生时CPU能进入中断服务程序进行记录、报警等处理。6.3 常见问题与排查技巧问题1PWM没有输出。检查时钟确认ePWM模块的时钟是否使能在PCLKCRx寄存器中。确认TBCLKSYNC是否已置1。检查引脚复用EPWMxA/B输出引脚是否通过GPIO MUX正确配置为ePWM功能而非普通GPIO。检查计数器状态读取TBCTR寄存器看它是否在循环计数。如果停在某个值检查TBCTL.CTRMODE是否被误设为停止模式(00)。检查输出强制检查AQCSFRC或AQSFCRC寄存器是否软件强制了输出状态。检查TZFLG寄存器是否发生了故障保护将输出强制。问题2PWM频率不对。计算TBPRD双重检查TBCLK频率和TBPRD值的计算。用示波器测量实际周期反推TBCLK是否与预期一致。检查计数模式确认TBCTL.CTRMODE设置是否正确。向上-向下模式的频率是Ftbclk/(2*TBPRD)向上/向下模式是Ftbclk/(TBPRD1)。检查影子寄存器如果在线修改了TBPRD但频率没变确认是否配置为影子模式并且是否等待了CTR0事件生效。可以读取TBPRD活动寄存器的值来确认。问题3多路ePWM无法同步。检查同步链确认EPWMxSYNCI和EPWMxSYNCO的连接关系是否符合设计。ePWM1的SYNCI通常需要外部输入或置高/拉低。检查相位加载使能确保需要同步的从模块设置了TBCTL.PHSEN1。检查同步输出源确认主模块的TBCTL.SYNCOSEL配置正确能产生同步脉冲例如设为CTRZero。检查TBPHS值确认从模块的TBPHS寄存器已写入正确的相位偏移值。问题4修改CMPA占空比无效或波形异常。检查影子寄存器加载模式确认CMPCTL.SHDWAMODE和LOADAMODE配置正确。通常设置为在CTR0或CTRTBPRD时加载。检查写入时机在影子模式下写入CMPA后新值在下一次加载事件如CTR0后才生效。确保你的代码逻辑考虑了这一点。检查AQ配置确认AQCTLA寄存器中CAU和CAD动作设置正确与你的PWM有效电平设计相符。问题5死区时间不生效或效果不对。检查DB模块使能DBCTL.OUT_MODE必须设置为使能模式。检查极性DBCTL.POLSEL配置决定了输出是否反相必须与你的驱动电路高边/低边驱动ICMOSFET类型匹配。用示波器同时观察DB模块前后的信号如果有条件或最终输出信号分析边沿延迟关系。计算延迟 tick 数DBRED和DBFED寄存器值是以TBCLK周期为单位的。确认你的计算正确。例如期望2us死区TBCLK周期为100ns则需要设置值为20。调试ePWM时最有效的工具是示波器。同时测量关键信号如EPWMxA、EPWMxB、同步IO、故障引脚和软件变量如TBCTR、CMPA结合寄存器配置能快速定位问题所在。记住ePWM的硬件行为是确定性的任何波形问题都能从配置中找到原因。