/**********************Park变换************通过90度二相alpha=id.beta=iq求出D,Q直流矢量***********/
void Park(int alpha,int beta,int *d,int *q)
{
*d=(iSineTable[iCosAngle]*alpha+iSineTable[iAngle]*beta)>>15;//ID=alpha*cos(angle)+beta*sin(angle)
*q=(iSineTable[iCosAngle]*beta-iSineTable[iAngle]*alpha)>>15;//IQ=-alpha*sin(angle)+bata*cos(angle)
}
/**********************反Park变换**********通过直流ID,IQ求出二相alpha=id.beta=iq***********/
void UnPark(int d,int q,int *alpha,int *beta)
{
*alpha=(iSineTable[iCosAngle]*d-iSineTable[iAngle]*q)>>15;//alpha=ID*cos(angle)-IQ*sin(angle)
*beta=(iSineTable[iAngle]*d+iSineTable[iCosAngle]*q)>>15; //beta=ID*sin(angle)+IQ*cos(angle)
}
/*********幅值不变Clarke变换************/
//unsigned int SvpwmSec[6]={1,5,0,3,2,4}; //svpwm section table//这一句是扇区的也屏蔽了,
/********************Clarke变换**********************/
void Clarke(int A,int B,int C,int *alpha,int *beta)
{
*alpha=A-0.5*B-0.5*C ;
//这几个公式是怎么推出来的
*beta =(sqrt(3)/2)*B+ (-sqrt(3)/2)*C; // 这个跟号3怎么来的
}
/**********反Clarke变换******************************/
void UnClarke(int alpha,int beta,int *A,int *B,int *C)
{
*A=alpha;
*B=((-0.5*alpha)>>15)+((sqrt(3)/2*beta)>>15); //这个公式头痛
*C=(( -0.5*alpha)>>15)+((-sqrt(3)/2)*beta)>>15); //
}
看得头都大了,代码可以产生Svpwm,而且没有扇区判断的代码,感觉算法好很精,精得我看不懂,能帮讲解一下吗
|