好像不是硬件上的问题,以前SPWM都好着呢,昨天改了改角度又脉宽少的严重了。
void SPWMacc(void)
{
unsigned long int temp,Theta_temp;
unsigned int sin_angle1,sin_angle2;
unsigned int t1,t2,t0;
unsigned int PDC11,PDC12,PDC13;
if(_PWM1IF==1)
{
getAD();
_PWM1IF=0;
K=1879; //k=(65536/357);184 k=3.67*Q9
Fref=(40*Q8);
M=51;
// Fs=80*Q7;
//M=0.2*Q8; //0.4*q15=13107
temp=(unsigned long int)(K*Fref);
Theta=Theta+(unsigned int)(temp>>17);
phase=Theta/10924;
//t1,t2,t0
Theta_temp=Theta;
sin_angle1=sin_angle(Theta);
temp=(unsigned long int)(M*sin_angle1);
temp=(unsigned long int)(temp>>6);
temp=(unsigned long int)(temp*DUTY);
t1=(unsigned int)(temp>>17);
Theta_temp=10922-Theta;
sin_angle2=sin_angle(Theta);
temp=(unsigned long int)(M*sin_angle2); //M,q15
temp=(unsigned long int)(temp>>6);
temp=(unsigned long int)(temp*DUTY);
t2=(unsigned int)(temp>>17);
t0=(DUTY-t1-t2)>>1;
PDC11=t0;
PDC12=t2+t0;
PDC13=t2+t0+t1;
//写占空比
switch(phase)
{ case 0:
PDC1=PDC13;
PDC2=PDC12;
PDC3=PDC11;
break;
case 1:
PDC1=PDC12;
PDC2=PDC13;
PDC3=PDC11;
break;
case 2:
PDC1=PDC11;
PDC2=PDC13;
PDC3=PDC12;
break;
case 3:
PDC1=PDC11;
PDC2=PDC12;
PDC3=PDC13;
break;
case 4:
PDC1=PDC12;
PDC2=PDC11;
PDC3=PDC13;
break;
case 5:
PDC1=PDC13;
PDC2=PDC11;
PDC3=PDC12;
break;
default:
break;
}
}
}
unsigned int sin_angle(unsigned int angle)
{
unsigned int temp;
if(angle>=32768)
{
angle=angle-32768;
}
else
{
angle=32768-angle;
}
temp=angle/273;
temp=sintable[temp];
return temp;
}
程序这样写的,现在就是不知道为什么会出现少波形的错误呢
|