MSPM0L1306: 在生成spwm波形时,某个周期占功比异常

Part Number: MSPM0L1306

在使用MSPM0L106开发时,通过pwm来生成20khz的spwm时,在占功比降低的过程中总是会出现占功比异常,我有4个pwm一个使用pwm对称来实现的50hz互补的pwm,另外两个pwm在互补的pwm上升时开始。下面是我的代码

#include "ti_msp_dl_config.h"

uint16_t g_sine_table[194] = {
      0,26,52,78,104,130,156,181,207,233,259,284,310,336,361,386,
      412,437,462,486,511,536,560,585,609,633,657,680,704,727,750,773,
      796,818,840,863,884,906,927,948,969,990,1010,1030,1050,1069,1089,1108,
      1126,1145,1163,1180,1198,1215,1232,1248,1264,1280,1295,1311,1325,1340,1354,1367,
      1381,1394,1406,1419,1430,1442,1453,1464,1474,1484,1493,1503,1511,1520,1527,1535,
      1542,1549,1555,1561,1566,1572,1576,1580,1584,1588,1591,1593,1595,1597,1598,1599,
      1599,1599,1599,1598,1597,1595,1593,1591,1588,1584,1580,1576,1572,1566,1561,1555,
      1549,1542,1535,1527,1520,1511,1503,1493,1484,1474,1464,1453,1442,1430,1419,1406,
      1394,1381,1367,1354,1340,1325,1311,1295,1280,1264,1248,1232,1215,1198,1180,1163,
      1145,1126,1108,1089,1069,1050,1030,1010,990,969,948,927,906,884,863,840,
      818,796,773,750,727,704,680,657,633,609,585,560,536,511,486,462,
      437,412,386,361,336,310,284,259,233,207,181,156,130,104,78,52,
      26,0
};


int main(void)
{
    NVIC_EnableIRQ(PWM_0_INST_INT_IRQN);
    NVIC_EnableIRQ(PWM_1_INST_INT_IRQN);
    SYSCFG_DL_init();

    while (1) {
        __WFI();
    }
}

 

void Q2_PWM_FORCE_LOW(void)
{
    DL_Timer_overrideCCPOut(PWM_1_INST, DL_TIMER_FORCE_OUT_LOW,DL_TIMER_FORCE_CMPL_OUT_LOW,DL_TIMER_CC_1_INDEX);
}

void Q2_PWM_FORCE_RELEASE(void)
{
    DL_Timer_overrideCCPOut(PWM_1_INST, DL_TIMER_FORCE_OUT_DISABLED,DL_TIMER_FORCE_CMPL_OUT_DISABLED,DL_TIMER_CC_1_INDEX);
}

void Q1_PWM_FORCE_LOW(void)
{
    DL_Timer_overrideCCPOut(PWM_1_INST, DL_TIMER_FORCE_OUT_LOW,DL_TIMER_FORCE_CMPL_OUT_LOW,DL_TIMER_CC_0_INDEX);
}

void Q1_PWM_FORCE_RELEASE(void)
{
    DL_Timer_overrideCCPOut(PWM_1_INST, DL_TIMER_FORCE_OUT_DISABLED,DL_TIMER_FORCE_CMPL_OUT_DISABLED,DL_TIMER_CC_0_INDEX);
}

uint16_t pwm_flag=0;
uint16_t sin_index=0;
void PWM_0_INST_IRQHandler(void)
{
    switch (DL_TimerG_getPendingInterrupt(PWM_0_INST))
        {
        case DL_TIMER_IIDX_CC0_UP:
            sin_index=0;
            Q2_PWM_FORCE_LOW();
            Q1_PWM_FORCE_RELEASE();
            DL_TimerG_startCounter(PWM_1_INST);
            break;
        case DL_TIMER_IIDX_CC1_DN:
            sin_index=0;
            Q1_PWM_FORCE_LOW();
            Q2_PWM_FORCE_RELEASE();
            DL_TimerG_startCounter(PWM_1_INST);
            break;
            default:
        break;
    }
}

void PWM_1_INST_IRQHandler(void)
{
    switch (DL_TimerG_getPendingInterrupt(PWM_1_INST))
        {
        case DL_TIMER_IIDX_LOAD :
            DL_TimerG_setCaptureCompareValue(PWM_1_INST,g_sine_table[sin_index]*9/10 ,DL_TIMER_CC_0_INDEX);
            DL_TimerG_setCaptureCompareValue(PWM_1_INST,g_sine_table[sin_index]*9/10 ,DL_TIMER_CC_1_INDEX);
            sin_index+=1;
            if(sin_index>=193){
                DL_TimerG_stopCounter(PWM_1_INST);
                sin_index=0;
            }
            break;
            default:
        break;
    }
}

这个问题在每个循环都会出现13dbea94-a2e0-4eef-8df3-d502ce071a0a.pngdbcd3762-c192-4c17-a7bf-b7cbf2ee2ed8.png

它没有根据我表里设置的pwm占功比来运行,我尝试过把后面几个数值进行修改,当我占功比没有下降到靠经0时这个问题没有出现。一旦降到0或者接近0的某个数值时。这个问题就会出现。