📄 svpwm.c
字号:
#include "2407c.h"
#include "stdlib.h"
#define F_Uout 8 /*电压空间矢量频率<50Hz*/
#define Dirt 1 /*1 or -1*/
void interrupt gptime1(void); /*T1_Underflow_ISR*/
void interrupt PHANTOM(void); /*假中断ISR*/
void Delay(unsigned int nDelay); /*delay subroutine*/
extern void init_dsp(int); /*initilization*/
/*************************Variable Definition************************************/
int Temp1;
int Delta_p_T1P=0; /*每T1周期Uout转过的度数,Q14格式*/
int VT1P; /*参考电压*T1P,用于中间计算*/
long Theta=0; /*Uout角度值,Q14格式*/
long D_360=5898240; /*360度,Q14格式*/
int Theta_I; /*角度查表索引值*/
int Sector; /*扇区号*/
int SinTheta;
int CosTheta;
int UaT1P;
int UbT1P;
int CMP_1;
int CMP_2;
int CMP_0;
int CMPRM[3];
int index[6][3]={
0,1,2,
1,0,2,
1,2,0,
2,1,0,
2,0,1,
0,2,1};
unsigned int aaa=0;/*测试用*/
unsigned int bbb=0;/*测试用*/
unsigned int ccc=0;/*测试用*/
unsigned int ddd=0;/*测试用*/
int InvrtM[6][4]={ /*逆阵表,Q14格式有符号数*/
20066,-11585,0,23170,
-20066,11585,20066,11585,
0,23170,-20066,-11585,
0,-23170,-20066,11585,
-20066,-11585,20066,-11585,
20066,11585,0,-23170};
int sinEntry[361]={
0, /*SIN值表,Q14格式有符号数*/
286,572,857,1143,1428,
1713,1997,2280,2563,2845,
3126,3406,3686,3964,4240,
4516, 4790,5063,5334,5604,
5872,6138,6402,6664, 6924,
7182,7438,7692,7943,8192,
8438,8682,8923,9162,9397,
9630,9860,10087,10311,10531,
10749,10963,11174,11381,11585,
11786,11982,12176,12365,12551,
12733,12911,13085,13255,13421,
13583,13741,13894,14044,14189,
14330,14466,14598,14726,14849,
14968,15082,15191,15296,15396,
15491,15582,15668,15749,15826,
15897,15964,16026,16083,16135,
16182,16225,16262,16294,16322,
16344,16362,16374, 16382,16384, //90
16382,16374,16362,16344,16322,
16294,16262,16225,16182,16135,
16083,16026,15964,15897,15826,
15749,15668,15582,15491,15396,
15296,15191,15082,14968,14849,
14726,14598,14466,14330,14189,
14044,13894,13741,13583,13421,
13255,13085,12911,12733,12551,
12365,12176,11982,11786,11585,
11381,11174,10963,10749,10531,
10311,10087,9860,9630,9397,
9162,8923,8682,8438,8192,
7943,7692,7438,7182,6924,
6664,6402,6138,5872,5604,
5334,5063,4790,4516,4240,
3964,3686,3406,3126,2845,
2563,2280,1997,1713,1428,
1143,857,572,286,0, //180
-286,-572,-857,-1143,-1428,
-1713,-1997,-2280,-2563,-2845,
-3126,-3406,-3686,-3964,-4240,
-4516, -4790,-5063,-5334,-5604,
-5872,-6138,-6402,-6664, -6924,
-7182,-7438,-7692,-7943,-8192,
-8438,-8682,-8923,-9162,-9397,
-9630,-9860,-10087,-10311,-10531,
-10749,-10963,-11174,-11381,-11585,
-11786,-11982,-12176,-12365,-12551,
-12733,-12911,-13085,-13255,-13421,
-13583,-13741,-13894,-14044,-14189,
-14330,-14466,-14598,-14726,-14849,
-14968,-15082,-15191,-15296,-15396,
-15491,-15582,-15668,-15749,-15826,
-15897,-15964,-16026,-16083,-16135,
-16182,-16225,-16262,-16294,-16322,
-16344,-16362,-16374,-16382,-16384, //270
-16382,-16374,-16362,-16344,-16322,
-16294,-16262,-16225,-16182,-16135,
-16083,-16026,-15964,-15897,-15826,
-15749,-15668,-15582,-15491,-15396,
-15296,-15191,-15082,-14968,-14849,
-14726,-14598,-14466,-14330,-14189,
-14044,-13894,-13741,-13583,-13421,
-13255,-13085,-12911,-12733,-12551,
-12365,-12176,-11982,-11786,-11585,
-11381,-11174,-10963,-10749,-10531,
-10311,-10087,-9860,-9630,-9397,
-9162,-8923,-8682,-8438,-8192,
-7943,-7692,-7438,-7182,-6924,
-6664,-6402,-6138,-5872,-5604,
-5334,-5063,-4790,-4516,-4240,
-3964,-3686,-3406,-3126,-2845,
-2563,-2280,-1997,-1713,-1428,
-1143,-857,-572,-286,0 //360
};
main()
{
init_dsp(1250); /*初始化dsp*/
/**********************************主循环****************************************/
while(1)
{
Delta_p_T1P=Dirt*F_Uout*369; /*Q14格式*/
// VT1P=565*F_Uout; /*Q5格式*/
// VT1P=28250;
VT1P=14250;
bbb+=1;
}
}
void interrupt gptime1(void)
{
*EVAIFRA=0x0fff; /*清中断标志*/
ccc+=1;
/******计算角度*********/
Theta+=Delta_p_T1P; /*Q14格式*/
if(Theta<0)
Theta+=D_360;
else if(Theta>=D_360)
Theta-=D_360;
Theta_I=(int)(Theta>>14); /*Q0格式*/
/********计算Ua*T1P,Ub*T1p******/
SinTheta=sinEntry[Theta_I]; /*Q14格式*/
Temp1=Theta_I+90;
if(Temp1>=360)
Temp1-=360;
CosTheta=sinEntry[Temp1]; /*Q14格式*/
UaT1P=(((long)VT1P*CosTheta)>>14);/*Q5格式*/
UbT1P=(((long)VT1P*SinTheta)>>14);/*Q5格式*/
/********确定扇区号,查表进行相关计算*****************/
Sector=((Theta_I*68)>>12);
CMP_1=(((long)UaT1P*InvrtM[Sector][0]+(long)UbT1P*InvrtM[Sector][1])>>19); /*t1脉冲数Q0格式*/
CMP_2=(((long)UaT1P*InvrtM[Sector][2]+(long)UbT1P*InvrtM[Sector][3])>>19); /*t2脉冲数Q0格式*/
CMP_0=((1250-CMP_1-CMP_2)>>1);
CMPRM[index[Sector][0]]=CMP_0;
CMPRM[index[Sector][1]]=CMP_0+CMP_1;
CMPRM[index[Sector][2]]=CMP_0+CMP_1+CMP_2;
/********删除窄脉宽************/
if(CMPRM[0]<0)
CMPRM[0]=0;
else if(CMPRM[0]>1250)
CMPRM[0]=1250;
if(CMPRM[1]<0)
CMPRM[1]=0;
else if(CMPRM[1]>1250)
CMPRM[1]=1250;
if(CMPRM[2]<0)
CMPRM[2]=0;
else if(CMPRM[2]>1250)
CMPRM[2]=1250;
*CMPR1=CMPRM[0];
*CMPR2=CMPRM[1];
*CMPR3=CMPRM[2];
asm(" CLRC INTM");
}
void interrupt PHANTOM(void)
{
aaa+=1;
asm(" CLRC INTM");
}
void Delay(unsigned int nDelay)
{
int i,j,k;
for ( i=0;i<nDelay;i++ )
for ( j=0;j<16;j++ )
k++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -