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;
}
}
这个问题在每个循环都会出现

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

配置文件只配置了pwm