📄 svpwm.c
字号:
#include "Cpu.h"
#include "Events.h"
#include "Svpwm.h"
extern int ualfa; /* Q6 */
extern int ubeta; /* Q6 */
extern int tana[180];
extern int thetatemp1;
extern int thetae1;
extern int sina[180];
extern int cosa[180];
extern int k1; /* Q16 */
extern int Vbus; /* Q6 */
extern int gujun;
extern bool clzloop;
void Svpwm(void)
{
Frac16 tempf1;
Frac16 tempf2;
Frac16 tempf3;
int quad;
int n1;
int n2;
int temp=28378; /* Q14 represent 1.732 */
int temp16;
int temp17;
long int temp32;
long int temp33;
long int temp34;
tempf2=ubeta;
tempf1=ualfa;
if(tempf2>0) /* 0 to 180 degree */
{
if(tempf1>0) /* 0 to 90 degree */
{
if(tempf1>tempf2) /* 0 to 45 degree */
quad=1; /* 45 to 90 degree */
else
quad=2;
}
else /* 90 to 180 degree */
{
tempf1=-tempf1;
if(tempf1>tempf2)
quad=4; /* 135 to 180 degree */
else
quad=3; /* 90 to 135 degree */
}
}
else /* 180 to 360 degree */
{
tempf2=-tempf2;
if(tempf1>0) /* 270 to 360 degree */
{
if(tempf1>tempf2)
quad=8; /* 315 to 360 degree */
else
quad=7; /* 270 to 360 degree */
}
else
{
tempf1=-tempf1; /* 180 to 270 degree */
if(tempf1>tempf2)
quad=5; /* 180 to 225 degree */
else
quad=6; /* 225 to 270 degree */
}
}
/* To calculate the tan(theta) */
if(tempf1<tempf2)
tempf3=div_s(tempf1,tempf2); /* cotangent value */
else
tempf3=div_s(tempf2,tempf1); /* tangent value */
if(tempf3<tana[23])
n1=0;
else
n1=1;
thetatemp1=0;
for(thetatemp1=0;thetatemp1<23;thetatemp1++)
{
if(tempf3>(tana[22*n1+thetatemp1]))
n2=thetatemp1;
else
break;
}
thetae1=23*n1+n2; /* calculate the rotor position (0 to 45) */
switch(quad)
{
case(1):
{
thetae1=thetae1;
}break;
case(2):
{
thetae1=90-thetae1;
}break;
case(3):
{
thetae1=90+thetae1;
}break;
case(4):
{
thetae1=180-thetae1;
}break;
case(5):
{
thetae1=180+thetae1;
}break;
case(6):
{
thetae1=270-thetae1;
}break;
case(7):
{
thetae1=270+thetae1;
}break;
case(8):
{
thetae1=360-thetae1;
}break;
}
if((thetae1>=0) && (thetae1<180))
{
temp32=(L_mult(ualfa,cosa[thetae1]))>>16; /* Q6 */
temp33=(L_mult(ubeta,sina[thetae1]))>>16; /* Q6 */
}
else
{
temp32=-(L_mult(ualfa,cosa[thetae1-180]))>>16; /* Q6 */
temp33=-(L_mult(ubeta,sina[thetae1-180]))>>16; /* Q6 */
}
temp16=(int)(temp32+temp33); /* Q6 */
temp34=(L_mult(temp16,temp))>>15; /* Q6 */
temp17=(int)(temp34);
k1=div_s(temp17,Vbus); /* Q15 */
if(k1>5380)
k1=5380;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -