1. EPWM模块基础认知
在电力电子和电机控制领域,精确的脉冲宽度调制(PWM)信号生成是核心需求。TI的C2000系列DSP中,增强型PWM模块(EPWM)通过硬件级的高精度时序控制,为工程师提供了强大的数字电源和电机控制解决方案。与传统PWM相比,EPWM增加了数字比较、死区控制、事件触发等高级功能,特别适合需要多路同步输出的复杂应用场景。
EPWM模块由时基子模块(TB)、计数比较子模块(CC)、动作限定子模块(AQ)、死区子模块(DB)、事件触发子模块(ET)等组成。其中事件触发子模块负责在特定时间点(如计数器等于CMPA/CMPB、计数器归零等)产生中断或ADC启动信号,是实现精确时序控制的关键。通过合理配置ET子模块,可以在不增加CPU负担的情况下,实现周期事件、单次事件的精准响应。
实际工程中常见误区:许多开发者习惯用CPU定时器中断来触发控制逻辑,这会引入不可预测的延迟。而ET子模块的中断触发是硬件同步的,抖动通常小于10ns。
2. 事件触发子模块工作原理
2.1 触发源选择机制
ET子模块支持多种触发源选择,通过配置ETPS寄存器(Event Trigger Pre-Scale)可以设定:
- 时基计数器等于CMPA(ETPS.SOCAEN)
- 时基计数器等于CMPB(ETPS.SOCBEN)
- 时基计数器等于0(ETPS.SOCASEL=1)
- 时基计数器等于周期值(ETPS.SOCBSEL=1)
在TMS320F28379D芯片中,每个EPWM模块有独立的ETSEL寄存器用于选择具体触发条件。例如设置ETSEL.SOCASEL=1表示选择CMPA匹配作为触发源,这种硬件级的比较器响应速度远超软件判断。
2.2 中断触发时序分析
当触发条件满足时,ET子模块的工作流程如下:
- 时基计数器(TBCTR)与比较寄存器(CMPA/CMPB)匹配
- ETFLG寄存器中对应标志位置1(如ETFLG.SOCA)
- 如果ETSEL.INTSEL对应位使能且ETPS.INTPRD分频计数满,则触发EPWMx_INT中断
- CPU响应中断后需手动清除ETFLG.INT标志
关键时序参数计算公式:
code复制实际中断周期 = PWM周期 × ETPS.INTPRD
中断响应延迟 = 系统时钟周期 × (中断排队延迟 + 现场保存时间)
典型配置示例:当PWM频率为10kHz,ETPS.INTPRD=2时,中断触发频率为5kHz。
3. 寄存器配置实战
3.1 基础中断触发配置
以下是使用CCS开发环境配置EPWM1在CMPA匹配时触发中断的代码片段:
c复制// 初始化EPWM1模块
void InitEPwm1(void)
{
// 时基子模块配置
EPwm1Regs.TBPRD = 1000; // PWM周期 = 1000个TBCLK
EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位清零
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁止相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟预分频
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时钟预分频
// 比较子模块配置
EPwm1Regs.CMPA.half.CMPA = 500; // 50%占空比
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // CMPA影子寄存器模式
// 事件触发子模块配置
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_EQ_CMPA; // CMPA匹配触发中断
EPwm1Regs.ETSEL.bit.INTEN = 1; // 使能中断
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // 每次事件都触发中断
// 清除现有中断标志
EPwm1Regs.ETCLR.bit.INT = 1;
}
3.2 高级触发模式配置
对于需要多个触发点的复杂应用,可以结合SOCA和SOCB事件:
c复制// 双事件触发配置示例
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_EQ_CMPA; // SOCA在CMPA匹配时触发
EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTR_EQ_CMPB; // SOCB在CMPB匹配时触发
EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; // 每次SOCA事件都触发ADC启动
EPwm1Regs.ETPS.bit.SOCBPRD = ET_3RD; // 每3次SOCB事件触发中断
4. 中断服务程序实现
4.1 基本中断处理框架
在DSP2833x_PieVect.h中声明中断服务程序:
c复制interrupt void EPWM1_INT_ISR(void)
{
// 读取当前PWM计数器值(调试用)
Uint16 currentCount = EPwm1Regs.TBCTR;
// 用户控制逻辑代码
UpdateControlAlgorithm();
// 清除中断标志
EPwm1Regs.ETCLR.bit.INT = 1;
// 确认PIE组1中断响应
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
4.2 关键性能优化技巧
-
最小化ISR执行时间:
- 避免在ISR内进行浮点运算(可改用Q格式)
- 将非实时任务移到主循环
- 使用__interrupt关键字确保编译器优化
-
精确时间戳采集:
c复制// 获取中断触发精确时刻
Uint32 GetPreciseTimestamp(void)
{
Uint32 ts = EPwm1Regs.TBCTR;
ts |= (EPwm1Regs.TBCTL.bit.PHSDIR << 16); // 包含计数方向
return ts;
}
5. 典型问题排查指南
5.1 中断不触发常见原因
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无中断触发 | ETSEL.INTEN未使能 | 检查ETSEL寄存器配置 |
| 中断频率异常 | ETPS.INTPRD分频设置错误 | 重新计算分频系数 |
| 偶发中断丢失 | 未及时清除中断标志 | ISR中第一时间清除ETFLG |
| 中断响应延迟 | CPU全局中断未使能 | 检查INTM和IER寄存器 |
5.2 调试技巧实录
- 实时监控ETFLG寄存器:
c复制// 调试代码:检查事件触发标志
if(EPwm1Regs.ETFLG.bit.SOCA == 1) {
DebugOutput("SOCA事件已触发");
}
- 使用CLA协处理器:
对于高频中断(>50kHz),可将ET中断分配给CLA处理:
c复制EPwm1Regs.ETSEL.bit.INTEN = 0; // 禁用CPU中断
EPwm1Regs.ETCLR.bit.INT = 1;
EPwm1Regs.ETSEL.bit.INTEN = 1; // 重新使能
6. 高级应用场景
6.1 多模块同步触发
通过EPWM的相位同步功能,实现多个模块的精确事件联动:
c复制// 配置EPWM1为主模块
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 接受外部同步
EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 使能相位加载
// 配置EPWM2为从模块
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_OUT; // 输出同步信号
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm2Regs.TBPHS.half.TBPHS = 500; // 相位偏移500个TBCLK
6.2 与ADC模块联动
利用ET触发ADC采样,实现PWM周期内的多点采样:
c复制// 配置EPWM触发ADC
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_EQ_CMPA;
EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; // 选择通道0
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 1; // 触发源选择EPWM1_SOCA
在电机控制中,这种配置可以实现:
- PWM周期中点电流采样(消除开关噪声影响)
- 多路ADC的精确时间同步
- 死区时间后的电压采样
7. 实际工程经验
7.1 数字电源应用案例
在1MHz开关频率的Buck变换器中,采用ET中断实现的控制流程:
- PWM上升沿触发ADC采样输入电压
- CMPA匹配点触发中断执行PID计算
- CMPB匹配点更新占空比(影子寄存器模式)
- 周期匹配点进行保护检测
关键配置参数:
c复制EPwm1Regs.TBPRD = 60; // 对应1MHz @ 60MHz系统时钟
EPwm1Regs.CMPA = 30; // 初始50%占空比
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_EQ_CMPA;
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_EQ_ZERO;
7.2 电机控制中的相电流采样
三相逆变器控制中,需要避开功率管开关瞬间进行电流采样:
c复制// PWM周期设置
EPwm1Regs.TBPRD = 1000; // 10kHz PWM
// 上管开通时刻设置
EPwm1Regs.CMPA = 50; // 5%死区时间
EPwm1Regs.CMPB = 950; // 95%位置
// 触发ADC采样
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_EQ_CMPA;
EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTR_EQ_CMPB;
EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST;
EPwm1Regs.ETPS.bit.SOCBPRD = ET_1ST;
这种配置确保在PWM周期的中间位置(功率管完全导通时)进行电流采样,避免开关噪声影响。