电机控制中空间矢量脉宽调制SVPWM与simulink仿真详解
介绍电机控制中SVPWM的作用、原理以及在Simulink中搭建仿真。通过模型和代码分别实现,最后用C语言写一段单片机中可中使用的SVPWM算法,供大家参考。
创作不易,点赞收藏暴富。
1.SVPWM原理
空间矢量脉宽调制(SVPWM:Space Vector Pulse Width Modulation)算法是从电动机的角度出发,目的在于使交流电动机产生圆形磁场。它以三相对称正弦波电源(其电压和频率值均为电动机的额定值)供电时交流电动机产生的理想磁链圆为基准,通过选择逆变器的不同开关模式,使电动机的实际磁链尽可能逼近理想磁链圆,从而产生 SVPWM 波。由于磁链的轨迹是靠电压空 间矢量相加得到的,故也称之为“电压空间矢量 控制”。 SVPWM 技术实际就是在一个设定的采 样周期内,根据参考电压矢量所在的区间位置,选择与之相邻的两个基本电压空间矢量以及零电 压矢量来合成参考电压空间矢量,如图 1所示。
这里说明一下:SVPWM的标准输入一般为相位相差90°的正弦波Ualfa,Ubeta,输出马鞍波,马鞍波和三角载波产生PWM信号控制逆变器6个开关。(三对互补开关)
三相逆变器:
这6个开关在某一时刻(如S1和S2同一时间必有且只有一个通)一共有2*2*2=8种不同的状态,把以上8种开关状态分别称为状态0,1,2,3,4,5,6,7,用这8个基本电压矢量去逼近圆,会在三相逆变桥输出端得到三相正弦电压波形。
把UVW电压看成矢量如下图
当8个开关状态中UWV都是1或者都是0的时候,那么合成的矢量抵消,即为0。其余6个状态可以组成6个不同方向的矢量(如U=W=1,V=0,矢量指向WU的角平分线)。
选择这些基本电压矢量相邻的两个再进行细分,就可以得到更多的电压矢量,矢量的大小就可以用开关通的时间来控制,这样就可以通过对三相电压导通时间的控制转而得到各个方向的电压矢量,如下图:
2 控制实现
实现过程分为3个阶段
1 扇区判断
2 计算开关电压矢量作用的时间
3 计算空间矢量比较器的切换点
总的系统仿真如下图
2.1 判断当前电压所在的扇区
知道的当前的扇区就可以通过相邻的两个电压矢量进行合成
根据如下三相到两相坐标变换矩阵:
把三相电压变成两相电压即前文所说的输入
再通过其逆变换求得Vref1 Vref12 Vref3
若Vref1 >0,则 A=1,否则 A=0;
若Vref2 >0,则 B=1,否则 B=0;
若Vref3 >0,则 C=1,否则 C=0;
扇区号 N=4×C+2×B+A
仿真搭建如下:
模块说明:
2.2 计算开关电压矢量作用的时间
首先定义变量 X,Y,Z
则各个扇区里相邻的两个电压矢量作用的时 间比 t1,t2。如表 1 所示
当出现 T-t1-t2≥0 时,取 t1=t1,t2=t2
当出现 T-t1-t2﹤0 时,取 t1=t1×T/(t1+t2),t2=t2 ×T/(t1+t2),T 为脉冲周期
仿真搭建如下:
模块说明
2.3 计算空间矢量比较器的切换点
开关状态通常情况下是通过这个周期内的脉冲的占空比调节 的,也就是说通过调节时间管理器的定时器的占空比调节开关器件的闭合断开时间,计算占空比的计算方法如下
这三个ton根据电压矢量所处的扇区来确定,以第一扇区为例:
再根据下表就能得到空间矢量比较器的切换点
仿真搭建如下:
2.4 逆变器如下图
3 仿真结果
需要根据实际情况设置PWM周期和载波频率。
此处观察马鞍波
点赞收藏不断更谢谢谢谢谢谢!!!!!!!!!
4 代码实现
用到MATLAB Function模块 双击编辑代码
作用时间计算:
function [S,t1,t2] = fcn(Us_alfa,Us_beta,Udc,T0)
% This block supports an embeddable subset of the MATLAB language.
% See the help menu for details.
%--------------------为了方便推导作用时间做出的设定值------------------------
X=sqrt(3)*T0*Us_beta/Udc;
Y=sqrt(3)/2*T0*Us_beta/Udc+3/2*T0*Us_alfa/Udc;
Z=sqrt(3)/2*T0*Us_beta/Udc-3/2*T0*Us_alfa/Udc;
%--------------------------------扇区值判断---------------------------------
%Uref1*sqrt(3)
%(Uref1+Uref2)*sqrt(3)
%(Uref1+Uref3)*sqrt(3)
%--------------------------------------------------------------------------
if(Us_beta>0) %Uref1>0A=1;
elseA=0;
end
if((sqrt(3)*Us_alfa-Us_beta)>0) %Uref2>0B=1;
elseB=0;
end
if((-sqrt(3)*Us_alfa-Us_beta)>0) %%Uref3>0C=1;
elseC=0;
end
N=A+2*B+4*C; %扇区值N,而不是扇区编号!!!!!!!
%--------------------------------------------------------------------------
%-----------------------------------分割线----------------------------------%-----------------------------矢量作用时间计算-------------------------------
%--------------------------------S为扇区编号-------------------------------
switch(N)case 1S=2;%----------------------扇区编号S---------------------------t1=Z; t2=Y; case 2S=6;t1=Y; t2=-X;case 3S=1;t1=-Z; t2=X;case 4S=4;t1=-X; t2=Z;case 5S=3;t1=X; t2=-Y;case 6S=5;t1=-Y; t2=-Z;otherwiseS=1;t1=0; t2=0;
end
%--------------------------------------------------------------------------
%-----------------------------是否需要调制判断------------------------------
if((t1+t2)>T0)t11=t1*T0/(t1+t2);t21=t2*T0/(t1+t2);t1=t11;t2=t21;t0=0;
else
t0=T0-t1-t2;
end
%--------------------------------------------------------------------------
PWM:
function PWM =fcn(S,t1,t2,time,T0)
% This block supports an embeddable subset of the MATLAB language.
% See the help menu for details.
%------------------------------普通定义电压---------------------------------
%U0=[0 0 0];U1=[1 0 0];U2=[1 1 0];U3=[0 1 0];
%U4=[0 1 1];U5=[0 0 1];U6=[1 0 1];U7=[1 1 1];
%------------------------由上可得八种电压输出信号控制(每种后面取反)---------
U0=[0 1 0 1 0 1];U1=[1 0 0 1 0 1];U2=[1 0 1 0 0 1];U3=[0 1 1 0 0 1];
U4=[0 1 1 0 1 0];U5=[0 1 0 1 1 0];U6=[1 0 0 1 1 0];U7=[1 0 1 0 1 0];
%----------------------------此处采用二进制定义电压--------------------------
%U0=[0 0 0];U1=[0 0 1];U2=[0 1 0];U3=[0 1 1];
%U4=[1 0 0];U5=[1 0 1];U6=[1 1 0];U7=[1 1 1];
%------------------------由上可得八种电压输出信号控制(每种后面取反)---------
%U0=[0 1 0 1 0 1];U1=[0 1 0 1 1 0];U2=[0 1 1 0 0 1];U3=[0 1 1 0 1 0];
%U4=[1 0 0 1 0 1];U5=[1 0 0 1 1 0];U6=[1 0 1 0 0 1];U7=[1 0 1 0 1 0];
%--------------------------------------------------------------------------
%----------------------为了方便确定扇区切换时间设定的Tx、Ty、Tz---------------
t0=T0-t1-t2;
Ta=t0/4;
Tb=Ta+t1/2;
Tc=Tb+t2/2;
t=rem(time,T0);%t=时间time/周期Ts的余数 即在每个周期内作用的时间轴时间t
G=U0;
%------------------------------扇区编号S------------------------------------
%-------------------------------分割线--------------------------------------
switch (S)case 1G1=U1;G2=U2;case 2G1=U3;G2=U2;case 3G1=U3;G2=U4;case 4G1=U5;G2=U4;case 5G1=U5;G2=U6;case 6G1=U1;G2=U6;otherwiseG1=U0;G2=U7;
end
%---------------------------七步分量法--------------------------------------
if (t<Ta)G=U0;
elseif((t>=Ta)&&(t<Tb))G=G1;
elseif((t>=Tb)&&(t<Tc))G=G2;
elseif((t>=Tc)&&(t<(T0-Tc)))G=U7;
elseif((t>=(T0-Tc))&&(t<(T0-Tb)))G=G2;
elseif((t>=(T0-Tb))&&(t<(T0-Ta)))G=G1;
elseif((t>=(T0-Ta))&&(t<T0))G=U0;
end
PWM=G;
end
点赞收藏不断更谢谢谢谢谢谢!!!!!!!!!
5 C语言实现
int A,B,C;int cTime1,cTime2,T0;int Cos_Teta ,Sin_Teta ;int Ua,Ub,Uc,Ualfa,Ubeta;int Va,Vb,Vc;int sector ;int t1,t2;INT taon ,tbon ,tcon Ualfa = ((Ud) * Cos_Teta - (Uq) * Sin_Teta) >> 12;Ubeta = ((Ud) * Sin_Teta + (Uq) * Cos_Teta) >> 12;-------------------------------------------Ua = Ualfa;Ub = -(Ualfa >> 1) + (((Ubeta) * 0x0ddb)>>12);Uc = -(Ualfa >> 1) - (((Ubeta) * 0x0ddb)>>12);Va = Ubeta;Vb = -(Ubeta >> 1) + (((Ualfa) * 0x0ddb)>>12);Vc = -(Ubeta >> 1) - (((Ualfa) * 0x0ddb)>>12);if ( Va > 0 ) A = 1;else A = 0;if ( Vb > 0 ) B = 1;else B = 0;if ( Vc > 0 ) C = 1;else C = 0;sector = A + ( B << 1) + ( C << 2 );switch(sector){case 1:t1 = -Vb;t2 = -Vc;break;case 2:t1 = -Vc;t2 = -Va;break;case 3:t1 = Vb;t2 = Va;break;case 4:t1 = -Va;t2 = -Vb;break;case 5:t1 = Va;t2 = Vc;break;case 6:t1 = Vc;t2 = Vb;break;default:break;}if ((t1 + t2) > T0){cTime1 = ((T0* (t1)) / ( t1 + t2 ));cTime2 = ((T0* (t2)) / ( t1 + t2 ));t1 = cTime1;t2 = cTime2;}taon = (T0- t1 - t2 ) >> 1;tbon = taon + t1;tcon = tbon + t2;switch(sector){case 1://pwm1Abreak;case 2://pwm1Bbreak;case 3://pwm2Abreak;case 4://pwm2Bbreak;case 5://pwm3Abreak;case 6://pwm3Bbreak;default: break;}//_________________________________________________
点赞收藏不断更谢谢谢谢谢谢!!!!!!!!!
电机控制中空间矢量脉宽调制SVPWM与simulink仿真详解相关推荐
- SVPWM控制技术+Matlab/Simulink仿真详解
文章目录 前言 一.SVPWM的控制原理 二.空间矢量的概念 三.电压与磁链空间矢量的关系 四.三相逆变器的基本电压空间矢量 五.SVPWM 算法的合成原理 六.SVPWM 算法推导 6.1.七段式S ...
- 基于SIMULINK的空间矢量脉宽调制SVPWM的建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)
文中涉及的仿真模型可在公众号 iFTrue未来已来 中获取: 请扫描下方二维码关注微信公众号:iFTrue 未来已来 在公众号后台回复以下关键字获取SVPWM仿真模型:SVPWM模型 「 iFTrue ...
- 应用随机过程张波商豪_学术简报五相逆变器非正弦双随机空间矢量脉宽调制策略...
征稿 中国电工技术学会电机与系统学报(英文季刊) ☝ 点击上面标题查看详情 招聘 中国电工技术学会招聘学术期刊编辑 ☝ 点击上面标题查看详情 摘要 南京航空航天大学多电飞机电气系统工信部重点实验室 ...
- 永磁同步直流无刷电机空间矢量SPWM,SVPWM
虽然现在做自动驾驶去了,还是有必要把之前一年做电机控制的心得分享一下,也能方便自己日后的参考. (以下针对反向电动势为正弦的永磁同步电机而言) 目录: 1. SPWM和SVPWM 2. 矢量控制(Sp ...
- SVPWM空间矢量调制模块的matlab仿真2:仿真模型搭建
接上一篇:SVPWM空间矢量调制模块的matlab仿真1:理论部分_Fantasy237的博客-CSDN博客 SVPWM空间矢量调制模块的matlab仿真2:仿真模型搭建 仿真模型 仿真模型框图如下. ...
- 电机控制中的传感器与测速原理
一.传感器与测速原理 在做电机控制中速度检测的是否准确是直接影响系统的控制精度的,目前测速有两种1:模拟测速(这里不做说明)2:数字测速----霍尔位置传感器和旋转编码器.这是大的分类.而霍尔传感器的 ...
- Java中print、printf、println的区别 详解
Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...
- STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- 站长在线Python精讲:在Python中使用正则表达式的sub()方法替换字符串详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用正则表达式的sub()方法替换字符串详解>. 在Python中使用正则表达式的sub()方法替换字符串. ...
- 站长在线Python精讲:在Python中使用正则表达式的split()方法分割字符串详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用正则表达式的split()方法分割字符串详解>. 使用正则表达式分割字符串 在Python中使用正则表达 ...
最新文章
- 如何优雅地拿到30k月薪的offer?这几个大咖就是来帮你搞定薪水和面试官的
- 机器学习的数学基础 - 期望,方差与协方差
- Oauth2认证以及新浪微博开放平台应用
- 比较常用的几个正则表达式
- C#中使用OpenGL(API)创建OpenGL渲染环境
- 设计模式的分类和六大设计原则
- BugkuCTF-MISC题做个游戏
- 软件设计中架构和框架的区别
- nginx+thinkphp下解决不支持pathinfo模式以及存在的各种404,500问题
- python的第三方库是干什么用的-Python最强大的第三方库,你有必要了解一下!
- 理解 Visual C++ 应用程序的依赖项(msdn)
- tkinter 文本框 值改变_【动图详解】PPT中文本框的使用方法,初学者必看!
- 【Android 教程系列第 1 篇】如何用 Android Studio 查看项目的包名
- 用ruby编写标准计算器_WatirMaker再次用Ruby编写
- 一个检测PC机软硬件系统信息的工具——EVEREST
- fastapi框架tortoise-orm运用
- clamav --reload 加载病毒库源码分析
- 稀疏近似最近点(SANP)
- 打工皇帝唐骏做局 紫金庄家出货手法大曝光
- 程序员转型书商 年交易额千万元