C2000之ePWM详讲
ePWM(增强型脉冲宽度调制)是 TI C2000 DSP 内部专用外设,专为电机驱动、开关电源等电力电子场景设计,硬件独立完成 PWM 生成、死区、故障保护,极少占用 CPU 资源。本文从底层原理与示例代码,详细讲述ePWM的使用方法。
本例程使用的是C2000WARE版本为26.02.00.00.LTS (2026-9-30)
本例程的故障保护子模块和数字比较子模块的示例程序需要用到X-BAR的相关知识
一、概述
ePWM模块主要特性:
- PWM 信号输出 :ePWM 模块可以输出 ePWMxA 和 ePWMxB 两路独立的 PWM 信号到 GPIO 引脚,支持灵活配置死区、相位和占空比,直接驱动功率变换电路。
- 硬件故障保护 :模块内置了强大的 Trip Zone 保护机制。故障触发信号既可以来自 TZ1~TZ6 的直连触发信号,也可以来自 DC(Digital Compare)模块的触发信号。一旦触发,硬件能立即将 PWM 输出强制到安全状态,无需 CPU 干预。
- 时钟基准同步 :ePWM 提供了
EPWMxSYNCI(输入)和EPWMxSYNCO(输出)两路信号,用于多个 ePWM 模块之间的时钟基准同步。这使得多路 PWM 可以保持精确的相位对齐,适用于多相变换器和电机驱动。 - ADC 启动触发 :模块还能产生用于启动 ADC 采样的
EPWMxSOCA和EPWMxSOCB信号,使得 ADC 采样与 PWM 波形严格同步,确保在最佳时刻采集电流、电压等反馈量。 - 外部信号交互 :ePWM 还可以接收比较器输出信号(COMPxOUT),作为额外的触发源或同步源,进一步增强了模块与芯片内部模拟外设的协同能力。
- 中断管理与 PIE 接口 :ePWM 模块产生的中断信号通过 PIE(外设中断扩展)控制器上报给 CPU;
在使用ePWM模块前,我们必须要对使用到的引脚进行配置:
CGPIO_setPinConfig(GPIO_0_EPWM1A); /* 复用为ePWM输出引脚 */ GPIO_setPadConfig(0U, GPIO_PIN_TYPE_STD); /* 配置引脚电气特性为标准模式(推挽输出)*/
二、ePWM 内部子模块详解
PWM模块内部包含有8个子模块,分别是:时间基准子模块TB、计数比较子模块CC,动作限定子模块AQ、死区控制子模块DB、斩波控制子模块PC、事件触发子模块ET、数字比较(DC)子模块和故障捕获子模块TZ,正是由这几个子模块的配合,才可以方便地得到所需的PWM波形。
信号大方向是:
TB 出时间事件 → CC 出比较事件 → AQ 决定引脚动作 → DB 插死区出互补PWM → ET 发中断/ADC触发 → TZ/DC 随时劫持输出
2.1 Time-Base(TB)时间基准子模块
每个ePWM模块都有自己的时间基准子模块,用于配置 ePWM 模块的事件时序。同步逻辑信号可以实现多个ePWM 模块间的时基同步。
其主要特性如下:
- 指定ePWM的时间基准计时器(TBCTR)的频率、周期值、计数模式(增、减、增减);
- 可与其他ePWM模块进行主从的时间基准同步或相位偏移;
- 产生输出事件:TBCTR = TBPRD(计数值等于周期值)或者TBCTR = 0(计数值等于0);
示例程序:
c
/*
EPWMCLK = SYSCLK / SYSCTL_EPWMCLK_DIV
TBCLK = EPWMCLK / HSPCLKDIV / CLKDIV
PWM_freq = TBCLK / (2 * TBPRD)
*/
/* 默认SYSCTL_EPWMCLK_DIV = 2,若需要ePWM的输入频率等于系统频率,必须显式调用该函数 */
SysCtl_setEPWMClockDivider(SYSCTL_EPWMCLK_DIV_1);
EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_setTimeBasePeriod(EPWM1_BASE, 5000U);
EPWM_disablePhaseShiftLoad(EPWM1_BASE); /* 关闭SYNC脉冲相位加载,不使用硬件移相 */
EPWM_setPhaseShift(EPWM1_BASE, 0); /* TBPHS清0 */
EPWM_setTimeBaseCounter(EPWM1_BASE, 0); /* TBCTR清0 */
/*************************** 时钟基准同步配置 ************************/
/* EPWM1为主:计数器到0时输出同步脉冲 */
EPWM_enableSyncOutPulseSource(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
/* 其他ePWM模块同步主模块ePWM1的时钟 */
EPWM_setSyncInPulseSource(EPWM2_BASE, EPWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1);
......
2.2 Counter-Compare(CC)计数比较子模块
计数器比较子模块接收时间基准计数器的值。每个 ePWM 的计数比较子模块模块拥有至少两个比较寄存器(CMPA、CMPB),部分新型号还额外支持 CMPC 和 CMPD,时间基准计数器等于其中一个比较寄存器时,计数器比较单元会生成相应的事件。对于比较器数值的设定支持影子模式,即将设定值先存入影子寄存器后自动加载到比较寄存器中。
产生的事件如下:
-
TBCTR = CMPA(时间基准计数器等于计数器比较A寄存器);
-
TBCTR = CMPB;
(对于支持CMPC/CMPD的型号,还可产生以下事件)
-
TBCTR = CMPC;
-
TBCTR = CMPD;
TBCTR = CMPC、TBCTR = CMPD这两个事件仅可用于事件触发子模块生成事件,不能用于动作限定子模块的输入
示例程序:
c
/* 比较模块CMPA配置,开启影子加载在计数值为0时生效 */
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0);
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A,
EPWM_COMP_LOAD_ON_CNTR_ZERO);
2.3 Action Qualifier(AQ)动作限定子模块
AQ子模块用来控制在一个特殊事件触发时刻如何改变EPWMxA及EPWMxB的状态,输入到AQ子模块内部的事件进一步被计数器的计数方向区分,从而允许在上升时刻和下降时刻的单独控制。
动作限定子模块负责以下功能:
-
根据以下事件对动作进行限定并生成相应动作(设置、清除、切换):
- TBCTR = TBPRD(时间基准计数器等于周期值);
- TBCTR = 0(时间基准计数器等于零);
- TBCTR = CMPA(时间基准计数器等于比较器A寄存器值);
- TBCTR = CMPB(时间基准计数器等于比较器B寄存器值);
-
T1、T2 事件:基于比较器、跳闸或 syncin 事件触发的动作事件
示例程序:
c
/* 仅需要配置动作限定器A通道,互补PWM由后续死区子模块生成 */
/* CNT_ZERO(计数器等于0):PWMA输出拉低 */
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
/* CNT=PRD(计数到周期最大值):PWMA保持原有电平,不改变 */
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_NO_CHANGE,
EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
/* UP计数匹配CMPA:PWMA置高电平 */
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
/* DOWN计数匹配CMPA:PWMA拉低电平 */
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW,
EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
/* UP计数匹配CMPB:PWMA保持原有电平,不改变 */
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_NO_CHANGE,
EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
/* DOWN计数匹配CMPB:PWMA保持原有电平,不改变 */
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_NO_CHANGE,
EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
2.4 Dead-Band(DB)死区子模块
虽然AQ模块可以通过控制 ePWM 模块中的 CMPA 和 CMPB 资源来放置边沿,从而生成所需的死区。然而,如果需要更经典的基于边沿延迟且带有极性控制的死区,则必须使用本文所述的死区子模块。从单个 EPWMxA 输入端生成具有死区关系的适当信号对(EPWMxA 和 EPWMxB);
如上图所示,由左到右分别为:1. 输入模式选择,依靠S4、S5控制;2. 双边沿死区模式,依靠S8控制;3.输出极性选择(是否翻转电平),依靠S2、S3控制;4. 输出模式选择,由S0、S1控制;5. 输出反转选择,由S6、S7控制;
示例代码如下:
c
/* 死区计数与配置影子寄存器开启,即修改死区计数值或者配置后,将在计数值为0时有效加载到寄存器
此配置一定要放在死区模块配置之前,否则会造成已配置内容没有加载到影子寄存器。
*/
EPWM_setRisingEdgeDelayCountShadowLoadMode(EPWM1_BASE, EPWM_RED_LOAD_ON_CNTR_ZERO);
EPWM_setFallingEdgeDelayCountShadowLoadMode(EPWM1_BASE, EPWM_FED_LOAD_ON_CNTR_ZERO);
EPWM_setDeadBandControlShadowLoadMode(EPWM1_BASE, EPWM_DB_LOAD_ON_CNTR_ZERO);
/* 死区模块配置:AHC 高有效互补 */
/* 输入模式选择,这里选择ePWMxA作为上下边沿的输入信号,对应图中S4=0,S5=0,S8=0 */
EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA);
EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA);
/* 设置 RED 和 FED 的延时计数值,其值代表TBCLK脉冲数量 */
EPWM_setRisingEdgeDelayCount(EPWM1_BASE, db_count);
EPWM_setFallingEdgeDelayCount(EPWM1_BASE, db_count);
/* 设置 RED 和 FED 的输出极性,这里配置为RED不翻转,FED翻转,对应图中S2=0,S3=1 */
EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH);
EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);
/* 设置死区模块输出模式,这里配置为上升沿、下降沿延时都开启,对应图中S0=1,S1=1 */
EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, true);
EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, true);
/* 是否交换通路,这里都不交换,对应S6=0,S7=0 */
EPWM_setDeadBandOutputSwapMode(EPWM1_BASE, EPWM_DB_OUTPUT_A, false);
EPWM_setDeadBandOutputSwapMode(EPWM1_BASE, EPWM_DB_OUTPUT_B, false);
2.5 PWM-Chopper(PC)斩波子模块
斩波子模块(Chopper)专为脉冲变压器栅极驱动设计,它会把 PWM 的高电平切成高频脉冲串,避免脉冲变压器因直流分量发生磁饱和,还可配置首脉冲加宽来保证功率管可靠开通;普通电机驱动使用光耦驱动芯片时不需要该功能,直接关闭即可。
2.6 Event Trigger(ET)事件触发子模块
事件触发子模块负责将 ePWM 模块内部产生的各种事件(计数器归零、周期匹配、比较匹配等)转化为对外部系统的触发信号,包括向 CPU 发送中断请求以及向 ADC 发送启动转换信号(SOCA/SOCB)。
其主要特性如下:
- 每个 ePWM 模块可产生两路独立的 ADC 触发信号(
EPWMxSOCA和EPWMxSOCB),支持选择多种事件源; - 支持事件预分频,可设定每 N 次事件才产生一次触发,降低 CPU 或 ADC 负担;
- 中断信号通过 PIE 控制器上报 CPU,支持中断标志清除和使能控制,支持多种中断源
示例程序:
c
/* 配置 EPWM1 在计数器归零时触发 ADC SOCA,不分频(每次事件都触发) */
EPWM_setADCTriggerSource(EPWM1_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_ZERO);
EPWM_setADCTriggerEventPrescale(EPWM1_BASE, EPWM_SOC_A, 1);
/* 使能 ADC 触发输出 */
EPWM_enableADCTrigger(EPWM1_BASE, EPWM_SOC_A);
/* 若需要产生中断,例如在周期匹配时进入 ISR */
EPWM_setInterruptSource(EPWM1_BASE, EPWM_INT_TBCTR_PERIOD);
EPWM_setInterruptEventCount(EPWM1_BASE, 1);
EPWM_enableInterrupt(EPWM1_BASE);
2.7 Trip Zone(TZ)故障保护子模块
Trip Zone 子模块是 ePWM 的硬件级安全屏障,能够在检测到外部故障信号(如过流、过压)后,无需 CPU 参与,立即将 PWM 输出引脚强制到预定义的安全状态(低电平、高电平或高阻),有效防止功率器件损坏。
其主要特性如下:
- 支持多种触发源:外部 TZ1~TZ6 引脚、DC 模块事件(DCAEVT/DCBEVT)、内部系统错误(时钟失效、EMU STOP 等);
- 两种工作模式:
- CBC(Cycle-by-Cycle)逐周期模式:触发后在本周期内强制输出安全状态,计数器归零时自动恢复,适用于过流限流;
- OSHT(One-Shot)单次锁存模式:触发后永久锁定安全状态,必须软件清除标志位才能恢复,适用于严重故障(如短路);
- 可独立配置 ePWMxA 和 ePWMxB 的强制动作:强制低、强制高、高阻、不变;
- 支持中断上报,便于 CPU 记录故障信息。
示例程序:
c
/* 故障引脚配置为上拉输入,使用异步采样GPIO_QUAL_ASYNC,禁止输入滤波延时 */
GPIO_setPinConfig(GPIO_26_GPIO26);
GPIO_setDirectionMode(GPIO_26_GPIO26, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(GPIO_26_GPIO26, GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(GPIO_26_GPIO26, GPIO_QUAL_ASYNC);
/* Input X-BAR路由,将GPIO26映射至XBAR_INPUT1通道(即TZ1)*/
XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT1, GPIO_26_GPIO26);
/* TZA(包含TZ1 - TZ6, DCAEVT2, DCAEVT1)事件动作:强制拉低 */
EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
/* 使能 One-Shot 事件源 */
EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT1);
/* 开启EPWM模块的OST中断 */
EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_OST);
/* 注册PIE中断向量,Group2 */
Interrupt_register(INT_EPWM1_TZ, &epwm1TzISR);
/* 使能PIE中断 */
Interrupt_enable(INT_EPWM1_TZ);
2.8 Digital Compare(DC)数字比较子模块
数字比较子模块(DC)是一个灵活的交叉连接枢纽,它可以将芯片内部的模拟比较器输出(CMPSS)、外部 TZ 引脚、X-BAR 输出等信号进行逻辑组合,生成更为复杂的触发事件,并路由到 TZ 子模块或作为 ePWM 的同步/触发源。
其主要特性如下:
- 输入信号源可来自 CMPSS 比较器、TZ 引脚、Input X-BAR 等,通过
DCTRIPSEL寄存器选择; - 支持对输入信号的电平(高/低)或边沿(上升/下降)进行检测,生成 DCAEVT1/2 和 DCBEVT1/2 事件;
- 这些事件可直接送入 TZ 子模块(作为 CBC 或 OSHT 触发源),或用于产生同步脉冲、ADC 触发等;
- 每个 ePWM 模块有两组独立的数字比较通道(DCxH/L),分别对应 A/B 输出路径。
示例程序:
c
/* 故障引脚配置为上拉输入,使用异步采样GPIO_QUAL_ASYNC,禁止输入滤波延时 */
GPIO_setPinConfig(GPIO_23_GPIO23);
GPIO_setDirectionMode(GPIO_23_GPIO23, GPIO_DIR_MODE_IN);
GPIO_setPadConfig(GPIO_23_GPIO23, GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(GPIO_23_GPIO23, GPIO_QUAL_ASYNC);
/* Input X-BAR路由,将GPIO23映射至XBAR_INPUT9通道 */
XBAR_setInputPin(INPUTXBAR_BASE, XBAR_INPUT9, GPIO_23_GPIO23);
/* INPUTXBAR9 → ePWM X-BAR TRIP9 */
XBAR_setEPWMMuxConfig(XBAR_TRIP9, XBAR_EPWM_MUX21_INPUTXBAR9);
XBAR_enableEPWMMux(XBAR_TRIP9, XBAR_MUX21);
/* DCBH 走 TRIP9 输入 */
EPWM_selectDigitalCompareTripInput(EPWM1_BASE,EPWM_DC_TRIP_TRIPIN9, EPWM_DC_TYPE_DCAH);
/* DCAEVT1 = DCAH 低(故障时 DCAH 为低) */
EPWM_setTripZoneDigitalCompareEventCondition(EPWM1_BASE,
EPWM_TZ_DC_OUTPUT_A1,
EPWM_TZ_EVENT_DCXH_LOW);
/* 使能 One-Shot 事件源 */
EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_DCAEVT1);
/* DC 事件动作:强制拉低 */
EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_DCAEVT1, EPWM_TZ_ACTION_LOW);
/* 开启EPWM模块的OST中断 */
EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_OST);
/* 注册PIE中断向量,Group2 */
Interrupt_register(INT_EPWM1_TZ, &epwm1TzISR);
/* 使能PIE中断 */
Interrupt_enable(INT_EPWM1_TZ);
三、总结
ePWM 模块是 C2000 系列 DSP 实现电力电子控制的核心外设,其内部 8 个子模块分工明确、协作紧密,形成了一条完整的 PWM 生成与保护链路:
| 子模块 | 缩写 | 核心职责 |
|---|---|---|
| 时间基准 | TB | 产生时基信号,控制 PWM 频率与计数模式 |
| 计数比较 | CC | 设定比较值,产生匹配事件 |
| 动作限定 | AQ | 将事件映射为引脚电平动作 |
| 死区控制 | DB | 插入互补死区,防止桥臂直通 |
| 斩波控制 | PC | 可选,用于脉冲变压器驱动 |
| 事件触发 | ET | 产生 ADC 触发和 CPU 中断 |
| 故障保护 | TZ | 硬件级紧急关断,无需 CPU 干预 |
| 数字比较 | DC | 灵活组合内部信号,生成复杂触发条件 |