#include <math.h>
__declspec(dllexport) void simuser (t, delt, in, out)
double t, delt;
double *in, *out;
{
static double jishu = 0,rd = 0;
static double cnt = 0.0,PI = 3.141592653,udc = 537,Ts = 1;
static double pwm1,pwm2,pwm5,pwm6,pwm9,pwm10;
double ua,ub,uc;
double pwm_period;
int n,sector;
double Va,Vb,Vc,Vr,alph,beta;
double T1,T2,T5,T6,T9,T10,Ta,Tb,Tc;
double valueCMPR,TempValue1,TempValue2,TempValue3,TempValue4,TempValue5,TempValue6;
double a,b,c,N,m;
double data;
double uab,ubc,uca,u,ur;
double ia,ib,ic,alph_i,beta_i;
double ek=0,ek0 = 0,sum;
static double kp = 1.8,ki = 0.001125,kpp = 0.0045;
static double u_out = 0.0;
double sine_data,cosin_data;
double alph_u,beta_u;
double i,ir;
if(cnt == 0)
{
cnt = 9;
jishu ++;
if(jishu <= 500)rd = 0;
if(jishu >= 500 && jishu <=1500)rd = 1;
if(jishu > 1500)rd = 0;
out[11] = rd;
out[0] = pwm1;
out[1] = pwm2;
out[2] = pwm5;
out[3] = pwm6;
out[4] = pwm9;
out[5] = pwm10;
}
else
{
cnt --;
pwm_period = 1;
{
sine_data = in[0];
cosin_data = in[1];
ua = in[2];
ub = in[3];
uc = in[4];
uab = in[5];
ubc = in[6];
uca = in[7];
ia = in[8];
ib = in[9];
ic = in[10];
}
{
uab = uab / 1.732;
ubc = ubc / 1.732;
uca = uca / 1.732;
alph = (ua * 0.666667) - (ub * 0.333333) - (uc * 0.333333); //坐标变换
beta = (ub * 0.577350) - (uc * 0.577350);
Vr = sqrt (alph * alph + beta * beta); //参考矢量模值计算
data = 2 * atan2(beta,Vr + alph); //角度计算
if(data > PI)data = PI; //角度限幅
if(data < -PI)data = -PI;
alph_u = (uab * 0.666667) - (ubc * 0.333333) - (uca * 0.333333);
beta_u = (ubc * 0.577350) - (uca * 0.577350);
ur= sqrt (alph_u * alph_u + beta_u * beta_u);
alph_i = (ia * 0.666667) - (ib * 0.333333) - (ic * 0.333333);//坐标变换
beta_i = (ib * 0.577350) - (ic * 0.577350);
ir= sqrt (alph_i * alph_i + beta_i * beta_i);
/***********************电压环调节**************************/
ek = Vr - ur;
sum = (ek - ek0) * kp + ek * ki; //PI调节
u = sum + u_out;
ek0 = ek;
u_out = u;
/***********************电流环调节**************************/
i = (u - ir) * kpp; //P调节
Vr = i;
if(Vr > 311)Vr = 311;
if(Vr < 0)Vr = 0.1;
/************************大扇区判断*************************/
if (beta >= 0) a=1;
else a = 0;
if (1.732 * alph - beta >= 0) b = 1;
else b = 0;
if (1.732 * alph + beta >= 0) c = 1;
else c = 0;
N = a + 2 * b + 4 * c;
if (N == 7) sector = 1;
if (N == 5) sector = 2;
if (N == 1) sector = 3;
if (N == 0) sector = 4;
if (N == 2) sector = 5;
if (N == 6) sector = 6;
/************************小扇区判断*************************/
{
data = data - (sector - 1) * PI / 3 ; //角度转化到第1扇区
Va = 1.154 * Vr * sin(PI / 3 - data );
Vb = 1.154 * Vr * sin(data);
Vc = 0.33333 * udc;
n = 0;
if (Va <= Vc)
{
if (Vb > Vc) n = 4;
else
{
if (Va + Vb <= Vc) n = 1;
else n = 2;
}
}
else n = 3;
}
/************************作用时间计算*************************/
{
m = 3 * Vr / (2 * udc);
if(m >= 0.866) m = 0.866;
if(m < 0) m = 0.1;
out[6] = Vr;
out[7] = m;
if (n == 1) //第1小扇区
{
Ta = 2.3094 * m * Ts * sin(PI / 3 - data);
Tb = 2.3094 * m * Ts * sin(data);
Tc = Ts - 2.3094 * m * Ts * sin(PI / 3 + data);
}
if (n == 2) //第2小扇区
{
Ta = Ts - 2.3094 * m * Ts * sin(data);
Tc = 2.3094 * m * Ts * sin(PI / 3 + data) - Ts;
Tb = Ts - 2.3094 * m * Ts * sin(PI / 3 - data);
}
if (n == 3) //第3小扇区
{
Ta = 2 * Ts - 2.3094 * m * Ts * sin(PI / 3 + data);
Tb = -Ts + 2.3094 * m * Ts * sin(PI / 3 - data);
Tc = 2.3094 * m * Ts * sin(data);
}
if (n == 4) //第4小扇区
{
Tb = 2.3094 * m * Ts * sin(PI / 3 - data);
Ta = 2 * Ts - 2.3094 * m * Ts * sin(PI / 3 + data);
Tc = -Ts + 2.3094 * m * Ts * sin(data);
}
if(Ta > 1) Ta = 1;
if(Tb > 1) Tb = 1;
if(Tc > 1) Tc = 1;
if(Ta < 0) Ta = 0;
if(Tb < 0) Tb = 0;
if(Tc < 0) Tc = 0;
//out[6] = Ta;
//out[7] = Tb;
//out[8] = Tc;
out[9] = n;
out[10] = sector;
/******************************************************************************************************************/
/******************************************************************************************************************/
/******占空比计算,下面这6个值有点疑惑,请您确认一下,整个程序也麻烦您浏览一下,谢谢!*************************************/
TempValue1 = 1;
TempValue2 = 0;
TempValue3 = Ta / (2 * Ts);
TempValue4 = (2 * Tb + Ta) / (2 * Ts);
TempValue5 = (2 * Tb + 2 * Tc + Ta) / (2 * Ts);
TempValue6 = (2 * Tc + Ta) / (2 * Ts);
/*******************************************************************************************************************/
/*******************************************************************************************************************/
/*******************************************************************************************************************/
/************************占空比分配*****************从负小矢量出发***********************/
valueCMPR = 1;
if (sector == 1)
{
if (n == 1) // 0-1-1,00-1,000,100,000,00-1,0-1-1
{
T1 = TempValue3 * valueCMPR;
T2 = TempValue1 * valueCMPR;
T5 = TempValue2 * valueCMPR;
T6 = TempValue5 * valueCMPR;
T9 = TempValue2 * valueCMPR;
T10 = TempValue6 * valueCMPR;
}
if (n == 2) // 0-1-1,00-1,10-1,100,10-1,00-1,0-1-1
{
T1 = TempValue6 * valueCMPR;
T2 = TempValue1 * valueCMPR;
T5 = TempValue2 * valueCMPR;
T6 = TempValue5 * valueCMPR;
T9 = TempValue2 * valueCMPR;
T10 = TempValue3 * valueCMPR;
}
if (n == 3) // 0-1-1,1-1-1,10-1,100,10-1,1-1-1,0-1-1
{
T1 = TempValue5 * valueCMPR;
T2 = TempValue1 * valueCMPR;
T5 = TempValue2 * valueCMPR;
T6 = TempValue6 * valueCMPR;
T9 = TempValue2 * valueCMPR;
T10 = TempValue3 * valueCMPR;
}
if (n == 4) // 00-1,10-1,11-1,110,11-1,10-1,00-1
{
T1 = TempValue5 * valueCMPR;
T2 = TempValue1 * valueCMPR;
T5 = TempValue6 * valueCMPR;
T6 = TempValue1 * valueCMPR;
T9 = TempValue2 * valueCMPR;
T10 = TempValue3 * valueCMPR;
}
}
if (sector == 2)
{
if (n == 1)
{
T1 = TempValue3 * valueCMPR;
T2 = TempValue1 * valueCMPR;
T5 = TempValue4 * valueCMPR;
T6 = TempValue1 * valueCMPR;
T9 = TempValue2 * valueCMPR;
T10 = TempValue5 * valueCMPR;
}
if (n == 2)
{
T1 = TempValue3 * valueCMPR;
T2 = TempValue1 * valueCMPR;
T5 = TempValue5 * valueCMPR;
T6 = TempValue1 * valueCMPR;
T9 = TempValue2 * valueCMPR;
T10 = TempValue6 * valueCMPR;
}
if (n == 3)
{
T1 = TempValue4 * valueCMPR;
T2 = TempValue1 * valueCMPR;
T5 = TempValue5 * valueCMPR;
T6 = TempValue1 * valueCMPR;
T9 = TempValue2 * valueCMPR;
T10 = TempValue3 * valueCMPR;
}
if (n == 4)
{
T1 = TempValue2
评论10