4. PWM输出基础波形

任务定义

本案例目标是在TI C2000系列DSP(以TMS320F28379D为例)上,通过EPWM模块输出两路基础PWM波形:EPWM1A为频率10kHz、占空比50%的方波;EPWM1B为与EPWM1A互补、带1μs死区时间的波形。通过示波器或逻辑分析仪观测两路输出,验证死区插入效果。

硬件连接与观测点

TMS320F28379D EPWM模块 GPIO0 EPWM1A GPIO1 EPWM1B 示波器/逻辑分析仪 CH1: EPWM1A (GPIO0) CH2: EPWM1B (GPIO1) 观测死区: 1μs (上升沿延迟) EPWM1A与EPWM1B为互补输出,死区时间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由硬件自动输出
    }
}

关键配置说明

参数值计算依据
系统时钟SYSCLK200 MHzF28379D默认配置
EPWM时基时钟TBCLK100 MHzCLKDIV=2 → 200/2=100MHz
PWM频率10 kHzTBPRD=9999 → 100MHz/10000=10kHz
占空比50%CMPA=5000 → 5000/10000
死区时间1 μsDBRED=100 → 100/100MHz=1μs

验证方法

编译与烧录:在CCS中创建工程,添加上述代码,编译通过后通过XDS110仿真器烧录至LaunchPad开发板。

观测步骤:

  1. 将示波器CH1探头连接至GPIO0(EPWM1A),CH2探头连接至GPIO1(EPWM1B),共地;
  2. 运行程序,示波器应显示两路10kHz方波;
  3. 测量CH1频率应为10kHz±1%,占空比50%±2%;
  4. 测量CH2与CH1的上升沿时间差,应为1μs±0.1μs(死区时间);
  5. 确认任意时刻两路信号不会同时为高电平(排除直通风险)。

判定标准:以上4项测量全部满足,则本案例验证通过。若频率偏差超过5%,检查系统时钟配置;若无死区,检查DBCTL寄存器配置是否正确使能。