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.

TMS320F280025: 在20KHZ的中断中,每隔40ms改变pwm波的占空比从50%改为100%,但发出来的波形不稳定,缩小看是对的放大看会有高低电平一起出现的情况,并且pwm波在示波器上会来回跑,很奇怪期待解答。附上中断代码

Part Number: TMS320F280025

 if (toggle == 0) {

                // EPWM3、5配置为50%占空比,EPWM4、6配置为高电平
                EPWM_setDeadBandDelayMode(EPWM3_BASE, EPWM_DB_RED, true);
                EPWM_setDeadBandDelayMode(EPWM3_BASE, EPWM_DB_FED, true);
                EPWM_setActionQualifierContSWForceAction(EPWM3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
                EPwm3Regs.CMPA.bit.CMPA = 2500;
                EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;
                EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET;
                EPwm3Regs.AQCTLA.bit.CAD = AQ_NO_ACTION; // 递减阶段CTR=CMPA时,不执行动作
                EPwm3Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; // CTR=TBPRD时,不执行动作

                EPWM_setDeadBandDelayMode(EPWM5_BASE, EPWM_DB_RED, true);
                EPWM_setDeadBandDelayMode(EPWM5_BASE, EPWM_DB_FED, true);
                EPWM_setActionQualifierContSWForceAction(EPWM5_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
                EPwm5Regs.CMPA.bit.CMPA = 2500;
                EPwm5Regs.AQCTLA.bit.CAU = AQ_SET;
                EPwm5Regs.AQCTLA.bit.ZRO = AQ_CLEAR;
                EPwm5Regs.AQCTLA.bit.CAD = AQ_NO_ACTION; // 递减阶段CTR=CMPA时,不执行动作
                EPwm5Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; // CTR=TBPRD时,不执行动作

                // 前800中断(正半周)
                if (negative_flag) {
                    // 仅从负半周切到正半周时执行配置

                    EPWM_setDeadBandDelayMode(EPWM4_BASE, EPWM_DB_RED, false);
                    EPWM_setDeadBandDelayMode(EPWM4_BASE, EPWM_DB_FED, false);
                    EPWM_setActionQualifierContSWForceAction(EPWM4_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_OUTPUT_HIGH);

                    EPWM_setDeadBandDelayMode(EPWM6_BASE, EPWM_DB_RED, false);
                    EPWM_setDeadBandDelayMode(EPWM6_BASE, EPWM_DB_FED, false);
                    EPWM_setActionQualifierContSWForceAction(EPWM6_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_OUTPUT_HIGH);

                    negative_flag = 0;
                    positive_flag = 1;
                }
            } else {

                EPWM_setDeadBandDelayMode(EPWM4_BASE, EPWM_DB_RED, true);
                EPWM_setDeadBandDelayMode(EPWM4_BASE, EPWM_DB_FED, true);
                EPWM_setActionQualifierContSWForceAction(EPWM4_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
                EPwm4Regs.CMPA.bit.CMPA = 2500;
                EPwm4Regs.AQCTLA.bit.CAU = AQ_SET;
                EPwm4Regs.AQCTLA.bit.ZRO = AQ_CLEAR;
                EPwm4Regs.AQCTLA.bit.CAD = AQ_NO_ACTION; // 递减阶段CTR=CMPA时,不执行动作
                EPwm4Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; // CTR=TBPRD时,不执行动作

                EPWM_setDeadBandDelayMode(EPWM6_BASE, EPWM_DB_RED, true);
                EPWM_setDeadBandDelayMode(EPWM6_BASE, EPWM_DB_FED, true);
                EPWM_setActionQualifierContSWForceAction(EPWM6_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
                EPwm6Regs.CMPA.bit.CMPA = 2500;
                EPwm6Regs.AQCTLA.bit.CAU = AQ_CLEAR;
                EPwm6Regs.AQCTLA.bit.ZRO = AQ_SET;
                EPwm6Regs.AQCTLA.bit.CAD = AQ_NO_ACTION; // 递减阶段CTR=CMPA时,不执行动作
                EPwm6Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; // CTR=TBPRD时,不执行动作


                // 后800中断(负半周)
                if (positive_flag) {
                    // 仅从正半周切到负半周时执行配置
                    // EPWM3、5配置为高电平,EPWM4、6配置为50%占空比
                    EPWM_setDeadBandDelayMode(EPWM3_BASE, EPWM_DB_RED, false);
                    EPWM_setDeadBandDelayMode(EPWM3_BASE, EPWM_DB_FED, false);
                    EPWM_setActionQualifierContSWForceAction(EPWM3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_OUTPUT_HIGH);

                    EPWM_setDeadBandDelayMode(EPWM5_BASE, EPWM_DB_RED, false);
                    EPWM_setDeadBandDelayMode(EPWM5_BASE, EPWM_DB_FED, false);
                    EPWM_setActionQualifierContSWForceAction(EPWM5_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_OUTPUT_HIGH);


                    positive_flag = 0;
                    negative_flag = 1;
                }
            }