1. 电机控制基础实验

任务目标

本实验使用C2000 DSP(以TMS320F28379D为例)的ePWM模块,生成频率与占空比均可调的PWM波形。该波形作为电机驱动功率级的控制信号,是电机控制的基础。实验通过在线调整占空比寄存器,观察输出波形变化,验证ePWM配置的正确性。

硬件与开发环境

  • 硬件:TMS320F28379D LaunchPad开发板(板载LED连接至GPIO0,对应ePWM1A输出)
  • 软件:CCS(Code Composer Studio)12.x,使用Bit-Field结构体开发方式
  • 连接:将示波器探头连接至LaunchPad的GPIO0引脚(J4排针第40脚),地线接GND

核心实现

以下代码完成ePWM1模块的初始化,产生20kHz、占空比50%的PWM波形。主循环中每500ms将占空比在10%与90%之间切换,便于示波器观察占空比变化效果。

#include "F28x_Project.h"

// --- 全局变量 ---
volatile Uint16 dutyToggle = 0;    // 占空比切换标志

// --- ePWM1初始化函数 ---
void InitEPwm1(void)
{
    // 1. 关闭时基计数器,配置期间禁止输出
    EPwm1Regs.TBCTL.bit.PRDLD = TB_IMMEDIATE;   // 立即装载周期值
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 时基计数器归零时输出同步信号
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    // 高速时基时钟分频:1分频
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;       // 时基时钟分频:1分频

    // 2. 设置时基周期:150MHz / (20kHz * 1 * 1) = 7500
    EPwm1Regs.TBPRD = 7500 - 1;                 // 周期寄存器(0~7499计数)

    // 3. 计数模式:递增/递减模式(产生对称PWM)
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

    // 4. 比较值初始化:50%占空比
    EPwm1Regs.CMPA.bit.CMPA = 3750;             // 7500 * 50% = 3750

    // 5. 动作限定:递增计数时CMPA匹配→输出低;递减计数时CMPA匹配→输出高
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;        // 递增匹配→清零(输出低)
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;          // 递减匹配→置位(输出高)

    // 6. 死区模块:本实验不使用,全部旁路
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_DISABLE;

    // 7. 斩波模块:禁用
    EPwm1Regs.PCCTL.bit.CHPEN = 0;

    // 8. 事件触发:时基周期中断用于调试(可选)
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;   // 计数器归零时触发中断
    EPwm1Regs.ETSEL.bit.INTEN = 1;              // 使能中断
    EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;         // 每次归零触发一次

    // 9. 使能时基计数器
    EPwm1Regs.TBCTL.bit.FREESOFT = 2;           // 仿真暂停时自由运行
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 重新确认模式(上一步已设)
}

// --- 主函数 ---
void main(void)
{
    // 初始化设备
    InitSysCtrl();

    // 禁用全局中断(配置期间)
    DINT;

    // 初始化GPIO:将GPIO0配置为ePWM1A输出
    InitEPwm1Gpio();

    // 初始化ePWM1模块
    InitEPwm1();

    // 使能全局中断
    EINT;

    // 主循环:交替切换占空比
    for(;;)
    {
        DELAY_US(500000);   // 延时500ms

        if(dutyToggle == 0)
        {
            EPwm1Regs.CMPA.bit.CMPA = 750;      // 占空比10%(750/7500)
            dutyToggle = 1;
        }
        else
        {
            EPwm1Regs.CMPA.bit.CMPA = 6750;     // 占空比90%(6750/7500)
            dutyToggle = 0;
        }
    }
}

工程配置说明

在CCS中新建空工程时需完成以下配置:

  • 添加设备支持库:工程属性 → 常规 → 产品 → 勾选C2000Ware
  • 包含头文件路径:C2000Ware_X_XX_XX_XX/device_support/f2837xd/common/include与.../f2837xd/headers/include
  • 添加运行支持库:工程属性 → 构建 → C2000链接器 → 文件搜索路径 → 添加libc.a
  • 链接命令文件:添加F2837xD_Headers_nonBIOS_cm.h对应的.cmd文件(位于.../f2837xd/headers/cmd)

运行与验证

  1. 编译工程:点击锤子图标,确认编译无错误无警告
  2. 烧录运行:点击绿色虫子图标进入调试,点击运行(F8)
  3. 示波器观察GPIO0引脚:应看到频率20kHz、幅值3.3V的方波
  4. 验证占空比切换:每500ms波形高电平时间在10%与90%之间切换(即高电平时间在3.75μs与33.75μs之间交替)

通过条件:示波器显示频率为20kHz±1%,且占空比每500ms在10%与90%之间交替变化,说明ePWM模块配置正确,PWM波形生成成功。

常见问题

  • 无波形输出:检查GPIO0是否被其他外设复用,确认InitEPwm1Gpio()已正确调用;用万用表测量GPIO0对地电压,若为0V或3.3V恒定值说明PWM未工作
  • 频率偏差:确认系统时钟为150MHz(F28379D默认配置),若使用其他时钟频率需重新计算TBPRD值
  • 占空比不变化:检查主循环中DELAY_US是否被优化掉,确认dutyToggle变量声明为volatile