Matlab SVPWM仿真模型

article/2025/10/18 18:45:22

文中涉及的仿真模型可在公众号 iFTrue未来已来 中获取:

请扫描下方二维码关注微信公众号:iFTrue 未来已来

在公众号后台回复以下关键字获取SVPWM仿真模型:SVPWM模型

「 iFTrue 未来已来 」

 


 

目录

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) 切换点(调制波)Tcmp1Tcmp2Tcmp3波形

图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所示。需要说明的是,静止坐标系下的α-β分量采用的同样是标么值而非实际值。

图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滤波后的马鞍波


http://chatgpt.dhexx.cn/article/EL0jZdcs.shtml

相关文章

SVPWM调制的simulink仿真

1、SVPWM的生成 在FOC矢量控制中&#xff0c;Id、Iq 经过PID输出Vd、Vq。Vd、Vq经过反park变换成Vα、Vβ。再Vα、Vβ合成空间参考矢量Uref。那么怎么根据Vα、Vβ确定Uref所在扇区&#xff0c;然后确定所在扇区两个非零基础矢量的作用时间呢。 1.1、传统的计算方法 1.1.1、…

电机专用SVPWM算法实现

SH33F2811包含三相电机的空间矢量脉宽调制&#xff08;Space Vector Pulse Width Modulation&#xff0c;SVPWM&#xff09;算法&#xff0c;对应于交流感应电机或永磁同步电机中的三相电压源逆变器的功率器件的一种特殊的开关触发顺序和脉宽大小的组合。这种开关触发顺序和组合…

小猫爪:PMSM之FOC控制04-SVPWM

小猫爪&#xff1a;PMSM之FOC控制04-SVPWM 1 SVPWM的引出2 SVPWM的原理3 SVPWM的推导4 仿真END 1 SVPWM的引出 在Park变换那一节&#xff0c;说到了可以通过控制Eq(Iq)和Ed(Id)来控制电机。而电流我们并不能直接控制&#xff0c;只能简介通过控制输出电压来控制电流&#xff0c…

SVPWM matlab建模

此为SVPWM算法的SIMULINK建模过程&#xff0c;没有具体的公式推导&#xff08;太多了&#xff0c;难打字&#xff09; abc为matlab自带的三相正弦波发生器&#xff0c;需要调整参数。 首先进行坐标变换 第一个fcn里的代码 function y fcn(a,b,c) y (2/3)*( a-0.5*b-0.5*c);%…

SVPWM算法的推导

博文默认采用恒幅值变换&#xff0c;若是用到恒功率变换的时候&#xff0c;会特别说明。推导过程其实有很多种&#xff0c;云龙混杂&#xff0c;看着看着自己就晕了&#xff0c;所以最好找一种自己好理解的。有关坐标变换的理论&#xff0c;参考坐标变化这篇博客 1.三相空间电…

svpwm理解

svpwm主要用于逆变器件的开关与导通&#xff0c;使得在电机内部形成圆形磁场。与spwm相比有诸多优点&#xff0c;中小功率的逆变器基本都采用svpwm进行逆变控制。 svpwm目的是在电机内部形成圆形磁场&#xff0c;磁场与电机内部合成电压的关系为正交&#xff0c;即合成电压为磁…

SimpleFOC(八)—— 理论+实践 深度分析SVPWM

目录 说明一、有感FOC控制原理二、SVPWM原理三、SimpleFOC&#xff08;不带电流采样&#xff09;的控制原理&#xff1a;四、SimpleFOC核心代码五、代码实验5.1、实验目的5.2、硬件准备5.3、修改代码 第一阶段5.3.1 打开例程5.3.2 修改代码5.3.3 验证上传5.3.4 电机观测5.3.5 修…

matlab查表svpwm,SVPWM的查表生成方式代码

昨天研究了传统的SVPWM生成方法之后 偶然看到了这个东西: 也就是说 SVPWM的占空比-角度的关系可以用分段函数进行表示 这样就简单多了 基本上通过查cos表+判断能避免浮点数运算 下面素程序www 结果输出到3个txt文件中,修改p的值可以算占空比(相电压)或者线电压... /* * SVPW…

svpwm的matlab模型,SVPWM的matlab仿真实现

在仿真之前您必须安装MATLAB7.0或以上版本&#xff0c;必须确保simpowersysm工具箱已被安装&#xff0c;如果以上要求已经达到&#xff0c;那么就可以执行以下步骤了&#xff1a; 步骤1&#xff1a;打开matlab主界面&#xff0c;然后在command window界面中的“>>”旁边输…

SVPWM细节

SVPWM细节 # 原理 通过六个扇区的六个非零矢量进行矢量合成所需电压&#xff0c;但在合成过程中不可避免地会经过零矢量来合成&#xff0c;从而降低开关频率动作次数。 一般过调制的情况下非零矢量作用时间大于载波周期&#xff0c;所以在此过程中只取有效矢量的作用时间之和。…

SVPWM学习

作者寄语&#xff1a;在公众号&#xff08;浅谈电机控制&#xff09;中以小文章的形式记录自己学习SVPWM的过程。有时候自学未免出现理解错误的地方&#xff0c;所以烦请学友们批评指正。 如果需要SVPWM模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制。留下邮箱获取…

单相SVPWM

单相SVPWM逆变技术起源于三相电机调速系统中的三相SVPWM技术&#xff0c;在三相SVPWM调制中由旋转的电压矢量得到旋转的磁场&#xff0c;对电压矢量进行控制从而实现电机调速&#xff0c;其实电压矢量控制的实质是一种逆变过程&#xff0c;故单相SVPWM逐渐被研究并应用于逆变电…

SVPWM

接上一篇文章咱们接着讲讲SVPWM&#xff0c;如果对于PWM和SPWM不是很了解的同学可以看我上一篇文章。电机控制是一门很深得学问&#xff0c;由于时间和精力有限&#xff0c;本文章不会讲解特别深入&#xff0c;在此只是抛砖引玉。 SVPWM原理 SVPWM的全称是空间矢量脉宽调制(Sp…

SVPWM算法理解(一)——基本原理

SVPWM算法理解&#xff08;一&#xff09;——基本原理 说明1 SVPWM基本原理1.1 引言1.2 三相电量的空间矢量表示1.3 SPWM与SVPWM比较1.4 问题1&#xff1a;2Udc/3还是Udc&#xff1f; 2 SVPWM算法推导2.1 SVPWM的合成原理2.2 问题2&#xff1a;电压利用率1&#xff1f;2.3 SVP…

SVPWM理论部分

SVPWM理论部分 简述1、基本原理2、SVPWM控制2.1 扇区判断&#xff08;根据$\alpha\beta$为方便判断扇区而采取的一种方法&#xff09;2.2 电压空间矢量合成及作用时间2.3 电压空间矢量作用顺序2.3.1 五段式SVPWM2.3.2 七段式SVPWM 总结 简述 SVPWM&#xff0c;即空间矢量调制&…

SVPWM算法原理及详解

SVPWM算法原理及详解 1.概述 SVPWM是近年发展的一种比较新颖的控制方法&#xff0c;是由三相功率逆变器的六个功率开关元件组成的特定开关模式产生的脉宽调制波&#xff0c;能够使输出电流波形尽可能接近于理想的正弦波形。空间电压矢量PWM与传统的正弦PWM不同&#xff0c;它是…

FOC电机控制之SVPWM原理与实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、SVPWM原理二、SVPWM实现方法1. 基本矢量电压&#xff1a;2.扇区判断&#xff1a;3. 计算相邻两个基本矢量电压的作用时间4 .三路PWM占空比计算 算法流程ste…

SVPWM分析、各个扇区详细计算以及Matlab仿真

SVPWM分析以及各个扇区详细计算以及Matlab仿真 说明目的两电平逆变器拓扑空间矢量扇区判断扇区内如何发波&#xff1f;矢量作用时间计算矢量切换时间的计算Simulink仿真/基于Matlab-R2014a版本 说明 第一次发文章&#xff0c;不太会用Markdown&#xff0c;word编辑的公式复制过…

概率统计Python计算:解古典概型问题

假定以 S S S为样本空间的随机试验是一个等概模型&#xff0c;事件 A ⊆ S A\subseteq S A⊆S。若能算得 ∣ S ∣ n |S|n ∣S∣n&#xff0c; ∣ A ∣ m |A|m ∣A∣m&#xff0c;我们知道 P ( A ) m / n P(A)m/n P(A)m/n。我们把这样的计算方法定义成下列的Python函数。 fr…