This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好,
我采用cap中断采集HALL信号进行换向。配置如下
PWM配置
void InitEPwm1Initialize(void)
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
EPwm1Regs.TBSTS.all=0;
EPwm2Regs.TBSTS.all=0;
EPwm3Regs.TBSTS.all=0;
EPwm1Regs.TBPHS.half.TBPHS=0;
EPwm2Regs.TBPHS.half.TBPHS=0;
EPwm3Regs.TBPHS.half.TBPHS=0;
EPwm1Regs.TBCTR=0;
EPwm2Regs.TBCTR=0;
EPwm3Regs.TBCTR=0;
EPwm1Regs.CMPCTL.all=0x50; // Immediate mode for CMPA and CMPB
EPwm2Regs.CMPCTL.all=0x50;
EPwm3Regs.CMPCTL.all=0x50;
EPwm1Regs.AQCTLA.all=0; // EPWMxA = 1 when CTR=CMPA and counter inc
// EPWMxA = 0 when CTR=CMPA and counter dec
EPwm1Regs.AQCTLB.all=0;
EPwm1Regs.AQSFRC.all=0;
EPwm1Regs.AQCSFRC.all=0;
EPwm2Regs.AQCTLA.all=0; // EPWMxA = 1 when CTR=CMPA and counter inc
// EPWMxA = 0 when CTR=CMPA and counter dec
EPwm2Regs.AQCTLB.all=0;
EPwm2Regs.AQSFRC.all=0;
EPwm2Regs.AQCSFRC.all=0;
EPwm3Regs.AQCTLA.all=0; // EPWMxA = 1 when CTR=CMPA and counter inc
// EPWMxA = 0 when CTR=CMPA and counter dec
EPwm3Regs.AQCTLB.all=0;
EPwm3Regs.AQSFRC.all=0;
EPwm3Regs.AQCSFRC.all=0;
EPwm1Regs.DBCTL.all=0x0; // EPWMxB is EPWMxA's
EPwm2Regs.DBCTL.all=0x0;
EPwm3Regs.DBCTL.all=0x0;
EPwm1Regs.DBRED=0;
EPwm2Regs.DBRED=0;
EPwm3Regs.DBRED=0;
EPwm1Regs.DBFED=0;
EPwm2Regs.DBFED=0;
EPwm3Regs.DBFED=0;
EPwm1Regs.TZSEL.all=0;
EPwm2Regs.TZSEL.all=0;
EPwm3Regs.TZSEL.all=0;
EPwm1Regs.TZCTL.all=0;
EPwm2Regs.TZCTL.all=0;
EPwm3Regs.TZCTL.all=0;
EPwm1Regs.TZEINT.all=0;
EPwm2Regs.TZEINT.all=0;
EPwm3Regs.TZEINT.all=0;
EPwm1Regs.TZFLG.all=0;
EPwm2Regs.TZFLG.all=0;
EPwm3Regs.TZFLG.all=0;
EPwm1Regs.TZCLR.all=0;
EPwm2Regs.TZCLR.all=0;
EPwm3Regs.TZCLR.all=0;
EPwm1Regs.TZFRC.all=0;
EPwm2Regs.TZFRC.all=0;
EPwm3Regs.TZFRC.all=0;
EPwm1Regs.ETSEL.all = 0; // Enable SOC on A group
EPwm2Regs.ETSEL.all=0;
EPwm3Regs.ETSEL.all=0;
EPwm1Regs.ETFLG.all=0;
EPwm2Regs.ETFLG.all=0;
EPwm3Regs.ETFLG.all=0;
EPwm1Regs.ETCLR.all=0;
EPwm2Regs.ETCLR.all=0;
EPwm3Regs.ETCLR.all=0;
EPwm1Regs.ETFRC.all=0;
EPwm2Regs.ETFRC.all=0;
EPwm3Regs.ETFRC.all=0;
EPwm1Regs.PCCTL.all=0;
EPwm2Regs.PCCTL.all=0;
EPwm3Regs.PCCTL.all=0;
EPwm1Regs.TBCTL.all=0x010; // Enable Timer
EPwm2Regs.TBCTL.all=0x010;
EPwm3Regs.TBCTL.all=0x0010;
EPwm1Regs.TBPRD=7500;
EPwm2Regs.TBPRD=7500;
EPwm3Regs.TBPRD=7500;
EPwm1Regs.CMPA.half.CMPA =0;
EPwm2Regs.CMPA.half.CMPA =0;
EPwm3Regs.CMPA.half.CMPA =0;
EPwm1Regs.CMPB=0;
EPwm2Regs.CMPB=0;
EPwm3Regs.CMPB=0;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
}
CAP配置
void InitECapture4(void)
{
EALLOW;
//ECAP4配置外部寄存器
ECap4Regs.ECEINT.all = 0x0000; // Disable all capture interrupts禁止所有捕捉中断
ECap4Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags清除所有CAP中断标志位
ECap4Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads禁止CAP1-CAP4寄存器装载
ECap4Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped确保计数器停止
// Configure peripheral registers配置外部寄存器
ECap4Regs.ECCTL2.bit.CAP_APWM = 0; // ECAP模式,另一种模式是APWM
ECap4Regs.ECCTL2.bit.CONT_ONESHT = 1; // 单次模式
ECap4Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 1 events
//ECap2Regs.ECCTL2.bit.STOP_WRAP = 3; // Stop at 4 events
ECap4Regs.ECCTL1.bit.CAP1POL = 0; // 默认上升沿触发
// ECap4Regs.ECCTL1.bit.CAP2POL = 1; // 下降沿触发
//ECap2Regs.ECCTL1.bit.CAP3POL = 1; // Falling edge
// ECap2Regs.ECCTL1.bit.CAP4POL = 0; // Rising edge
ECap4Regs.ECCTL1.bit.CTRRST1 = 0; // Difference operation 差分模式下
// ECap4Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation
//ECap2Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation
//ECap2Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation
ECap4Regs.ECCTL2.bit.SYNCI_EN = 0; // disable sync in禁止内部同步选择
ECap4Regs.ECCTL2.bit.SYNCO_SEL = 2; // Pass through禁止外部同步选择
ECap4Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units使能CAP1~CAP4寄存器加载
ECap4Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter开始计数
ECap4Regs.ECCTL2.bit.REARM = 1; // arm one-shot单次强制
ECap4Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
ECap4Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt
// ECap4Regs.ECEINT.bit.CEVT2 = 1; // 2 events = interrupt
EDIS;
}
void InitECapture5(void)
{
EALLOW;
//ECAP3配置外部寄存器
ECap5Regs.ECEINT.all = 0x0000; // Disable all capture interrupts禁止所有捕捉中断
ECap5Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags清除所有CAP中断标志位
ECap5Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads禁止CAP1-CAP4寄存器装载
ECap5Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped确保计数器停止
// Configure peripheral registers配置外部寄存器
ECap5Regs.ECCTL2.bit.CAP_APWM = 0; // ECAP模式,另一种模式是APWM
ECap5Regs.ECCTL2.bit.CONT_ONESHT = 1; // 单次模式
ECap5Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 1 events
//ECap3Regs.ECCTL2.bit.STOP_WRAP = 3; // Stop at 4 events
ECap5Regs.ECCTL1.bit.CAP1POL = 0; // 默认上升沿触发
// ECap5Regs.ECCTL1.bit.CAP2POL = 1; // 下降沿触发
//ECap3Regs.ECCTL1.bit.CAP3POL = 1; // Falling edge
// ECap3Regs.ECCTL1.bit.CAP4POL = 0; // Rising edge
ECap5Regs.ECCTL1.bit.CTRRST1 = 0; // Difference operation 差分模式下
// ECap5Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation
//ECap3Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation
//ECap3Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation
ECap5Regs.ECCTL2.bit.SYNCI_EN = 0; // disable sync in禁止内部同步选择
ECap5Regs.ECCTL2.bit.SYNCO_SEL = 2; // Pass through禁止外部同步选择
ECap5Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units使能CAP1~CAP4寄存器加载
ECap5Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter开始计数
ECap5Regs.ECCTL2.bit.REARM = 1; // arm one-shot单次强制
ECap5Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
ECap5Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt
// ECap5Regs.ECEINT.bit.CEVT2 = 1; // 2 events = interrupt
}
void InitECapture6(void)
{//ECAP4配置外部寄存器
ECap6Regs.ECEINT.all = 0x0000; // Disable all capture interrupts禁止所有捕捉中断
ECap6Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags清除所有CAP中断标志位
ECap6Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads禁止CAP1-CAP4寄存器装载
ECap6Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped确保计数器停止
// Configure peripheral registers配置外部寄存器
ECap6Regs.ECCTL2.bit.CAP_APWM = 0; // ECAP模式,另一种模式是APWM
ECap6Regs.ECCTL2.bit.CONT_ONESHT = 1; // 单次模式
ECap6Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at1 events
//ECap4Regs.ECCTL2.bit.STOP_WRAP = 3; // Stop at 4 events
ECap6Regs.ECCTL1.bit.CAP1POL = 0; // 默认上升沿触发
// ECap6Regs.ECCTL1.bit.CAP2POL = 1; // 下降沿触发
//ECap4Regs.ECCTL1.bit.CAP3POL = 1; // Falling edge
// ECap4Regs.ECCTL1.bit.CAP4POL = 0; // Rising edge
ECap6Regs.ECCTL1.bit.CTRRST1 = 0; // Difference operation 差分模式下
// ECap6Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation
//ECap4Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation
//ECap4Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation
ECap6Regs.ECCTL2.bit.SYNCI_EN = 0; // disable sync in禁止内部同步选择
ECap6Regs.ECCTL2.bit.SYNCO_SEL = 2; // Pass through禁止外部同步选择
ECap6Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units使能CAP1~CAP4寄存器加载
ECap6Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter开始计数
ECap6Regs.ECCTL2.bit.REARM = 1; // arm one-shot单次强制
ECap6Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
ECap6Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt
// ECap6Regs.ECEINT.bit.CEVT2 = 1; // 2 events = interrupt
}
void InitlowECapture4(void)
{
EALLOW;
//ECAP4配置外部寄存器
ECap4Regs.ECEINT.all = 0x0000; // Disable all capture interrupts禁止所有捕捉中断
ECap4Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags清除所有CAP中断标志位
ECap4Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads禁止CAP1-CAP4寄存器装载
ECap4Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped确保计数器停止
// Configure peripheral registers配置外部寄存器
ECap4Regs.ECCTL2.bit.CAP_APWM = 0; // ECAP模式,另一种模式是APWM
ECap4Regs.ECCTL2.bit.CONT_ONESHT = 1; // 单次模式
ECap4Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 1 events
//ECap2Regs.ECCTL2.bit.STOP_WRAP = 3; // Stop at 4 events
ECap4Regs.ECCTL1.bit.CAP1POL = 1; // 默认下降沿触发
// ECap4Regs.ECCTL1.bit.CAP2POL = 1; // 下降沿触发
//ECap2Regs.ECCTL1.bit.CAP3POL = 1; // Falling edge
// ECap2Regs.ECCTL1.bit.CAP4POL = 0; // Rising edge
ECap4Regs.ECCTL1.bit.CTRRST1 = 0; // Difference operation 差分模式下
// ECap4Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation
//ECap2Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation
//ECap2Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation
ECap4Regs.ECCTL2.bit.SYNCI_EN = 0; // disable sync in禁止内部同步选择
ECap4Regs.ECCTL2.bit.SYNCO_SEL = 2; // Pass through禁止外部同步选择
ECap4Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units使能CAP1~CAP4寄存器加载
ECap4Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter开始计数
ECap4Regs.ECCTL2.bit.REARM = 1; // arm one-shot单次强制
ECap4Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
ECap4Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt
// ECap4Regs.ECEINT.bit.CEVT2 = 1; // 2 events = interrupt
EDIS;
}
void InitlowECapture5(void)
{
EALLOW;
//ECAP3配置外部寄存器
ECap5Regs.ECEINT.all = 0x0000; // Disable all capture interrupts禁止所有捕捉中断
ECap5Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags清除所有CAP中断标志位
ECap5Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads禁止CAP1-CAP4寄存器装载
ECap5Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped确保计数器停止
// Configure peripheral registers配置外部寄存器
ECap5Regs.ECCTL2.bit.CAP_APWM = 0; // ECAP模式,另一种模式是APWM
ECap5Regs.ECCTL2.bit.CONT_ONESHT = 1; // 单次模式
ECap5Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 1 events
//ECap3Regs.ECCTL2.bit.STOP_WRAP = 3; // Stop at 4 events
ECap5Regs.ECCTL1.bit.CAP1POL = 1; // 默认下降沿触发
// ECap5Regs.ECCTL1.bit.CAP2POL = 1; // 下降沿触发
//ECap3Regs.ECCTL1.bit.CAP3POL = 1; // Falling edge
// ECap3Regs.ECCTL1.bit.CAP4POL = 0; // Rising edge
ECap5Regs.ECCTL1.bit.CTRRST1 = 0; // Difference operation 差分模式下
// ECap5Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation
//ECap3Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation
//ECap3Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation
ECap5Regs.ECCTL2.bit.SYNCI_EN = 0; // disable sync in禁止内部同步选择
ECap5Regs.ECCTL2.bit.SYNCO_SEL = 2; // Pass through禁止外部同步选择
ECap5Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units使能CAP1~CAP4寄存器加载
ECap5Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter开始计数
ECap5Regs.ECCTL2.bit.REARM = 1; // arm one-shot单次强制
ECap5Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
ECap5Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt
// ECap5Regs.ECEINT.bit.CEVT2 = 1; // 2 events = interrupt
}
void InitlowECapture6(void)
{//ECAP4配置外部寄存器
ECap6Regs.ECEINT.all = 0x0000; // Disable all capture interrupts禁止所有捕捉中断
ECap6Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags清除所有CAP中断标志位
ECap6Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads禁止CAP1-CAP4寄存器装载
ECap6Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped确保计数器停止
// Configure peripheral registers配置外部寄存器
ECap6Regs.ECCTL2.bit.CAP_APWM = 0; // ECAP模式,另一种模式是APWM
ECap6Regs.ECCTL2.bit.CONT_ONESHT = 1; // 单次模式
ECap6Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at1 events
//ECap4Regs.ECCTL2.bit.STOP_WRAP = 3; // Stop at 4 events
ECap6Regs.ECCTL1.bit.CAP1POL = 1; // 默认下降沿触发
// ECap6Regs.ECCTL1.bit.CAP2POL = 1; // 下降沿触发
//ECap4Regs.ECCTL1.bit.CAP3POL = 1; // Falling edge
// ECap4Regs.ECCTL1.bit.CAP4POL = 0; // Rising edge
ECap6Regs.ECCTL1.bit.CTRRST1 = 0; // Difference operation 差分模式下
// ECap4Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation
//ECap4Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation
//ECap4Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation
ECap6Regs.ECCTL2.bit.SYNCI_EN = 0; // disable sync in禁止内部同步选择
ECap6Regs.ECCTL2.bit.SYNCO_SEL = 2; // Pass through禁止外部同步选择
ECap6Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units使能CAP1~CAP4寄存器加载
ECap6Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter开始计数
ECap6Regs.ECCTL2.bit.REARM = 1; // arm one-shot单次强制
ECap6Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
ECap6Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt
// ECap6Regs.ECEINT.bit.CEVT2 = 1; // 2 events = interrupt
}
Cap中断
interrupt void ECAP4_INT_ISR(void)
{
Getcap();
INT_FLAG=1;
SetPWM();
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; /*响应同组其他中断*/
ECap4Regs.ECCLR.all=0xFFFF; /*clare all flag*/
ECap4Regs.ECCTL2.bit.REARM = 1; /*则该ECAP口可以继续响应下一次中断*/
}
interrupt void ECAP5_INT_ISR(void)
{
Getcap();
INT_FLAG=1;
SetPWM();
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; /*响应同组其他中断*/
ECap5Regs.ECCLR.all=0xFFFF; /*clare all flag*/
ECap5Regs.ECCTL2.bit.REARM = 1; /*则该ECAP口可以继续响应下一次中断*/
}
interrupt void ECAP6_INT_ISR(void)
{
Getcap();
INT_FLAG=1;
SetPWM();
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; /*响应同组其他中断*/
ECap6Regs.ECCLR.all = 0xFFFF; /*clare all flag*/
ECap6Regs.ECCTL2.bit.REARM = 1; /*则该ECAP口可以继续响应下一次中断*/
}
获取hall信号函数和设置PWM函数
void Getcap(void)
{
actHallCode1 = GpioDataRegs.GPADAT.bit.GPIO27&0x01;
actHallCode2 = GpioDataRegs.GPBDAT.bit.GPIO48&0x01;
actHallCode3 = GpioDataRegs.GPBDAT.bit.GPIO49&0x01;
CAP = (Uint16)((Uint16)(actHallCode1)+(Uint16)(actHallCode2 << 1)+(Uint16)(actHallCode3 << 2));
if(actHallCode1==1)
{
InitlowECapture4(); // 默认下降沿触发
}
else
{
InitECapture4(); // 默认上升沿触发
}
if(actHallCode2==1)
{
InitlowECapture5(); // 默认下降沿触发
}
else
{
InitECapture5(); // 默认上升沿触发
}
if(actHallCode3==1)
{
InitlowECapture6(); // 默认下降沿触发
}
else
{
InitECapture6(); // 默认上升沿触发
}
}
void SetPWM(void)
{
if (MotorEnable==0)
{
if(DIR==0) {
switch(CAP)
{
case 1: /*编码为001,H3下降沿V1(IN2)、V6(EN3)*/
{
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
/*动作限定控制A虰*/
EPwm1Regs.AQCTLA.all=0x18; /*/A+V1*/
EPwm1Regs.AQCSFRC.all=0x4;
EPwm2Regs.AQCSFRC.all=0x05;
EPwm3Regs.AQCSFRC.all=0x1;
EPwm3Regs.AQCTLB.all=0x0108;/*/C-V6*/
}break; /*使流程跳出switch结构,终止switch语句的执行*/
case 2: /*编码为010,H1下降沿V2(IN1)、V3(EN2)*/
{
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
/*动作限定控制A和B*/
EPwm1Regs.AQCSFRC.all=0x1;
EPwm1Regs.AQCTLB.all=0x0108; //A-/*V2*/
EPwm2Regs.AQCTLA.all=0x18; //B+/*V3*/
EPwm2Regs.AQCSFRC.all=0x4;
EPwm3Regs.AQCSFRC.all=0x05;/*V6*/
}break;
case 3: /*编码为011,H2上升沿V3(IN2)、V6(EN1)*/
{
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
/*动作限定控制A和B*/
EPwm1Regs.AQCSFRC.all=0x05;
EPwm2Regs.AQCTLA.all=0x18; //B+/*V3*/
EPwm2Regs.AQCSFRC.all=0x4;
EPwm3Regs.AQCSFRC.all=0x1;
EPwm3Regs.AQCTLB.all=0x0108; //C-/*V6*/
}break;
case 4: /*编码为100,H2下降沿V4(IN3)、V5(EN1)*/
{
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
/*动作限定控制A和B*/
EPwm1Regs.AQCSFRC.all=0x05;
EPwm2Regs.AQCSFRC.all=0x1;
EPwm2Regs.AQCTLB.all=0x0108; //B-/*V4*/
EPwm3Regs.AQCTLA.all=0x18; //C+/*V5*/
EPwm3Regs.AQCSFRC.all=0x4;
}break;
case 5: /*编码为101,H1上升沿V1(IN3)、V4(EN2)*/
{ EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
/*动作限定控制A和B*/
EPwm1Regs.AQCTLA.all=0x18; //A+/*V1*/
EPwm1Regs.AQCSFRC.all=0x4;
EPwm2Regs.AQCSFRC.all=0x1;
EPwm2Regs.AQCTLB.all=0x0108; //B-/*V4*/
EPwm3Regs.AQCSFRC.all=0x05;
}break;
case 6: /*V1,对应的是CMPA,0x18CMPB对应0x0108*//*CAP321编码为110,H3上升沿V2(IN1)、V5(EN3)导通*/
{
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
/*动作限定控制A和B*/
EPwm1Regs.AQCSFRC.all=0x1;
EPwm1Regs.AQCTLB.all=0x0108; /*/A-V2*/
EPwm2Regs.AQCSFRC.all=0x05;
EPwm3Regs.AQCTLA.all=0x18; /*/C+V5*/
EPwm3Regs.AQCSFRC.all=0x4;
}break;
default:
{
EPwm1Regs.CMPA.half.CMPA = 0; /*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB =0; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA =0; /*PWM3*/
EPwm2Regs.CMPB = 0; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = 0; /*PWM5*/
EPwm3Regs.CMPB = 0; /*Pwm6*/
EPwm1Regs.AQCSFRC.all=0x5;/*强制低*/
EPwm2Regs.AQCSFRC.all=0x5;/*强制低*/
EPwm3Regs.AQCSFRC.all=0x5;/*强制低*/
}
break;
}
}
else if(DIR==1) /*1电机为逆时针,舵轴为顺时针*/
{
switch(CAP)
{
case 1: /*编码为001,H3下降沿V2(IN2)、V5(EN3)*/
{
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
/*动作限定控制A和B*/
EPwm1Regs.AQCSFRC.all=0x1;
EPwm1Regs.AQCTLB.all=0x0108; /*V2*/
EPwm2Regs.AQCSFRC.all=0x5;
EPwm3Regs.AQCTLA.all=0x18; /*V5*/
EPwm3Regs.AQCSFRC.all=0x4;
}break;
case 2: /*编码为010,H1下降沿V1(IN1)、V4(EN2)*/
{
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
/*动作限定控制A和B*/
EPwm1Regs.AQCTLA.all=0x18; /*V1*/
EPwm1Regs.AQCSFRC.all=0x4;
EPwm2Regs.AQCSFRC.all=0x1;
EPwm2Regs.AQCTLB.all=0x0108; /*V4*/
EPwm3Regs.AQCSFRC.all=0x5;/*V6*/
}break;
case 3: /*编码为011,H2上升沿V4(IN2)、V5(EN1)*/
{
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
/*动作限定控制A和B*/
EPwm1Regs.AQCSFRC.all=0x05;
EPwm2Regs.AQCSFRC.all=0x1;
EPwm2Regs.AQCTLB.all=0x0108; /*V4*/
EPwm3Regs.AQCTLA.all=0x18; /*V5*/
EPwm3Regs.AQCSFRC.all=0x4;
}break;
case 4: /*编码为100,H2下降沿V3(IN3)、V6(EN1)*/
{
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
/*动作限定控制A和B*/
EPwm1Regs.AQCSFRC.all=0x5;
EPwm2Regs.AQCTLA.all=0x18; /*V3*/
EPwm2Regs.AQCSFRC.all=0x4;
EPwm3Regs.AQCSFRC.all=0x1;
EPwm3Regs.AQCTLB.all=0x0108; /*V6*/
}break;
case 5: /*编码为101,H1上升沿V2(IN3)、V3(EN2)*/
{
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
/*动作限定控制A和B*/
EPwm1Regs.AQCSFRC.all=0x1;
EPwm1Regs.AQCTLB.all=0x0108; /*V2*/
EPwm2Regs.AQCTLA.all=0x18; /*V3*/
EPwm2Regs.AQCSFRC.all=0x4;
EPwm3Regs.AQCSFRC.all=0x5;
}break;
case 6: /*CAP321编码为110编码001,H3上升沿V1(IN1)、V6(EN3)导通*/
{
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*//*动作限定控制A和B*/
EPwm1Regs.AQCTLA.all=0x18; /*V1*/
EPwm1Regs.AQCSFRC.all=0x4;
EPwm2Regs.AQCSFRC.all=0x05;
EPwm3Regs.AQCSFRC.all=0x1;
EPwm3Regs.AQCTLB.all=0x0108; /*V6*/
}break;
default:
{
EPwm1Regs.CMPA.half.CMPA = 0; /*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB =0; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA =0; /*PWM3*/
EPwm2Regs.CMPB = 0; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = 0; /*PWM5*/
EPwm3Regs.CMPB = 0; /*Pwm6*/
EPwm1Regs.AQCSFRC.all=0x5;/*强制低*/
EPwm2Regs.AQCSFRC.all=0x5;/*强制低*/
EPwm3Regs.AQCSFRC.all=0x5;/*强制低*/
}
break;
}
}
}
else if(MotorEnable==1)//为0表明电机没有使能,不做任何操作
{
EPwm1Regs.CMPA.half.CMPA = 0; /*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB =0; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA =0; /*PWM3*/
EPwm2Regs.CMPB = 0; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = 0; /*PWM5*/
EPwm3Regs.CMPB = 0; /*Pwm6*/
/*动作限定控制A和B*///
EPwm1Regs.AQCTLA.all=0; /*V1*/
EPwm1Regs.AQCTLB.all=0; /*V2*/
EPwm2Regs.AQCTLA.all=0; /*V3*/
EPwm2Regs.AQCTLB.all=0; /*V4*/
EPwm3Regs.AQCTLA.all=0; /*V5*/
EPwm3Regs.AQCTLB.all=0; /*V6*/
EPwm1Regs.AQCSFRC.all=0x5;/*强制低*/
EPwm2Regs.AQCSFRC.all=0x5;/*强制低*/
EPwm3Regs.AQCSFRC.all=0x5;/*强制低*/
}
}
定时器1中断
interrupt void cpu_timer1_isr(void)
{
actPWMCode=200
if(Encoder_angle_Actuatorspeed == 0)
{
Getcap();
SetPWM();
}
EPwm1Regs.CMPA.half.CMPA = actPWMCode;/*PWM1为第一路PWM输出*/
EPwm1Regs.CMPB = actPWMCode; /*Pwm2*/
EPwm2Regs.CMPA.half.CMPA = actPWMCode; /*PWM3*/
EPwm2Regs.CMPB = actPWMCode; /*Pwm4*/
EPwm3Regs.CMPA.half.CMPA = actPWMCode; /*PWM5*/
EPwm3Regs.CMPB = actPWMCode; /*Pwm6*/
CpuTimer1Regs.TCR.bit.TIF=1; //*清除定时器中断标志位*/
EINT;
}
对电机进行测试,检测六路PWM输出如下,D1-D6分别代表PWM1-6,D7-D9分别代表hall1hall2hall3,问题为,红色区域,hall2变高,导通管子由v1-v6变为v3v6,可以看到D3在hall换向后没有波型,第一个PWM波没有,波形缺失,请帮忙看一下,我的配置有无问题,因为如果用CPLD作换向逻辑,hall换向后管子立刻导通,没有波形缺失,谢谢!