基于SIMULINK的空间矢量脉宽调制SVPWM的建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)
文中涉及的仿真模型可在公众号 iFTrue未来已来 中获取:
请扫描下方二维码关注微信公众号:iFTrue 未来已来
在公众号后台回复以下关键字获取SVPWM仿真模型:SVPWM模型
目录:
1.1 基于C语言的SIMULINK仿真模型
1.2 基于SVPWM模块的仿真
1.1 基于C语言的SIMULINK仿真模型
使用C语言在MATLAB/SIMULINK中仿真,需要借助s-function builder模块实现。七段式SVPWM仿真模型如图1-1所示。仿真解算器(Solver)选择变步长(Variable-step)、ode23,最大仿真步长(Max step size)设置为1e-6,其余参数保持默认值。模型参数具体设置为:直流母线电压Udc = 100V,Ualpha = 50sin50ωt,Ubeta = 50cos50ωt,PWM开关周期Ts取为0.0001s(对应开关频率10kHz),则对应的仿真模型中PWM一个周期计数值Tcnt=15000(假设实际DSP的PWM外设时钟频率为150MHz,则Tcnt = 150MHz/10kHz = 15000)。
图1-1 SVPWM仿真模型
双击Sfunction builder模块设置(即图1-1中的SVPWM),首先填写S-function name:SVM,然后在Initialization选项卡中选择Sample mode为Discere,意味着使用离散采样模式,在Sample time value中设置采样周期,这里采用1e-4(单位:秒,这里与PWM开关周期设置为同一时间),如图1-2所示。
图1-2 Initialization选项卡设置
Data Properties选项卡用来设置模块的输入/输出接口。首先选择Input Ports子选项卡进行输入接口设置,分别添加名为“Ualpha”、“Ubeta”、“Udc”、“Tcnt”的4路输入接口,如图1-3所示。然后选择Output Ports子选项卡进行输出接口设置,添加名为“Tcm”的3维度输出接口和名为“Sec”的扇区输出接口,如图1-4所示。
图1-3 Initialization选项卡设置
图1-4 Data Properties选项卡Output Ports设置
Librabies选项卡用来指定所需的源文件、头文件、库文件等,如图1-5所示,在左侧窗口用来指定头文件路径和C源文件(含路径)。这里举例头文件路径为:INC_PATH ../Include;源文件为:SRC_PATH ../Source Svpwm.c。
图1-5 Libraries选项卡设置
Ouputs选项卡中用来写测试用的代码(C语言),一般格式为:1,将模块输入量赋值给测试代码接口;2,调用相关计算函数;3,将计算结果或测试变量赋值给输出接口。具体视实际项目需要而定,如图1-6所示,另外,所需的SVPWM核心代码为I_Svpwm.c和I_Svpwm.h,需要将这两个文件分别放入Library中指定的路径下。Ouputs选项卡中测试代码举例如下:
#include "Svpwm.h"
static SVPWM Svpwm = SVPWM_DEFAULTS;Svpwm.Input.Ualpha = Ualpha[0];
Svpwm.Input.Ubeta = Ubeta[0];
Svpwm.Input.Udc = Udc[0];
Svpwm.Input.Tcnt = Tcnt[0];
Svpwm.Calc(&Svpwm);
Tcmp[0] = Svpwm.Output.Tcm1;
Tcmp[1] = Svpwm.Output.Tcm2;
Tcmp[2] = Svpwm.Output.Tcm3;
图1-6 Outputs选项卡设置
最后,在配置完成并将相关被测试代码(I_Svpwm.c和I_Svpwm.h)放置到相关文件夹(Include和Source)后,点击界面右上角的Build按钮进行代码编译,在系统提示无错误无警告后即可进行仿真,如图1-7所示。
图1-7 编译完成提示信息
SVPWM程序如下:
1)Svpwm.h:
#ifndef __SVPWM_H__
#define __SVPWM_H__// Input interface
typedef struct { float Ualpha;float Ubeta;float Udc;unsigned int Tcnt;
} SVPWM_INPUT;#define SVPWM_INPUT_DEFAULTS { 0,\0,\0,\1 \
}// Output interface
typedef struct { float Tcm1;float Tcm2;float Tcm3;
} SVPWM_OUTPUT;#define SVPWM_OUTPUT_DEFAULTS { 0,\0,\0 \
}// Temporary variables
typedef struct { unsigned int A;unsigned int B;unsigned int C; unsigned int Sector;float X;float Y;float Z;float T1;float T2;float T3;float Ta;float Tb;float Tc;float M;
} SVPWM_TEMP;#define SVPWM_TEMP_DEFAULTS { 0,\0,\0,\0,\0,\0,\0,\0,\0,\0,\0,\0,\0,\0 \
}// Struct of space vector PWM
typedef struct { SVPWM_INPUT Input;SVPWM_OUTPUT Output;SVPWM_TEMP Temp;void (*Calc)();
} SVPWM;#define SVPWM_DEFAULTS { SVPWM_INPUT_DEFAULTS,\SVPWM_OUTPUT_DEFAULTS,\SVPWM_TEMP_DEFAULTS,\(void (*)(long))SvpwmGen \
}// Function declaration
void SvpwmGen(SVPWM *);
#endif
2)Svpwm.c:
#include "Svpwm.h"void SvpwmGen(SVPWM *Var)
{float TempT1, TempT2;if(Var->Input.Ubeta > 0){Var->Temp.A = 1;}else{Var->Temp.A = 0;}if((1.732 * Var->Input.Ualpha - Var->Input.Ubeta) > 0){Var->Temp.B = 1;}else{Var->Temp.B = 0;}if((1.732 * Var->Input.Ualpha + Var->Input.Ubeta) < 0){Var->Temp.C = 1;}else{Var->Temp.C = 0;}Var->Temp.Sector = Var->Temp.A + 2 * Var->Temp.B + 4 * Var->Temp.C; Var->Temp.X = 1.732 * Var->Input.Ubeta * Var->Input.Tcnt / Var->Input.Udc;Var->Temp.Y = (1.5 * Var->Input.Ualpha + 0.866 * Var->Input.Ubeta) \* Var->Input.Tcnt / Var->Input.Udc;Var->Temp.Z = (-1.5 * Var->Input.Ualpha + 0.866 * Var->Input.Ubeta) \* Var->Input.Tcnt / Var->Input.Udc;switch(Var->Temp.Sector){ case 1:Var->Temp.T1 = Var->Temp.Z;Var->Temp.T2 = Var->Temp.Y;break;case 2:Var->Temp.T1 = Var->Temp.Y;Var->Temp.T2 = -Var->Temp.X;break; case 3:Var->Temp.T1 = -Var->Temp.Z;Var->Temp.T2 = Var->Temp.X;break;case 4:Var->Temp.T1 = -Var->Temp.X;Var->Temp.T2 = Var->Temp.Z;break; case 5:Var->Temp.T1 = Var->Temp.X;Var->Temp.T2 = -Var->Temp.Y;break;case 6:Var->Temp.T1 = -Var->Temp.Y;Var->Temp.T2 = -Var->Temp.Z;break;default:break;}if((Var->Temp.T1+Var->Temp.T2) > Var->Input.Tcnt){TempT1 = Var->Temp.T1;TempT2 = Var->Temp.T2;Var->Temp.T1 = (TempT1 / (TempT1 + TempT2)) * Var->Input.Tcnt;Var->Temp.T2 = (TempT2 / (TempT1 + TempT2)) * Var->Input.Tcnt;}Var->Temp.Ta = (Var->Input.Tcnt - Var->Temp.T1 - Var->Temp.T2) * 0.25;Var->Temp.Tb = Var->Temp.Ta + Var->Temp.T1 * 0.5;Var->Temp.Tc = Var->Temp.Tb + Var->Temp.T2 * 0.5;switch(Var->Temp.Sector){case 1:Var->Output.Tcm1 = Var->Temp.Tb;Var->Output.Tcm2 = Var->Temp.Ta;Var->Output.Tcm3 = Var->Temp.Tc;break;case 2:Var->Output.Tcm1 = Var->Temp.Ta;Var->Output.Tcm2 = Var->Temp.Tc;Var->Output.Tcm3 = Var->Temp.Tb;break;case 3:Var->Output.Tcm1 = Var->Temp.Ta;Var->Output.Tcm2 = Var->Temp.Tb;Var->Output.Tcm3 = Var->Temp.Tc;break;case 4:Var->Output.Tcm1 = Var->Temp.Tc;Var->Output.Tcm2 = Var->Temp.Tb;Var->Output.Tcm3 = Var->Temp.Ta;break;case 5:Var->Output.Tcm1 = Var->Temp.Tc;Var->Output.Tcm2 = Var->Temp.Ta;Var->Output.Tcm3 = Var->Temp.Tb;break;case 6:Var->Output.Tcm1 = Var->Temp.Tb;Var->Output.Tcm2 = Var->Temp.Tc;Var->Output.Tcm3 = Var->Temp.Ta;break;default:break;}
}
为了验证算法的正确性,图1-8给出了SVPWM 算法的仿真结果。由图1-8(a)可知,扇区N值为3→1→5→4→6→2且交替出现,与表1-4所示的结果相同;由图1-8(b)可知,由SVPWM算法得到的调制波呈马鞍形,这样有利于提高直流电压利用率,有效抑制谐波。
(a) 扇区计算结果
(b) 切换点(调制波)Tcmp1、Tcmp2、Tcmp3波形
图1-8 基于C语言的SVPWM仿真结果
1.2 基于SVPWM模块的仿真
上一小节是根据SVPWM算法的基本工作原理搭建的SVPWM模块,可使读者更加深入地了解SVPWM算法的工作原理和实现方法,同时,基于C语言的仿真具有移植到微控制器(如DSP)快,无须修改等特点。另外MATLAB/SIMULINK内提供了SVPWM模块(所在位置:Simscape SimPowerSystems Specialized Technology Control and Measurements Library Pulse &. Signal Generators SVPWM Generator (2-Level))。
下面就该模块的参数设置作以详细说明。
1、Data type of input reference vector (Uref)(参考电压矢量输入类型)
Data type of input reference vector (Uref)(参考电压矢量输入类型)的下拉列表中包括3种类型:Magnitude-Angle (rad)(电压的幅值和相角)、alpha-beta components(静止坐标系下α-β分量)和Internally generated(内部模式)。
1) Magnitude-Angle (rad)(电压的幅值和相角):当选择Magnitude-Angle(rad)时,SVPWM模块显示如图1-9所示。值得说明的是,电压的幅值|u|采用的是标么值(0 <|u|< l)而非实际值,电压的相角∠u的单位为弧度(rad)。
图1-9 选择Magnitude-Angle (rad) 时SVPWM模块
2) alpha-beta components(静止坐标系下α-β分量):当选择alpha-beta components时,SVPWM模块显示如图1-10所示。需要说明的是,静止坐标系下的α-β分量Uα、Uβ采用的同样是标么值而非实际值。
图1-10 选择alpha-beta components 时SVPWM模块
3) Internally generated(内部模式):当选择Internally generated时,SVPWM模块显示如图1-11所示。采用该类型时不需要外部变量的输入,只须在该界面对调制度、相位和频率进行设置。值得说明的是,输出电压的相位(Phase)的单位是电角度(°)而不是弧度(rad)。
图1-11 选择Internally generated 时SVPWM模块
2、Switching pattern(开关模式)
SVPWM 模块中包含两种开关模式:Pattern #1和Pattern #2。实际上,Pattern #1模式就是七段式SVPWM,而Pattern #2模式就是五段式SVPWM,关于两者的基本工作方式在1.1.6节已进行详细论述,此处不再赘述。
3、PWM frequency(Hz)(PWM开关频率)
此处用来设置PWM开关频率(三角载波)fpwm,它与开关周期Tpwm的关系为
4、Sample time(采样时间)
此处用来设置SVPWM模块的采样时间,单位为秒(s),设置0时代表连续采样。
最后,使用SVPWM Generator (2-Level)模块搭建仿真模型,如图1-12所示。参数设置为 Ualpha = 0.7sin50ωt,Ubeta = 0.7cos50ωt,PWM开关频率为10kHz,如图1-13所示。SVPWM Generator (2-Level)模块的输出P为6路PWM驱动波形,为了验证正确性,在输出端添加低通滤波器(实际使用中无须滤波器),其截止频率要设置在开关频率10kHz以下。
图1-12 基于SVPWM Generator (2-level) 的仿真模型
图1-13 SVPWM Generator (2-level) 参数设置
SVPWM输出的6路波形为等幅不等宽的脉冲,其经过低通滤波器滤掉开关频次的谐波后应该呈马鞍波状,取Sa、Sb、Sc三路观测,其相位互差120°,如图1-14所示。
图1-14 SVPWM三路驱动波形Sa、Sb、Sc滤波后的马鞍波
基于SIMULINK的空间矢量脉宽调制SVPWM的建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)相关推荐
- 应用随机过程张波商豪_学术简报五相逆变器非正弦双随机空间矢量脉宽调制策略...
征稿 中国电工技术学会电机与系统学报(英文季刊) ☝ 点击上面标题查看详情 招聘 中国电工技术学会招聘学术期刊编辑 ☝ 点击上面标题查看详情 摘要 南京航空航天大学多电飞机电气系统工信部重点实验室 ...
- 频率统计表用c语言_空间矢量脉宽调制建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)...
文末有仿真模型下载方式 1.1 基于C语言的SIMULINK仿真模型 使用C语言在MATLAB/SIMULINK中仿真,需要借助s-function builder模块实现.七段式SVPWM仿真模型如 ...
- matlab 电压矢量开关,解析电压空间矢量研究及Matlab仿真
EDA365欢迎您登录! 您需要 登录 才可以下载或查看,没有帐号?注册 x 近年来,电机的空间矢量理论被引入到逆变器及其控制中,形成和发展了空间矢量PWM(SVPWM)控制思想.其原理就是利用逆变器 ...
- matlab 电压矢量开关,电压空间矢量研究及Matlab仿真
近年来,电机的空间矢量理论被引入到逆变器及其控制中,形成和发展了空间矢量PWM(SVPWM)控制思想.其原理就是利用逆变器各桥臂开关控制信号的不同组合,使逆变器输出电压空间矢量的运行轨迹尽可能接近圆形 ...
- 【PMSM矢量控制系列】空间矢量调制技术
正弦脉宽调制-SPWM 随着现代电力电子器件的发展,仅改变电压幅度的变频器输出电压PAM(Pulse Amplitude Modulation)控制方式已让位于输出电压调宽不调幅的脉宽调制PWM(Pu ...
- 五相同步电机matlab模型,五相永磁同步电机空间矢量PWM控制系统MATLAB仿真
第 56 卷 第 11 期 Vol. 56 No. 11 2018 年 11 月 November 2018 农业装备与车辆工程 AGRICULTURAL EQUIPMENT & VEHICL ...
- 火车售票系统(基于UML的软件分析与设计模型建模实验)
火车售票系统(基于UML的软件分析与设计模型建模试验) 文章目录 火车售票系统(基于UML的软件分析与设计模型建模试验) 一.需求 二.UML用例图 三.UML类图 四.UML时序图 一.需求 实现一 ...
- SVPWM空间矢量调制模块的matlab仿真2:仿真模型搭建
接上一篇:SVPWM空间矢量调制模块的matlab仿真1:理论部分_Fantasy237的博客-CSDN博客 SVPWM空间矢量调制模块的matlab仿真2:仿真模型搭建 仿真模型 仿真模型框图如下. ...
- SVPWM 三相逆变器电压空间矢量调制 初入门
1.引言 首先需要说明的是 ,本文只适用于初入门的人看,因为本文并不涉及具体怎么实现的,只涉及到原理讲解,规避了具体怎么实现. SVPWM的思想起源于交流异步电机变频调速.但这种调制方法现在已经广泛用 ...
最新文章
- 计算节点宕机了怎么办?- 每天5分钟玩转 OpenStack(43)
- 米的建站日记(2014年12月18日)
- MySQL数据库:完整性约束
- MATLAB入门级知识
- 音频处理七:(极坐标转换)
- VS2013崩溃,无法打开项目的解决方案
- python增删改查csv文件_【练习】Python第四次:实现对文件的增删改查
- ruby on rails连接mysql_ruby on rails 连接mysql数据库
- (21)Xilinx FPGA开发软件(FPGA不积跬步101)
- 问题四十:对ray tracing圆环图形进行debug(2)——C++,用“笛卡尔”方法解一元四次方程
- Python爬取天气信息
- Julia: 关于Array排序函数sortslices
- 凸优化第四章凸优化问题 4.7向量优化
- win10计算机不分区,win10有必要分区吗
- windows cmd中的%~dp0
- Laravel文档阅读笔记-Custom Authentication Login And Registration Using Laravel 8
- 富途牛牛api_k牛刮毛是改善API的好方法
- 使用openssl命令 生成指定有效时间的ssl证书,cer格式
- ROS学习记录(二)玩转海龟——海龟保姆级教程
- vue实现循环滚动图片