4. PWM输出基础波形
任务定义
本案例目标是在TI C2000系列DSP(以TMS320F28379D为例)上,通过EPWM模块输出两路基础PWM波形:EPWM1A为频率10kHz、占空比50%的方波;EPWM1B为与EPWM1A互补、带1μs死区时间的波形。通过示波器或逻辑分析仪观测两路输出,验证死区插入效果。
硬件连接与观测点
实现代码
以下代码使用TI官方库函数配置EPWM1模块。系统时钟假设为200MHz,EPWM时钟分频后为100MHz(TBCLK = SYSCLK / 2)。
// file: epwm_basic_wave.c
// 目标:TMS320F28379D LaunchPad,EPWM1A/EPWM1B输出10kHz互补PWM,死区1μs
#include "F28x_Project.h"
void initEPWM1(void) {
// 1. 使能EPWM1时钟(默认已使能,此处确保)
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 停止时基同步,配置期间防止误触发
// 2. 配置GPIO0为EPWM1A,GPIO1为EPWM1B
GPIO_SetupPinMux(0, GPIO_MUX_CPU1, 1); // GPIO0 -> EPWM1A
GPIO_SetupPinOptions(0, GPIO_OUTPUT, GPIO_PUSH_PULL);
GPIO_SetupPinMux(1, GPIO_MUX_CPU1, 1); // GPIO1 -> EPWM1B
GPIO_SetupPinOptions(1, GPIO_OUTPUT, GPIO_PUSH_PULL);
// 3. 时基配置:TBCLK = SYSCLK / 2 = 100MHz
// 目标频率10kHz -> 周期 = 100MHz / 10kHz = 10000个TBCLK周期
EPwm1Regs.TBCTL.bit.PRDLD = TB_IMMEDIATE; // 周期立即装载
EPwm1Regs.TBPRD = 9999; // 周期值(0~9999共10000个周期)
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 递增计数模式
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟分频 = 1
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2; // 时钟分频 = 2 (SYSCLK/2=100MHz)
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁止相位装载
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 时基同步信号源
// 4. 计数器比较值:50%占空比 -> CMPA = 5000
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW_IMMEDIATE; // 立即装载
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW_IMMEDIATE;
EPwm1Regs.CMPA.bit.CMPA = 5000; // 占空比50%
// 5. 动作限定:递增计数
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 计数到CMPA时EPWM1A置高
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR; // 计数到周期时EPWM1A拉低
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR; // EPWM1B与A相反
EPwm1Regs.AQCTLB.bit.PRD = AQ_SET;
// 6. 死区配置:上升沿延迟1μs(100MHz下=100个TBCLK周期)
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 使能死区
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 高电平互补
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; // A/B均使用EPWM1A作为输入
EPwm1Regs.DBRED.bit.DBRED = 100; // 上升沿延迟100个TBCLK = 1μs
EPwm1Regs.DBFED.bit.DBFED = 100; // 下降沿延迟100个TBCLK = 1μs
// 7. 启动时基
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
}
void main(void) {
InitSysCtrl(); // 初始化系统控制
DINT; // 关闭全局中断
InitGpio(); // 初始化GPIO
initEPWM1(); // 配置EPWM1
EINT; // 开启全局中断
while(1) {
// 主循环空转,PWM由硬件自动输出
}
}
关键配置说明
| 参数 | 值 | 计算依据 |
|---|---|---|
| 系统时钟SYSCLK | 200 MHz | F28379D默认配置 |
| EPWM时基时钟TBCLK | 100 MHz | CLKDIV=2 → 200/2=100MHz |
| PWM频率 | 10 kHz | TBPRD=9999 → 100MHz/10000=10kHz |
| 占空比 | 50% | CMPA=5000 → 5000/10000 |
| 死区时间 | 1 μs | DBRED=100 → 100/100MHz=1μs |
验证方法
编译与烧录:在CCS中创建工程,添加上述代码,编译通过后通过XDS110仿真器烧录至LaunchPad开发板。
观测步骤:
- 将示波器CH1探头连接至GPIO0(EPWM1A),CH2探头连接至GPIO1(EPWM1B),共地;
- 运行程序,示波器应显示两路10kHz方波;
- 测量CH1频率应为10kHz±1%,占空比50%±2%;
- 测量CH2与CH1的上升沿时间差,应为1μs±0.1μs(死区时间);
- 确认任意时刻两路信号不会同时为高电平(排除直通风险)。
判定标准:以上4项测量全部满足,则本案例验证通过。若频率偏差超过5%,检查系统时钟配置;若无死区,检查DBCTL寄存器配置是否正确使能。