
手撕系列(4):空间矢量调制(SVPWM)
function [CMPA,CMPB,CMPC] = SVPWM(u)
Va = u(1);
Vb = u(2);
Vc = u(3);
Ts = u(4);
PRD = u(5);
%% 60°坐标变换
Vg = 2/3 * (Va - Vb);
Vh = 2/3 * (Vb - Vc);
% 进行标幺化
Vdc = 700;
Vg = Vg/(2*Vdc/3);
Vh = Vh/(2*Vdc/3);
%% 判断扇区、 其他扇区与第1扇区的映射关系
if(Vh>=0 && Vg>=0)
Sec = 1;
Vgg = Vg;
Vhh = Vh;
elseif(Vh>=0 && Vg+Vh>=0)
Sec = 2;
Vhh = Vg + Vh; % 注意第2、4、6扇区 的起始矢量顺序,与第1扇区的区别
Vgg = -Vg;
elseif(Vh>=0 && Vg+Vh<=0)
Sec = 3;
Vgg = Vh;
Vhh = -Vg - Vh;
elseif(Vg<=0 && Vh<=0)
Sec = 4;
Vhh = -Vg;
Vgg = -Vh;
elseif(Vg>=0 && Vg+Vh<=0)
Sec = 5;
Vgg = -Vg - Vh;
Vhh = Vg;
else
Sec = 6;
Vhh = -Vh;
Vgg = Vg + Vh;
end
%% 计算 T0、T1、T2矢量的作用时间
T1 = Vgg; % 这里本来应该乘以 Ts,但是在下面计算CL时,又要除以Ts,
T2 = Vhh; % 因此,可以同时省去。
T0 = 1- T1 - T2;
if (T0 < 0)
Tsum = T1 + T2;
T1 = T1/Tsum;
T2 = T2/Tsum;
T0 = 0;
end
TL = 0.25 * T0;
TM = TL + 0.5 * T1;
TH = TM + 0.5 * T2;
CL = TL * PRD * 2;
CM = TM * PRD * 2;
CH = TH * PRD * 2;
%% 根据扇区,确定a、b、c三相CMP寄存器的值。
switch Sec
case 1
CMPA = CL;
CMPB = CM;
CMPC = CH;
case 2
CMPA = CM;
CMPB = CL;
CMPC = CH;
case 3
CMPA = CH;
CMPB = CL;
CMPC = CM;
case 4
CMPA = CH;
CMPB = CM;
CMPC = CL;
case 5
CMPA = CM;
CMPB = CH;
CMPC = CL;
case 6
CMPA = CL;
CMPB = CH;
CMPC = CM;
otherwise
CMPA = CL; % 不会进入这个分支,但是matlab要求必须有 otherwise
CMPB = CH;
CMPC = CM;
end
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 JianboChen
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果