主题中讨论的其他器件:TMS320F280037、 C2000WARE
您好!
我正在使用 TMS320F280037来控制 T 型逆变器、为此、我需要12个 PWM、但目前我只能生成8个 PWM 信号、即 PWM 1A、1B、2A、2B、3A 3B、4A 和4B。 PWM 5A、7A、7B 和8A 无法正常工作。 我的代码中可能出现了错误或缺失。 您能分析一下我的代码并提供一些建议吗?
int main (空)
{
InitSysCtrl ();//初始化器件时钟和外设
dint;//禁用 CPU 中断
InitPieCtrl ();//将 PIE 控制寄存器初始化为已知状态
IER = 0x0000;//禁用 CPU 中断
IFR = 0x0000;//清除所有 CPU 中断标志
InitPieVectTable();//初始化 PIE 向量表
//设置
Setup_GPIO ();//设置 GPIO
Setup_ePWM ();//设置 ePWM
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
while (1)
{
EPwm1Regs.CMPA.bit.CMPA = 50;
EPwm2Regs.CMPA.bit.CMPA = 100;
EPwm3Regs.CMPA.bit.CMPA = 150;
EPwm4Regs.CMPA.bit.CMPA = 200;
EPwm5Regs.CMPA.bit.CMPA = 250;
EPwm7Regs.CMPA.bit.CMPA = 300;
EPwm8Regs.CMPA.bit.CMPA = 350;
DELAY_US (5000000);
}
返回0;
}
void Setup_GPIO (void)
{
EALLOW;
//PWM 1
GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0; //选择 PWM 的 GMUX 1A
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //选择 PWM 的多路复用器1A
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1; //禁用 PWM 的上拉电阻1A
GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0; //选择 PWM 的 GMUX 1B
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; //选择 PWM 1B 的多路复用器
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1; //禁用 PWM 的上拉电阻1B
//PWM 2
GpioCtrlRegs.GPAGMUX1.bit.GPIO2 = 0; //选择 PWM 2A 的 GMUX
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; //选择 PWM 2A 的多路复用器
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1; //禁用 PWM 2A 的上拉电阻
GpioCtrlRegs.GPAGMUX1.bit.GPIO3 = 0; //选择 PWM 2B 的 GMUX
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; //选择 PWM 2B 的多路复用器
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1; //禁用 PWM 2B 的上拉电阻
//PWM 3
GpioCtrlRegs.GPAGMUX1.bit.GPIO4 = 0; //选择 PWM 3A 的 GMUX
GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 1; //选择 PWM 3A 的多路复用器
GpioCtrlRegs.GPAPUD.bit.GPIO4 = 1; //禁用 PWM 3A 的上拉电阻
GpioCtrlRegs.GPAGMUX1.bit.GPIO5 = 0; //选择 PWM 3B 的 GMUX
GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 1; //选择 PWM 3B 的 MUX
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 1; //禁用 PWM 3B 的上拉电阻
//PWM 4
GpioCtrlRegs.GPAGMUX1.bit.GPIO6 = 0; //选择 PWM 4A 的 GMUX
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 1; //选择 PWM 4A 的多路复用器
GpioCtrlRegs.GPAPUD.bit.GPIO6 = 1; //禁用 PWM 4A 的上拉电阻
GpioCtrlRegs.GPAGMUX1.bit.GPIO7 = 0; //选择 PWM 4B 的 GMUX
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 1; //选择 PWM 4B 的多路复用器
GpioCtrlRegs.GPAPUD.bit.GPIO7 = 1; //禁用 PWM 4B 的上拉电阻
//PWM 5
GpioCtrlRegs.GPAGMUX2.bit.GPIO16 = 0; //选择 PWM 的 GMUX 5A
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; //选择 PWM 5A 的多路复用器
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 1; //禁用 PWM 5A 的上拉电阻
//PWM 7
GpioCtrlRegs.GPAGMUX2.bit.GPIO28 = 0; //选择 PWM 的 GMUX 7A
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; //选择 PWM 的多路复用器7A
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 1; //禁用 PWM 7A 的上拉电阻
GPioCtrlRegs.GPAGMUX2.bit.GPIO29 = 0; //选择 PWM 7B 的 GMUX
GPioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; //选择 PWM 7B 的 MUX
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 1; //禁用 PWM 7B 的上拉电阻
//PWM 8
GpioCtrlRegs.GPAGMUX2.bit.GPIO24 = 0; //选择 PWM 8A 的 GMUX
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1; //选择 PWM 8A 的多路复用器
GpioCtrlRegs.GPAPUD.bit.GPIO24 = 1; //禁用 PWM 8A 的上拉电阻
EDIS;
}
void Setup_ePWM (void)
{
EALLOW; //允许版本
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1; //启用 ePWM1
CpuSysRegs.PCLKCR2.bit.EPWM2 = 1; //启用 ePWM2
CpuSysRegs.PCLKCR2.bit.EPWM3 = 1; //启用 ePWM3
CpuSysRegs.PCLKCR2.bit.EPWM4 = 1; //启用 ePWM4
CpuSysRegs.PCLKCR2.bit.EPWM5 = 1; //启用 ePWM5
CpuSysRegs.PCLKCR2.bit.EPWM7 = 1; //启用 ePWM7
CpuSysRegs.PCLKCR2.bit.EPWM8 = 1; //启用 ePWM8
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; //开始与其他 PWM 同步
//PWM 1
EPwm1Regs.TBPRD = 1200; //设置定时器周期(120e6)/(1*2*2)
EPwm1Regs.TBPHS.bit.TBPHS = 0; //设置相移
EPwm1Regs.EPWMSYNCOUTEN.all = SYNC_OUT_SRC_ENABLE_ALL;
EPwm1Regs.TBCTR = 0x0000; //清除计数器
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.CMPCTL.bit.SHDWAMODE = CC_shadow; //避免多次切换
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD; //刷新三角波顶部和底部的占空比
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_影子; //模块 B 也是如此
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_Zero_PRD; //对于模块 B 也是如此
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //有效高电平互补
EPwm1Regs.DBCTL.bit.out_mode = DB_FULL_ENABLE; //启用死区时间模块
EPwm1Regs.DBFED.bit.DBFED = 10; //下降死区时间(0.5us)
EPwm1Regs.DBRED.bit.DBRED = 10; //上升死区时间(0.25us)
EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; //实现 PRD 值时采取的操作(在这种情况下无操作)
EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION; //实现零值时采取操作(在这种情况下无操作)
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //实现计数器递增值时的操作(在这种情况下清除)
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; //实现计数器递减值时的操作(在这种情况下设置)
EPwm1Regs.ETSEL.bit.SOCAEN = 1; //启用模块 A 的转换开始
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_PRDZERO; //ADC 触发在顶部
EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; //在第一个事件上触发
// PWM 2
EPwm2Regs.TBPRD = EPwm1Regs.TBPRD; // PWM 1的相同周期
EPwm2Regs.TBPHS.bit.TBPHS = 0.5* EPwm1Regs.TBPRD;//相移为90度(0.5* EPwm1Regs.TBPRD)
EPwm2Regs.EPWMSYNCINSEL.bit.SEL = SYNC_IN_SRC_SYNCOUT_EPWM1;
EPwm2Regs.TBCTR = 0x0000; //清除计数器
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //向上计数/向下计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; //启用相移
EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN; //相移方向(正)
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //预分频高速时钟
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; //预分频低速时钟
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_影子; //避免多次切换
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD; //刷新三角波顶部和底部的占空比
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_影子; //模块 B 也是如此
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_Zero_PRD; //对于模块 B 也是如此
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //有效高电平互补
EPwm2Regs.DBCTL.bit.out_mode = DB_FULL_ENABLE; //启用死区时间模块
EPwm2Regs.DBFED.bit.DBFED = 10; //下降死区时间(0.1us)
EPwm2Regs.DBRED.bit.DBRED = 10; //上升死区时间(0.1us)
EPwm2Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; //实现 PRD 值时采取的操作(在这种情况下无操作)
EPwm2Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION; //实现零值时采取操作(在这种情况下无操作)
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; //实现计数器递增值时的操作(在这种情况下清除)
EPwm2Regs.AQCTLA.bit.CAD = AQ_SET; //实现计数器递减值时的操作(在这种情况下设置)
EPwm2Regs.ETSEL.bit.SOCAEN = 1; //启用模块 A 的转换开始
EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTR_PRDZERO; //ADC 触发在顶部
EPwm2Regs.ETPS.bit.SOCAPRD = ET_1ST; //在第一个事件上触发
// PWM 3
EPwm3Regs.TBPRD = EPwm1Regs.TBPRD; // PWM 1的相同周期
EPwm3Regs.TBPHS.bit.TBPHS = 1* EPwm1Regs.TBPRD; //相移为180度(1* EPwm1Regs.TBPRD)
EPwm3Regs.EPWMSYNCINSEL.bit.SEL = SYNC_IN_SRC_SYNCOUT_EPWM1;
EPwm3Regs.TBCTR = 0x0000; //清除计数器
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //向上计数/向下计数
EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE; //启用相移
EPwm3Regs.TBCTL.bit.PHSDIR = TB_DOWN; //相移方向(正)
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //预分频高速时钟
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1; //预分频低速时钟
EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_shadow; //避免多次切换
EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD; //刷新三角波顶部和底部的占空比
EPwm3Regs.CMPCTL.bit.SHDLBMODE = CC_影子; //模块 B 也是如此
EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_Zero_PRD; //对于模块 B 也是如此
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //有效高电平互补
EPwm3Regs.DBCTL.bit.out_mode = DB_FULL_ENABLE; //启用死区时间模块
EPwm3Regs.DBFED.bit.DBFED = 10; //下降死区时间(0.1us)
EPwm3Regs.DBRED.bit.DBRED = 10; //上升死区时间(0.1us)
EPwm3Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; //实现 PRD 值时采取的操作(在这种情况下无操作)
EPwm3Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION; //实现零值时采取操作(在这种情况下无操作)
EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR; //实现计数器递增值时的操作(在这种情况下清除)
EPwm3Regs.AQCTLA.bit.CAD = AQ_SET; //实现计数器递减值时的操作(在这种情况下设置)
EPwm3Regs.ETSEL.bit.SOCAEN = 1; //启用模块 A 的转换开始
EPwm3Regs.ETSEL.bit.SOCASEL = ET_CTR_PRDZERO; //ADC 触发在顶部
EPwm3Regs.ETPS.bit.SOCAPRD = ET_1ST; //在第一个事件上触发
// PWM 4
EPwm4Regs.TBPRD = EPwm1Regs.TBPRD; // PWM 1的相同周期
EPwm4Regs.TBPHS.bit.TBPHS = 0.5* EPwm1Regs.TBPRD;//相移为270度(0.5* EPwm1Regs.TBPRD)
EPwm4Regs.EPWMSYNCINSEL.bit.SEL = SYNC_IN_SRC_SYNCOUT_EPWM1;
EPwm4Regs.TBCTR = 0x0000; //清除计数器
EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //向上计数/向下计数
EPwm4Regs.TBCTL.bit.PHSEN = TB_DISABLE; //启用相移
EPwm4Regs.TBCTL.bit.PHSDIR = TB_UP; //相移方向(负)
EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //预分频高速时钟
EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1; //预分频低速时钟
EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_影子; //避免多次切换
EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD; //刷新三角波顶部和底部的占空比
EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_影子; //模块 B 也是如此
EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_Zero_PRD; //对于模块 B 也是如此
EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //有效高电平互补
EPwm4Regs.DBCTL.bit.out_mode = DB_FULL_ENABLE; //启用死区时间模块
EPwm4Regs.DBFED.bit.DBFED = 10; //下降死区时间(0.1us)
EPwm4Regs.DBRED.bit.DBRED = 10; //上升死区时间(0.1us)
EPwm4Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; //实现 PRD 值时采取的操作(在这种情况下无操作)
EPwm4Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION; //实现零值时采取操作(在这种情况下无操作)
EPwm4Regs.AQCTLA.bit.CAU = AQ_CLEAR; //实现计数器递增值时的操作(在这种情况下清除)
EPwm4Regs.AQCTLA.bit.CAD = AQ_SET; //实现计数器递减值时的操作(在这种情况下设置)
EPwm4Regs.ETSEL.bit.SOCAEN = 1; //启用模块 A 的转换开始
EPwm4Regs.ETSEL.bit.SOCASEL = ET_CTR_PRDZERO; //ADC 触发在顶部
EPwm4Regs.ETPS.bit.SOCAPRD = ET_1ST; //在第一个事件上触发
// PWM 5
EPwm5Regs.TBPRD = EPwm1Regs.TBPRD; // PWM 1的相同周期
EPwm5Regs.TBPHS.bit.TBPHS = 0; //无相移(0度)
EPwm5Regs.EPWMSYNCINSEL.bit.SEL = SYNC_IN_SRC_SYNCOUT_EPWM1;
EPwm5Regs.TBCTR = 0x0000; //清除计数器
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //向上计数/向下计数
EPwm5Regs.TBCTL.bit.PHSEN = TB_ENABLE; //启用相移
EPwm5Regs.TBCTL.bit.PHSDIR = TB_DOWN; //相移方向(正)
EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //预分频高速时钟
EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1; //预分频低速时钟
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_影子; //避免多次切换
EPwm5Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD; //刷新三角波顶部和底部的占空比
EPwm5Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; //实现 PRD 值时采取的操作(在这种情况下无操作)
EPwm5Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION; //实现零值时采取操作(在这种情况下无操作)
EPwm5Regs.AQCTLA.bit.CAU = AQ_CLEAR; //实现计数器递增值时的操作(在这种情况下清除)
EPwm5Regs.AQCTLA.bit.CAD = AQ_SET; //实现计数器递减值时的操作(在这种情况下设置)
// PWM 7
EPwm7Regs.TBPRD = EPwm1Regs.TBPRD; // PWM 1的相同周期
EPwm7Regs.TBPHS.bit.TBPHS = 0; //无相移(0度)
EPwm7Regs.TBCTR = 0x0000; //清除计数器
EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //向上计数/向下计数
EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE; //启用相移
EPwm7Regs.TBCTL.bit.PHSDIR = TB_DOWN; //相移方向(正)
EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //预分频高速时钟
EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV1; //预分频低速时钟
EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_影子; //避免多次切换
EPwm7Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD; //刷新三角波顶部和底部的占空比
EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_影子; //模块 B 也是如此
EPwm7Regs.CMPCTL.bit.LOADBMODE = CC_CTR_Zero_PRD; //对于模块 B 也是如此
EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //有效高电平互补
EPwm7Regs.DBCTL.bit.out_mode = DB_FULL_ENABLE; //启用死区时间模块
EPwm7Regs.DBFED.bit.DBFED = 10; //下降死区时间(0.1us)
EPwm7Regs.DBRED.bit.DBRED = 10; //上升死区时间(0.1us)
EPwm7Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; //实现 PRD 值时采取的操作(在这种情况下无操作)
EPwm7Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION; //实现零值时采取操作(在这种情况下无操作)
EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR; //实现计数器递增值时的操作(在这种情况下清除)
EPwm7Regs.AQCTLA.bit.CAD = AQ_SET; //实现计数器递减值时的操作(在这种情况下设置)
// PWM 8
EPwm8Regs.TBPRD = EPwm1Regs.TBPRD; // PWM 1的相同周期
EPwm8Regs.TBPHS.bit.TBPHS = 0; //无相移(0度)
EPwm8Regs.EPWMSYNCINSEL.bit.SEL = SYNC_IN_SRC_SYNCOUT_EPWM1;
EPwm8Regs.TBCTR = 0x0000; //清除计数器
EPwm8Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //向上计数/向下计数
EPwm8Regs.TBCTL.bit.PHSEN = TB_DISABLE; //启用相移
EPwm8Regs.TBCTL.bit.PHSDIR = TB_DOWN; //相移方向(正)
EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //预分频高速时钟
EPwm8Regs.TBCTL.bit.CLKDIV = TB_DIV1; //预分频低速时钟
EPwm8Regs.CMPCTL.bit.SHDWAMODE = CC_影子; //避免多次切换
EPwm8Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD; //刷新三角波顶部和底部的占空比
EPwm8Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; //实现 PRD 值时采取的操作(在这种情况下无操作)
EPwm8Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION; //实现零值时采取行动(在这种情况下无操作)
EPwm8Regs.AQCTLA.bit.CAU = AQ_CLEAR; //实现计数器递增值时的操作(在这种情况下清除)
EPwm8Regs.AQCTLA.bit.CAD = AQ_SET; //实现计数器递减值时的操作(在这种情况下设置)
//结束设置
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; //结束与其他 PWM 的同步
EDIS; //结束版本
}
