📄 spwm.c
字号:
#include "spwm.h"
#include "qmath.h"
SPWM spwm_moudle;
int PWM_Pulse[MaxPulsNum] ; //存放脉宽数据
int PWM_Buf[MaxPulsNum]; //数据缓冲区
int *pPWMData=PWM_Pulse;
int PWM_Calcu_Buf[PWMNum];
int OpenAngle[ControlHamanic];
int OpenAmple[ControlHamanic];
const AngleShif[3]={0,21845,-21845}; //正负120度
void spwm_init(SPWM_Handle p)
{
p->Ample[0]=16384; //3
// p->Ample[0]=0; //3
// p->Ample[1]=16384; //5
p->Ample[1]=0; //5
p->Ample[2]=16384; //幅值调制度0.5,Q15
// p->Ample[2]=0;
p->Angle[0]=16384;
p->Angle[1]=0;
p->Angle[2]=0; //相位
p->Kp=16384;
p->Ki=16384;
p->Kd=16384;
p->PulseA=0x10;
p->PulseB=0x50;
p->PulseC=0xff;
// p->MaudleK=32767; //调制度为1
p->MaudleK=31129; //最大调制系数为0.95
p->VoutToMaudleK=82; // 1/400
p->T=0x0619; // T0/2
p->ControlMode=OpenControl;
}
void spwm_calc(SPWM_Handle p)
{
long Sumtemp=0;
int i,j,temp,MaxPWMOut;
int K; //比例系数,默认为1
int AngleAdd[ControlHamanic]={0,0,0}; //各次谐波
for(j=0;j<3;j++)
{
AngleAdd[0]=p->Angle[0]+AngleShif[j];
AngleAdd[1]=p->Angle[1]+AngleShif[j];
AngleAdd[2]=p->Angle[2]+AngleShif[j];
K=32767;
MaxPWMOut=0;
for(i=0;i<PWMNum;i++) //计算各相128点
{
Sumtemp=0;
Sumtemp+=(((long)p->Ample[0]*qsinlt(AngleAdd[0])<<1)>>2); //Q29
Sumtemp+=(((long)p->Ample[1]*qsinlt(AngleAdd[1])<<1)>>2);
Sumtemp+=(((long)p->Ample[2]*qsinlt(AngleAdd[2])<<1)>>2);
temp=(Sumtemp>>16); //Q13,为防止溢出
PWM_Calcu_Buf[i]=temp;
if (abs(temp)>MaxPWMOut)
MaxPWMOut=abs(temp);
AngleAdd[0]+=ThirdAngleAdd;
AngleAdd[1]+=FifthAngleAdd;
AngleAdd[2]+=SevenAngleAdd;
}
temp=p->MaudleK>>2; //Q15-->Q13,限幅处理
if(MaxPWMOut>temp) //K=temp/MaxPWMOut;
{
Sumtemp=qinv1(MaxPWMOut); //((Q18-->Q15)*Q15)--->Q15
K=((Sumtemp>>3)*p->MaudleK)>>15;
}
for(i=0;i<PWMNum;i++)
{
// temp=(long)PWM_Calcu_Buf[i]*K>>13; //Q13*Q15--->Q15
// temp+=32768;
// PWM_Buf[i+j]=(long)temp*p->T>>15;
temp=(32768+((long)PWM_Calcu_Buf[i]*K>>13))>>1;
PWM_Buf[i*3+j]=(long)temp*p->T>>14; //C相
}
}
//21845
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -