接上一篇:SVPWM空间矢量调制模块的matlab仿真1:理论部分_Fantasy237的博客-CSDN博客
SVPWM空间矢量调制模块的matlab仿真2:仿真模型搭建
仿真模型
仿真模型框图如下。其中,有两个模块是用matlab function搭的,sample frequency 等于开关频率。用代码实现更方便一些。根据代码再用模块搭建也相对简单。
按照之前说的,分成了4个模块:
- clarke变换,或者叫3/2变换,和求角度
- 扇区计算
- 矢量作用时间计算
- 驱动生成
Clarke变换和计算角度
这里用模块搭了Clarke变换的公式:
[ v α v β ] = 2 3 [ 1 − 1 2 − 1 2 0 3 2 − 3 2 ] [ v a v b v c ] \left[ \begin{matrix} v_\alpha \\ v_\beta \end{matrix} \right] = \frac{2}{3} \left[ \begin{matrix} 1 & -\frac{1}{2} & -\frac{1}{2}\\ 0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \end{matrix} \right] \left[ \begin{matrix} v_a \\ v_b \\ v_c \end{matrix} \right] [vαvβ]=32[10−2123−21−23] vavbvc
对转换结果进行atan2计算,获得角度:
θ
=
a
t
a
n
2
(
v
β
v
α
)
\theta = atan2 \left( \frac{v_\beta}{v_\alpha} \right)
θ=atan2(vαvβ)
然后进行了弧度-角度转换。
确定扇区
atan2得到的角度(-180°,180°]
。把[0-60°)
定义为扇区1,…
具体代码如下:
然后对模块的输出做了1~6的限幅。
function sector = fcn(angle)
if(angle>=0 && angle <60)
sector = 1;
elseif angle>=60 && angle <120
sector = 2;
elseif angle>=120 && angle <180
sector = 3;
elseif angle>=-180 && angle <-120
sector = 4;
elseif angle>=-120 && angle <-60
sector = 5;
elseif angle>=-60 && angle <0
sector = 6;
else
sector = 0;
end
确定矢量作用时间
就是三角形边长的关系,基于Vref,计算t1和t2。其中,
T
s
=
t
1
+
t
2
+
t
0
T_s=t_1+t_2+t_0
Ts=t1+t2+t0,Ts
为开关周期,在模型中归一化处理,因此Ts=1
。t1
是矢量1作用时间,t2
是矢量2作用时间,t0
是零矢量作用时间。
v
⃗
r
e
f
=
V
⃗
1
t
1
+
V
⃗
2
t
2
\vec{v}_{ref}=\vec{V}_{1}t_1+\vec{V}_{2}t_2
vref=V1t1+V2t2
3
2
v
r
e
f
s
i
n
(
12
0
∘
)
=
V
1
t
1
s
i
n
[
6
0
∘
−
(
θ
−
(
n
−
1
)
⋅
s
e
c
t
o
r
⋅
6
0
∘
)
]
=
V
2
t
2
s
i
n
(
θ
−
(
n
−
1
)
⋅
s
e
c
t
o
r
⋅
6
0
∘
)
\frac{\frac{3}{2}v_{ref}}{sin(120^\circ)} = \frac{V_{1}t_1}{sin[60^\circ-(\theta-(n-1)\cdot sector\cdot 60 ^\circ)]} =\frac{V_{2}t_2}{sin(\theta-(n-1)\cdot sector\cdot 60 ^\circ)}
sin(120∘)23vref=sin[60∘−(θ−(n−1)⋅sector⋅60∘)]V1t1=sin(θ−(n−1)⋅sector⋅60∘)V2t2
对于其他扇区,可以看成旋转n-1
个扇区回到扇区1,再进行计算。
(如果矢量V1作用整个周期Ts,得到的电压为
V
⃗
1
\vec{V}_{1}
V1,等比例换算,作用时间t1,得到的电压为
V
⃗
1
t
1
\vec{V}_{1}t_1
V1t1,注意上图中描述的归一化处理)
根据公式搭建计算t1和t2的模块如下,其中,amp
输入为
a
m
p
=
V
r
e
f
V
d
c
amp=\frac{Vref}{Vdc}
amp=VdcVref。
调制波形生成
七段式的开关波形和作用时间分配如下:
我们知道了两个矢量作用的时间(零矢量作用时间:t0=1-t1-t2
)便可以使用下图中的调制方式来实现这个七段式的波形,因此只要计算三个值,tmin/tmid/tmax
其他扇区只是把tmin/tmid/tmax
做了互相交换,六个扇区的开关波形如下:
根据这个交换规则,代码如下:
function [cmp1, cmp2, cmp3]= fcn(sector, t1, t2)
%对于扇区1、3、5,首先起作用的是矢量1,t1对应矢量1
%而对于扇区2、4、6,首先起作用的是矢量2
%因此,t1对应矢量2,t2对应矢量1,所以需要交换一下。
if sector == 2 || sector == 4 || sector == 6
temp = t1;
t1 = t2;
t2 = temp;
end
t0 = 1 - t1 - t2;
% 调制时,占空比和t的大小成反比,因此需要使用1-t
tmax = 1 - (t0/2 + t1 + t2);
tmid = 1- (t0/2 + t2);
tmin = 1- (t0/2);
if sector == 1
cmp1 = tmax;
cmp2 = tmid;
cmp3 = tmin;
elseif sector == 2
cmp1 = tmid;
cmp2 = tmax;
cmp3 = tmin;
elseif sector == 3
cmp1 = tmin;
cmp2 = tmax;
cmp3 = tmid;
elseif sector == 4
cmp1 = tmin;
cmp2 = tmid;
cmp3 = tmax;
elseif sector == 5
cmp1 = tmid;
cmp2 = tmin;
cmp3 = tmax;
elseif sector == 6
cmp1 = tmax;
cmp2 = tmin;
cmp3 = tmid;
else
cmp1 = 0;
cmp2 = 0;
cmp3 = 0;
end
end
注意奇数扇区和偶数扇区的矢量作用顺序不同(因此代码中对偶数扇区的t1和t2进行了交换),如下:
这个matlab function模块输出的cmp1~3
,与三角载波比较后,就获得了三个半桥的上管的驱动信号。
我们说的马鞍形调制波信号,就是指
cmp1~3
。
文章来源:https://www.toymoban.com/news/detail-454633.html
简单验证
用一个三相半桥逆变器进行验证,开环运行。
设定的相电压幅值在最左侧,30V,电源电压100V,相除后,作为归一化的幅值,输入给SVPWM模块。SVPWM模块的输出直接驱动三个上管,取反后,驱动三个下管(应该要加上死区,但是仿真中不加入死区似乎也没问题)。
可以看到输出电压的相位和参考电压相同,相电压幅值为30V。
文章来源地址https://www.toymoban.com/news/detail-454633.html
一些补充信息
- 在
library browser
搜索space vector modulator
就可以找到官方的模块Simscape / Electrical / Specialized Power Systems / Electric Drives / Fundamental Drive Blocks
,右键-Mask-Look Under Mask
可以看下这个模块的实现方式。[模块文档](Implement space vector modulator for PWM VSI AC motor drive - Simulink (mathworks.com))
- 逆变器仿真模型放在 matlabsimulink开环控制的SVPWM调制的三相半桥逆变器-嵌入式文档类资源-CSDN文库
到了这里,关于SVPWM空间矢量调制模块的matlab仿真2:仿真模型搭建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!