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.

28335cap中断捕捉hall信号实现换向,定时器1给定PWM码值,检测六路pwm,hall换向时对应PWM输出波形有缺失

您好,

我采用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换向后管子立刻导通,没有波形缺失,谢谢!

 

x 出现错误。请重试或与管理员联系。
x 出现错误。请重试或与管理员联系。