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)
运行与验证
- 编译工程:点击锤子图标,确认编译无错误无警告
- 烧录运行:点击绿色虫子图标进入调试,点击运行(F8)
- 示波器观察GPIO0引脚:应看到频率20kHz、幅值3.3V的方波
- 验证占空比切换:每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