这是无死区判断产生SVPWM波的Psim仿真实现
新型无扇区空间矢量脉宽调制算法:
单片机源程序如下:
- #include<stdio.h>
- #include<math.h>
- __declspec(dllexport) void simuser (t, delt, in, out)
- // t,delt,in,out 这几个变量的类型必须为double型
- // 其中,t为系统仿真时间;delt为时间步长;in为输入口;out为输出口;
- // in、out都以指针的形式给出,其个数由psim中dll文件决定,分别有1、3、6、12、20、25个
- // 不用的输入口必须接地,否则会出现错误
- double t, delt;
- double *in, *out;
- {
- double w,M,theta,U_alpha,U_beta;
- double Ts,X,Y,Z,Tx,Ty;
- double Ta,Tb,Tc,Tcm1,Tcm2,Tcm3;
- int A,B,C,Sector;
-
- M = in[0];
- w = in[1];
- Ts = in[2]; // PWM开关周期
-
- theta = w*t;
-
- U_alpha = M*cos(theta);
- U_beta = M*sin(theta);
-
- // 扇区判断
- if (U_beta > 0)
- A = 1;
- else
- A = 0;
- if((sqrt(3)*U_alpha-U_beta) > 0)
- B = 1;
- else
- B = 0;
- if((sqrt(3)*U_alpha+U_beta) < 0)
- C = 1;
- else
- C = 0;
- Sector = A + 2*B + 4*C;
- X = sqrt(3)*U_beta*Ts;
- Y = ((3*U_alpha+sqrt(3)*U_beta)*Ts)/2;
- Z = ((-3*U_alpha+sqrt(3)*U_beta)*Ts)/2;
-
- // 各个扇区的具体作用时间选择;
- switch(Sector)
- {
- case 1: // 第二扇区;
- Tx = Z;
- Ty = Y;
- break;
- case 2: // 第六扇区;
- Tx = Y;
- Ty= -X;
- break;
- case 3: // 第一扇区;
- Tx = -Z;
- Ty = X;
- break;
- case 4: // 第四扇区;
- Tx = -X;
- Ty = Z;
- break;
- case 5: // 第三扇区;
- Tx = X;
- Ty = -Y;
- break;
- case 6: // 第五扇区;
- Tx = -Y;
- Ty = -Z;
- break;
- default:
- break;
- }
- // 作用时间的饱和判断;
- if((Tx+Ty) > Ts)
- {
- Tx = (Tx*Ts)/(Tx+Ty);
- Ty = (Ty*Ts)/(Tx+Ty);
- }
- // 桥臂开通时刻;
- Ta = (Ts-Tx-Ty)/4;
- Tb = Ta + Tx/2;
- Tc = Tb + Ty/2;
- // Tcm1是A相上桥臂管子的开通时刻
- // Tcm2是B相上桥臂管子的开通时刻
- // Tcm3是C相上桥臂管子的开通时刻
- switch(Sector)
- {
- case 1:
- Tcm1 = Tb;
- Tcm2 = Ta;
- Tcm3 = Tc;
- break;
- case 2:
- Tcm1 = Ta;
- Tcm2 = Tc;
- Tcm3 = Tb;
- break;
- case 3:
- Tcm1 = Ta;
- Tcm2 = Tb;
- Tcm3 = Tc;
- break;
- case 4:
- Tcm1 = Tc;
- Tcm2 = Tb;
- Tcm3 = Ta;
- break;
- case 5:
- Tcm1 = Tc;
- Tcm2 = Ta;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
无扇区判断SVPWM_第一组.rar
(796.52 KB, 下载次数: 39)
|