Dear team:
One of my customers uses six step commutation method to control BLDC, but the first pulse of each commutation is not controlled, which is quite different from the comparison value set by him, resulting in excessive current.
The following are the waveforms and PWM program:
Sometimes the first pulse width is different:
Sometimes, the following superposition will appear:
PWM configuration:
\ EALLOW; \ SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; \ EDIS; \ \ /* Init Timer-Base Period Register for EPWM1-EPWM3*/ \ EPwm1Regs.TBPRD = v.PWMprd; \ EPwm2Regs.TBPRD = v.PWMprd; \ EPwm3Regs.TBPRD = v.PWMprd; \ \ /* Init Timer-Base Counter Register for EPWM1-EPWM3*/ \ EPwm1Regs.TBCTR = 0x0000; \ EPwm2Regs.TBCTR = 0x0000; \ EPwm3Regs.TBCTR = 0x0000; \ \ /* Init Compare Register for EPWM1-EPWM3 to 50% duty cycle */ \ EPwm1Regs.CMPA.half.CMPA = v.PWMprd/2; \ EPwm2Regs.CMPA.half.CMPA = v.PWMprd/2; \ EPwm3Regs.CMPA.half.CMPA = v.PWMprd/2; \ \ /* Init Timer-Base Phase Register for EPWM1-EPWM3*/ \ EPwm1Regs.TBPHS.half.TBPHS = 0; \ EPwm2Regs.TBPHS.half.TBPHS = 0; \ EPwm3Regs.TBPHS.half.TBPHS = 0; \ \ /* Init Timer-Base Control Register for EPWM1-EPWM3*/ \ EPwm1Regs.TBCTL.all = PWM_CNTL_INIT_STATE; \ EPwm2Regs.TBCTL.all = PWM_CNTL_INIT_STATE; \ EPwm3Regs.TBCTL.all = PWM_CNTL_INIT_STATE; \ \ /* Setup Sync*/ \ EPwm3Regs.TBCTL.bit.SYNCOSEL = 1; \ EPwm2Regs.TBCTL.bit.SYNCOSEL = 0; \ EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; \ \ /* Allow each timer to be sync'ed*/ \ EPwm3Regs.TBCTL.bit.PHSEN = 0; \ EPwm2Regs.TBCTL.bit.PHSEN = 1; \ EPwm1Regs.TBCTL.bit.PHSEN = 1; \ \ /* Set count dir after sync event*/ \ EPwm3Regs.TBCTL.bit.PHSDIR = 0; \ EPwm2Regs.TBCTL.bit.PHSDIR = 1; \ EPwm1Regs.TBCTL.bit.PHSDIR = 1; \ \ /* Init Compare Control Register for EPWM1-EPWM3 */ \ EPwm1Regs.CMPCTL.all = BLDCPWM_CMPCTL_INIT_STATE; \ EPwm2Regs.CMPCTL.all = BLDCPWM_CMPCTL_INIT_STATE; \ EPwm3Regs.CMPCTL.all = BLDCPWM_CMPCTL_INIT_STATE; \ \ /* Init Action Qualifier Output A Register for EPWM1-EPWM3*/ \ EPwm1Regs.AQCTLA.all = PWM_CNTL_AQCTLA_INIT_STATE_4; \ EPwm2Regs.AQCTLA.all = PWM_CNTL_AQCTLA_INIT_STATE_4; \ EPwm3Regs.AQCTLA.all = PWM_CNTL_AQCTLA_INIT_STATE_4; \ \ /* Init Dead-Band Generator Control Register for EPWM1-EPWM3*/ \ EPwm1Regs.DBCTL.all = DBCTL_INIT_STATE; \ EPwm2Regs.DBCTL.all = DBCTL_INIT_STATE; \ EPwm3Regs.DBCTL.all = DBCTL_INIT_STATE; \ \ /* Init Dead-Band Generator for EPWM1-EPWM3*/ \ EPwm1Regs.DBFED = DBCNT_INIT_STATE; \ EPwm1Regs.DBRED = DBCNT_INIT_STATE; \ EPwm2Regs.DBFED = DBCNT_INIT_STATE; \ EPwm2Regs.DBRED = DBCNT_INIT_STATE; \ EPwm3Regs.DBFED = DBCNT_INIT_STATE; \ EPwm3Regs.DBRED = DBCNT_INIT_STATE; \ \ /* Init PWM Chopper Control Register for EPWM1-EPWM3*/ \ EPwm1Regs.PCCTL.all = BLDCPWM_PCCTL_INIT_STATE; \ EPwm2Regs.PCCTL.all = BLDCPWM_PCCTL_INIT_STATE; \ EPwm3Regs.PCCTL.all = BLDCPWM_PCCTL_INIT_STATE; \ \ \ 其中 #define PWM_CNTL_INIT_STATE ( FREE_RUN_FLAG + \ PRDLD_SHADOW + \ TIMER_CNT_UPDN + \ HSPCLKDIV_PRESCALE_X_1 + \ CLKDIV_PRESCALE_X_1 + \ PHSDIR_CNT_UP + \ CNTLD_DISABLE ) #define BLDCPWM_CMPCTL_INIT_STATE ( LOADAMODE_ZRO + \ LOADBMODE_ZRO + \ SHDWAMODE_IMMEDIATE + \ SHDWBMODE_IMMEDIATE ) #define PWM_CNTL_AQCTLA_INIT_STATE_4 ( PRD_SET + CAU_CLEAR ) #define DBCTL_INIT_STATE (BP_ENABLE + POLSEL_ACTIVE_HI_CMP) #define BLDCPWM_PCCTL_INIT_STATE CHPEN_DISABLE 换向部分函数: #define MOD6CNTDIR_MACRO(v) \ \ if (v.TrigInput > 0) \ { \ if(v.Counter == 5) \ { \ v.Counter = 0; \ data=data+1; \ datasa=1; \ EPwm1Regs.TBCTR = 3000; \ EPwm2Regs.TBCTR = 3000; \ EPwm3Regs.TBCTR = 3000; \ } \ else \ { \ v.Counter++; \ EPwm1Regs.TBCTR = 3000; \ EPwm2Regs.TBCTR = 3000; \ EPwm3Regs.TBCTR = 3000; \ } \ }