工具/软件:Code Composer Studio
我们使用 TMS320F28377S 来控制电梯的三相同步电机、并使用 ePWM1A/B-ePWM3A/B 来生成三相 SVPWM 输出。 EPWM6A 用于输出脉冲信号以控制升运器制动器。 SYSCLKOUT=120MHz。 调用以下函数来配置 ePWM 模块:
void SetPWM123 (void)//为 SVPWM 设置 ePWM1/2/3模块
{EPwm1Regs.TBCTL.bit.SYNCOSEL =0;/*直通*/
EPwm2Regs.TBCTL.bit.SYNCOSEL =0;/*直通*/
EPwm3Regs.TBCTL.bit.SYNCOSEL =0;/*直通*/
EPwm1Regs.TBCTL.bit.PHSEN =1;/*允许每个定时器同步*/
EPwm2Regs.TBCTL.bit.PHSEN =1;/*允许每个定时器同步*/
EPwm3Regs.TBCTL.bit.PHSEN =1;/*允许每个定时器同步*/
EPwm1Regs.TBPRD =2000;//设置定时器周期、
EPwm2Regs.TBPRD =2000;//设置定时器周期
EPwm3Regs.TBPRD =2000;//设置定时器周期
EPwm1Regs.TBPHS.bit.TBPHS =0;//相位为0
EPwm2Regs.TBPHS.bit.TBPHS =0;//相位为0
EPwm3Regs.TBPHS.bit.TBPHS =0;//相位为0
EPwm1Regs.TBCTL.ALL =0xA08A;/0x2092;自由运行、同步时递增计数、TBCLK 30M、
EPwm2Regs.TBCTL.ALL =0xA08A;/0x2086;自由运行、同步时递增计数、TBCLK 30M
EPwm3Regs.TBCTL.ALL =0xA08A;//0x2086;自由运行、同步时递增计数、TBCLK 30M、
EPwm1Regs.CMPCTL.ALL = 0;//在 CTR=0时加载 CMPA/B,影子模式
EPwm2Regs.CMPCTL.ALL = 0;//在 CTR=0时加载 CMPA/B,影子模式
EPwm3Regs.CMPCTL.ALL = 0;//在 CTR=0时加载 CMPA/B,影子模式
EPwm1Regs.CMPA.bit.CMPA =200;// CMPA
EPwm2Regs.CMPA.bit.CMPA =200;// CMPA
EPwm3Regs.CMPA.bit.CMPA =200;// CMPA
EPwm1Regs.AQCTLA.all =0x61;//设置 wehn CAU,在 CAD 或 CTR=0时清除
EPwm2Regs.AQCTLA.ALL =0x61;//设置 wehn CAU、在 CAD 或 CTR=0时清除
EPwm3Regs.AQCTLA.all =0x61;//设置 wehn CAU,在 CAD 或 CTR=0时清除
EPwm1Regs.DBCTL.ALL =11;//启用死区、高电平有效互补
EPwm2Regs.DBCTL.ALL =11;//启用死区、高电平有效互补
EPwm3Regs.DBCTL.ALL =11;//启用死区、高电平有效互补
EPwm1Regs.DBRED.ALL =60;// PWM 上升沿延迟
EPwm1Regs.DBFED.ALL =60;// PWM 下降沿延迟
EPwm2Regs.DBRED.ALL =60;// PWM 上升沿延迟
EPwm2Regs.DBFED.ALL =60;// PWM 下降沿延迟
EPwm3Regs.DBRED.ALL =60;// PWM 上升沿延迟
EPwm3Regs.DBFED.ALL =60;// PWM 下降沿延迟
EALLOW;
EPwm1Regs.TZCTL.ALL =10;//设置触发区信号会将 ePWM1A/B 引脚输出清零为低电平
EPwm2Regs.TZCTL.ALL =10;//设置触发区信号会将 ePWM1A/B 引脚输出清零为低电平
EPwm3Regs.TZCTL.ALL =10;//设置触发区信号会将 ePWM1A/B 引脚输出清零为低电平
EPwm1Regs.TZFRC.bit.OST = 1;//强制 ePWM1A 和 ePWM1B 引脚输出低电平
EPwm2Regs.TZFRC.bit.OST = 1;//强制 ePWM2A 和 ePWM2B 引脚输出低电平
EPwm3Regs.TZFRC.bit.OST = 1;//强制 ePWM1A 和 ePWM3B 引脚输出低电平
EDIS;
EPwm1Regs.TBCTR = 0;//清除计数器
EPwm2Regs.TBCTR = 0;//清除计数器
EPwm3Regs.TBCTR = 0;//清除计数器
EPwm6Regs.TBCTL.ALL =0xA08A;//自由运行,同步时递增计数,TBCLK 30M
EPwm6Regs.TBPRD =12500;//设置定时器周期、1.2kHz
EPwm6Regs.AQCTLA.ALL =0x61;
EPwm6Regs.DBCTL.ALL =8;//禁用死区、高电平有效互补
EPwm6Regs.CMPA.bit.CMPA =10000;// CMPA
EPwm6Regs.TBCTR = 0;//清除计数器
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EPwm6Regs.TZCTL.ALL =2;//设置触发区信号会将 ePWM6A 引脚输出清零为低电平
EPwm4Regs.TZFRC.bit.OST = 1;//强制 EPWM4A 引脚输出低电平、不制动
EPwm6Regs.TZFRC.bit.OST = 1;//强制 ePWM6A 引脚输出低电平、非开路锁定
EDIS;
}
调用以下函数来启动 ePWM 输出:
void EPinPWM123 (void)//启用 ePWM1/2/3引脚输出
{EALLOW;
Cla1Regs.MICLR.all =0xFF;//清除所有 CLA 中断标志
Cla1Regs.MICLROVF.ALL =0xFF;//清除所有 CLA 中断溢出标志
Cla1Regs.MIER = 0x81;//启用 CLA 中断1、8、禁用7
EDIS;
AdcaRegs.ADCINTFLGCLR.All=15;//清除 ADCAINT1-4
AdcaRegs.ADCINTOVFCLR.All=15;//清除 ADCAINTOVFCLR1-4
EPwm1Regs.ETCLR.ALL =5;//清除 EPWM1 INT、ADCA
EALLOW;
PieVectTable.EPWM1_INT =&epwm1_timer_ISR;
EPwm1Regs.TZCLR.bit.OST = 1;//启用 ePWM1A 和 ePWM1B 引脚输出
EPwm2Regs.TZCLR.bit.OST = 1;//启用 ePWM2A 和 ePWM2B 引脚输出
EPwm3Regs.TZCLR.bit.OST = 1;//启用 ePWM1A 和 ePWM3B 引脚输出
EPwm6Regs.TZCLR.bit.OST = 1;//启用 ePWM6A
EDIS;
EPwm1Regs.ETSEL.ALL =0x909;// SOCA 当 TBCTR =TBPRD 时、启用下溢
}
EPwm1Regs.CMPA.bit.CMPA、EPwm2Regs.CMPA.bit.CMPA 和 EPwm3Regs.CMPA.bit.CMPA 的值在 Cla1Task1中计算和设置(void)、而 SVPWM 波在 ePWMxA/B 中输出(x=1/2/3)。
调用以下函数来停止 PWM 输出:
void LPinPWM123 (void)//强制 ePWM1/2/3输出为低电平
{EALLOW;
EPwm1Regs.TZCTL.ALL =10;//设置触发区信号会将 ePWM1A/B 引脚输出清零为低电平
EPwm2Regs.TZCTL.ALL =10;//设置触发区信号会将 ePWM1A/B 引脚输出清零为低电平
EPwm3Regs.TZCTL.ALL =10;//设置触发区信号会将 ePWM1A/B 引脚输出清零为低电平
EPwm6Regs.TZCTL.ALL =2;//设置触发区信号会将 ePWM1A/B 引脚输出清零为低电平
EPwm1Regs.TZFRC.bit.OST = 1;//强制 ePWM1A 和 ePWM1B 引脚输出低电平
EPwm2Regs.TZFRC.bit.OST = 1;//强制 ePWM2A 和 ePWM2B 引脚输出低电平
EPwm3Regs.TZFRC.bit.OST = 1;//强制 ePWM1A 和 ePWM3B 引脚输出低电平
EPwm3Regs.TZFRC.bit.OST = 1;//强制 ePWM6A 输出为低电平
EDIS;
}
调用上述函数来启动和停止 PWM 输出大约3~7 μ s 次(PWM 模块正常运行)、然后启动 PWM 输出、而不管 EPwmxRegs.CMPA.bit.CMPA、ePWMxA/B (x=1/2/3)输出高电阻的值同时、 或者同时输出高电平、ePWM6A 始终为高电阻或高电平。 原因是什么?
我们认为可能的原因是程序中有一个超出范围的指针写入操作、并且 EPwmxRegs.TZCTL 或 EPwmxRegs.TBCTL 寄存器被错误地修改。 我们仔细检查了所有代码、没有发现任何此类情况。