Tool/software:
Hello everyone. I have a question and sincerely hope you can help me solve it.I configured the DPWM1 in the following way, operating it in normal mode. I checked the DPWMFILTERDUTYREAD register, which is a constant value, so the waveform should remain unchanged. However, the following situation occurred.
void init_dpwm1(void) // DPWM1B is used to drive 1st phase { Dpwm1Regs.DPWMCTRL0.bit.PWM_EN = 0; //disable everything Dpwm1Regs.DPWMCTRL1.bit.GPIO_A_EN = 1; //turn off DPWM1A for now Dpwm1Regs.DPWMCTRL1.bit.GPIO_B_EN = 1; //turn off DPWM1B for now // Enable Current Limit and Set min duty cycle to verify. Dpwm1Regs.DPWMCTRL0.bit.CBC_PWM_AB_EN = 1; // Enable cycle by cycle current limit. Dpwm1Regs.DPWMCTRL0.bit.CBC_ADV_CNT_EN=1; //normal model 下配合CBC_PWM_AB_EN一起开启CBC Dpwm1Regs.DPWMCTRL0.bit.BLANK_B_EN = 1; // Enable blanking so we can see a min pulse for curr lim, Dpwm1Regs.DPWMCTRL0.bit.BLANK_A_EN = 1; // Enable blanking so we can see a min pulse for curr lim,避免误触发CBC电流 Dpwm1Regs.DPWMBLKBBEG.all = ((SWITCH_FREQ_NUMERATOR/switching_frequency) << 4)-1280;//消隐开始时间 Dpwm1Regs.DPWMBLKBEND.all = ((SWITCH_FREQ_NUMERATOR/switching_frequency) << 4);//消隐结束时间,给B通道配置了一个大约0.32us的消隐时间 Dpwm1Regs.DPWMBLKABEG.all = 0;//消隐开始时间 Dpwm1Regs.DPWMBLKAEND.all = 0x0500;//消隐结束时间,给A通道配置了一个大约0.32us的消隐时间 Dpwm1Regs.DPWMFLTCTRL.bit.B_MAX_COUNT = 2;//故障B计数,设置在断言故障之前在故障B输入上接收到的顺序故障数 Dpwm1Regs.DPWMFLTCTRL.bit.A_MAX_COUNT = 2;//故障A计数,设置在断言故障之前在故障A输入上接收到的顺序故障数 Dpwm1Regs.DPWMFLTCTRL.bit.ALL_FAULT_EN = 1; //enable this for OVP,允许故障保护 Dpwm1Regs.DPWMCTRL2.bit.SAMPLE_TRIG1_MODE = 1;//启用adaptive sample teigger B,实现平均电流模式采样 Dpwm1Regs.DPWMCTRL2.bit.SAMPLE_TRIG_1_EN = 1; //enable sample trigger1,开启1触发器,在前端EADC中应用 #if(PFC_TYPE == INTERLEAVED)//if this is interleaved PFC Dpwm1Regs.DPWMCTRL0.bit.PWM_MODE = 3; //triangular mode // Dpwm1Regs.DPWMCTRL2.bit.SAMPLE_TRIG1_OVERSAMPLE = 0; //NO oversampling. Dpwm1Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 0; //update right away #elif(PFC_TYPE == BRIDGELESS)//if this is bridgeless PFC Dpwm1Regs.DPWMCTRL0.bit.PWM_MODE = 3; //triangular mode // Dpwm1Regs.DPWMCTRL2.bit.SAMPLE_TRIG1_OVERSAMPLE = 0; //NO oversampling. Dpwm1Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 0; //update right away #else //single phase #if ((UCD3138A==1)||(UCD3138064A==1)||(UCD3138A64A==1)||(UCD3138128A==1)||(UCD3138A64==1)||(UCD3138128==1)) Dpwm1Regs.DPWMEV1.all = 132*4; //aviod 132ns events update window Dpwm1Regs.DPWMEV3.all = 132*4; //aviod 132ns events update window #else //non A version Dpwm1Regs.DPWMEV1.all = 2000;//周期开始后的500ns为A的上升沿,500ns的死区时间 Dpwm1Regs.DPWMEV2.all = 0;//500ns的死区时间 Dpwm1Regs.DPWMEV3.all = 2000;//DPWMEV3-DPWMEV2为AB的死区时间 Dpwm1Regs.DPWMEV4.all = ((SWITCH_FREQ_NUMERATOR/switching_frequency) << 4);//距离周期还有500ns时为B下降沿 #endif //((UCD3138A==1)||(UCD3138064A==1)||(UCD3138A64A==1)||(UCD3138128A==1)) Dpwm1Regs.DPWMCTRL0.bit.PWM_MODE = 0; //Normal Mode // Dpwm1Regs.DPWMCTRL2.bit.SAMPLE_TRIG1_OVERSAMPLE = 3; //8X oversampling. //Dpwm1Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 0; //update right away Dpwm1Regs.DPWMCTRL1.bit.EVENT_UP_SEL = 1; //update at end of period #endif Dpwm1Regs.DPWMCTRL0.bit.CLA_EN = 1;//闭环 Dpwm1Regs.DPWMCTRL0.bit.PWM_EN = 1; //enable OK here, because nothing will happen until DPWM and front end are globally enabled }
There will be an abnormal cycle between two normal cycles.Could this have anything to do with CBC? Because it always follows a normal cycle with an abnormal one.