由于需要使用fpga做pwm发生器,用ti的control suite 里的svgen_dq.h更改得到,将本来程序输出Ta,Tb,Tc换成T1,T2, T0.发给FPGA作为比较
点,同时发送的还有扇区信息,现在做开环的实验,即给定正弦信号通过clarke变换的 alpha、beta变换。将这个信号给svgen_dq,但是从输出的fpga波形来看
有几个扇区是不正确的
clarke变换是经过修改的,因为svgen_dq.c里的判断扇区的反变换部分将Ua = Ubeta;
clarke.c
v->Beta = v->As;
v->Alpha = (-v->As - 2*v->Bs)*0.57735026918963; // 1/sqrt(3) = 0.57735026918963
svgen_dq.c
iq Va,Vb,Vc,temp_sv1,temp_sv2;
int Sector = 0; // Sector is treated as Q0 - independently with global Q
temp_sv1=_IQdiv2(v->Ubeta);
temp_sv2=_IQmpy(_IQ(0.8660254),v->Ualpha);
Va = v->Ubeta;
Vb = -temp_sv1 + temp_sv2;
Vc = -temp_sv1 - temp_sv2;
if (Va>_IQ(0)) Sector = 1;
if (Vb>_IQ(0)) Sector = Sector+2;
if (Vc>_IQ(0)) Sector = Sector+4;
Va = v->Ubeta;
Vb = temp_sv1 + temp_sv2;
Vc = temp_sv1 - temp_sv2;
v->VecSector = Sector ;
switch(Sector)
{
case 0:
v->T0 = _IQ(0);
v->T1 = _IQ(0);
v->T2 = _IQ(0);
break;
case 1:
v->T1 = Vc;
v->T2 = Vb;
v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));
break;
case 2:
v->T1 = Vb;
v->T2 = -Va;
v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));
break;
case 3:
v->T1 = -Vc;
v->T2 = Va;
v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));
break;
case 4:
v->T1 = -Va;
v->T2 = Vc;
v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));
break;
case 5:
v->T1 = Va;
v->T2 = -Vb;
v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));
break;
case 6:
v->T1 = -Vb;
v->T2 = -Vc;
v->T0 = _IQmpy((_IQ(1)-v->T1-v->T2),_IQ(0.5));
break;