C2000之ePWM详讲

C2000之ePWM详讲

ePWM(增强型脉冲宽度调制)是 TI C2000 DSP 内部专用外设,专为电机驱动、开关电源等电力电子场景设计,硬件独立完成 PWM 生成、死区、故障保护,极少占用 CPU 资源。本文从底层原理与示例代码,详细讲述ePWM的使用方法。

本例程使用的是C2000WARE版本为26.02.00.00.LTS (2026-9-30)

本例程的故障保护子模块和数字比较子模块的示例程序需要用到X-BAR的相关知识

一、概述

ePWM模块

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模块内部详讲

在使用ePWM模块前,我们必须要对使用到的引脚进行配置:

GPIO_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 模块间的时基同步。

其主要特性如下:

  1. 指定ePWM的时间基准计时器(TBCTR)的频率、周期值、计数模式(增、减、增减);
  2. 可与其他ePWM模块进行主从的时间基准同步或相位偏移;
  3. 产生输出事件:TBCTR = TBPRD(计数值等于周期值)或者TBCTR = 0(计数值等于0);

示例程序:

/*
	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,时间基准计数器等于其中一个比较寄存器时,计数器比较单元会生成相应的事件。对于比较器数值的设定支持影子模式,即将设定值先存入影子寄存器后自动加载到比较寄存器中。

产生的事件如下:

  1. TBCTR = CMPA(时间基准计数器等于计数器比较A寄存器);

  2. TBCTR = CMPB;

    (对于支持CMPC/CMPD的型号,还可产生以下事件)

  3. TBCTR = CMPC;

  4. TBCTR = CMPD;

TBCTR = CMPC、TBCTR = CMPD这两个事件仅可用于事件触发子模块生成事件,不能用于动作限定子模块的输入

示例程序:

/* 比较模块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子模块内部的事件进一步被计数器的计数方向区分,从而允许在上升时刻和下降时刻的单独控制。

动作限定子模块负责以下功能:

  1. 根据以下事件对动作进行限定并生成相应动作(设置、清除、切换):

    • TBCTR = TBPRD(时间基准计数器等于周期值);
    • TBCTR = 0(时间基准计数器等于零);
    • TBCTR = CMPA(时间基准计数器等于比较器A寄存器值);
    • TBCTR = CMPB(时间基准计数器等于比较器B寄存器值);
  2. T1、T2 事件:基于比较器、跳闸或 syncin 事件触发的动作事件

示例程序:

/* 仅需要配置动作限定器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控制;

示例代码如下:

/* 	死区计数与配置影子寄存器开启,即修改死区计数值或者配置后,将在计数值为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 的高电平切成高频脉冲串,避免脉冲变压器因直流分量发生磁饱和,还可配置首脉冲加宽来保证功率管可靠开通;普通电机驱动使用光耦驱动芯片时不需要该功能,直接关闭即可。

PC输出调制信号

2.6 Event Trigger(ET)事件触发子模块

ET子模块

事件触发子模块负责将 ePWM 模块内部产生的各种事件(计数器归零、周期匹配、比较匹配等)转化为对外部系统的触发信号,包括向 CPU 发送中断请求以及向 ADC 发送启动转换信号(SOCA/SOCB)。

其主要特性如下:

  1. 每个 ePWM 模块可产生两路独立的 ADC 触发信号(EPWMxSOCA 和 EPWMxSOCB),支持选择多种事件源;
  2. 支持事件预分频,可设定每 N 次事件才产生一次触发,降低 CPU 或 ADC 负担;
  3. 中断信号通过 PIE 控制器上报 CPU,支持中断标志清除和使能控制,支持多种中断源

示例程序:

/* 配置 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 输出引脚强制到预定义的安全状态(低电平、高电平或高阻),有效防止功率器件损坏。

其主要特性如下:

  1. 支持多种触发源:外部 TZ1~TZ6 引脚、DC 模块事件(DCAEVT/DCBEVT)、内部系统错误(时钟失效、EMU STOP 等);
  2. 两种工作模式:
    • CBC(Cycle-by-Cycle)逐周期模式:触发后在本周期内强制输出安全状态,计数器归零时自动恢复,适用于过流限流;
    • OSHT(One-Shot)单次锁存模式:触发后永久锁定安全状态,必须软件清除标志位才能恢复,适用于严重故障(如短路);
  3. 可独立配置 ePWMxA 和 ePWMxB 的强制动作:强制低、强制高、高阻、不变;
  4. 支持中断上报,便于 CPU 记录故障信息。

示例程序:

/* 故障引脚配置为上拉输入,使用异步采样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 的同步/触发源。

其主要特性如下:

  1. 输入信号源可来自 CMPSS 比较器、TZ 引脚、Input X-BAR 等,通过 DCTRIPSEL 寄存器选择;
  2. 支持对输入信号的电平(高/低)或边沿(上升/下降)进行检测,生成 DCAEVT1/2 和 DCBEVT1/2 事件;
  3. 这些事件可直接送入 TZ 子模块(作为 CBC 或 OSHT 触发源),或用于产生同步脉冲、ADC 触发等;
  4. 每个 ePWM 模块有两组独立的数字比较通道(DCxH/L),分别对应 A/B 输出路径。

示例程序:

/* 故障引脚配置为上拉输入,使用异步采样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 灵活组合内部信号,生成复杂触发条件
posted @ 2026-10-22 19:11  比特向阳  阅读(17)  评论(0)    收藏  举报