频率统计表用c语言_空间矢量脉宽调制建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)...

2f50b686eb3b384d1826fbfc3346196b.png

文末有仿真模型下载方式

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)。

aae1361b2f57982e36792f8eb832abad.png
图1-1 SVPWM仿真模型

双击Sfunction builder模块设置(即图1-1中的SVPWM),首先填写S-function name:SVM,然后在Initialization选项卡中选择Sample mode为Discere,意味着使用离散采样模式,在Sample time value中设置采样周期,这里采用1e-4(单位:秒,这里与PWM开关周期设置为同一时间),如图1-2所示。

7dc67765c60bf1553e3e1a75f5c748f3.png
图1-2 Initialization选项卡设置

Data Properties选项卡用来设置模块的输入/输出接口。首先选择Input Ports子选项卡进行输入接口设置,分别添加名为“Ualpha”、“Ubeta”、“Udc”、“Tcnt”的4路输入接口,如图1-3所示。然后选择Output Ports子选项卡进行输出接口设置,添加名为“Tcm”的3维度输出接口和名为“Sec”的扇区输出接口,如图1-4所示。

6a33cec755df323bece76c1a75e26bd3.png
图1-3 Initialization选项卡设置

eb815ee96d3240c55429c3ee6f5519cc.png
图1-4 Data Properties选项卡Output Ports设置

Librabies选项卡用来指定所需的源文件、头文件、库文件等,如图1-5所示,在左侧窗口用来指定头文件路径和C源文件(含路径)。这里举例头文件路径为:INC_PATH ../Include;源文件为:SRC_PATH ../Source Svpwm.c。

b0ee474bed4b82fa5dc25def75d3660d.png
图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;

9c8143ddbbc70197f4f19751c40f2d5e.png
图1-6 Outputs选项卡设置

最后,在配置完成并将相关被测试代码(I_Svpwm.c和I_Svpwm.h)放置到相关文件夹(Include和Source)后,点击界面右上角的Build按钮进行代码编译,在系统提示无错误无警告后即可进行仿真,如图1-7所示。

d634288f7d1ca430ec24c0e493c3e845.png
图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算法得到的调制波呈马鞍形,这样有利于提高直流电压利用率,有效抑制谐波。

0e678c0029df6240b4f843610faf33ae.png
(a) 扇区计算结果

8f90b323e218050ec17af15b45f61144.png
(b) 切换点(调制波)Tcmp1、Tcmp2、Tcmp3波形

​图1-8 仿真结果


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)。

950f80c3f0f22f4b73c71a1016800573.png
图1-9 选择Magnitude-Angle (rad) 时SVPWM模块

2) alpha-beta components(静止坐标系下α-β分量):当选择alpha-beta components时,SVPWM模块显示如图1-10所示。需要说明的是,静止坐标系下的α-β分量采用的同样是标么值而非实际值。

86d4171da57d7d040d4fff9280670317.png
图1-10 选择alpha-beta components 时SVPWM模块

3) Internally generated(内部模式):当选择Internally generated时,SVPWM模块显示如图1-11所示。采用该类型时不需要外部变量的输入,只须在该界面对调制度、相位和频率进行设置。值得说明的是,输出电压的相位(Phase)的单位是电角度(°)而不是弧度(rad)。

07c2d9b4a02684a9a5ec1b2ba54cebe7.png
图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的关系为

7b33ef4b89fef12487d7a36335afc51e.png

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以下。

4f8e80246ef3d860a83c1f05d6f8dd14.png
图1-12 基于SVPWM Generator (2-level) 的仿真模型

ce0993a390f290f988f47814a8fa338f.png
图1-13 SVPWM Generator (2-level) 参数设置

SVPWM输出的6路波形为等幅不等宽的脉冲,其经过低通滤波器滤掉开关频次的谐波后应该呈马鞍波状,取Sa、Sb、Sc三路观测,其相位互差120°,如图1-14所示。

7f9bc7d3772fc30da6b7e514d8628e69.png
图1-14 SVPWM三路驱动波形Sa、Sb、Sc滤波后的马鞍波

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pythonrandom库seed_Python

Python seed() 函数 描述 seed() 方法改变随机数生成器的种子&#xff0c;可以在调用其他随机模块函数之前调用此函数。 语法 以下是 seed() 方法的语法: import random random.seed ( [x] ) 我们调用 random.random() 生成随机数时&#xff0c;每一次生成的数都是随机的。但是…

php基本语法 格式,PHP 基本语法格式

PHP 基本语法格式标准代码如下:复制代码 代码如下:...?>短标签模式(此模式需要修改PHP配置&#xff0c;让PHP支持短标签模式)&#xff1a;复制代码 代码如下:...?>注释&#xff1a;复制代码 代码如下:/* ...*///#时间&#xff1a; 2009-12-14Abs: 取得绝对值. Acos: 取…

spring @Primary-在spring中的使用

在spring 中使用注解&#xff0c;常使用Autowired&#xff0c; 默认是根据类型Type来自动注入的。但有些特殊情况&#xff0c;对同一个接口&#xff0c;可能会有几种不同的实现类&#xff0c;而默认只会采取其中一种的情况下 Primary 的作用就出来了。下面是个简单的使用例子。…

php获取手机的mac地址,Android手机获取Mac地址的方法

[导读]这篇文章主要为大家详细介绍了Android手机获取Mac地址的方法&#xff0c;具有一定的参考价值最常用的方法,通过WiFiManager获取&#xff1a;/*** 通过WiFiManager获取mac地址* param context* return*/private static String tryGetWifiMac(Context context) {WifiManage…

python使用蓝牙功能_python bluetooth蓝牙信息获取蓝牙设备类型的方法

python 获取蓝牙设备类型 扫描蓝牙设备获取到的信息中&#xff0c;无法判断扫描到的蓝牙设备属于什么类型的设备。 扫描蓝牙信息使用的是python 里面的bluetooth模块。 首先扫描出来的是这样的信息 (74:60:FA:FD:FC:49,HUAWEI P30,5898764) 可根据5898764来判断是什么蓝牙设备。…

MySQL建表字段长度的限制、汉字和字母占字节数

varchar(N)&#xff0c;N指的是最大字符数&#xff0c;不是字节数。 记住&#xff1a; &#xff08;1&#xff09;MySQL要求一个行的定义长度不能超过65535。 &#xff08;2&#xff09;单个字段如果大于65535&#xff0c;则转换为TEXT 。 &#xff08;3&#xff09;单行最…

linux 服务器启用端口,linux服务器放行端口

一、默认使用iptables的系统(例如centos6)1、关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放。下面是命令实现&#xff1a;iptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT DROP再用命令iptables -L -n查看 是否设置好&#xff0c; 好看到全部 DROP 了这…

python3 xpath_Python 3中用XPath解析XML

我有以下xml&#xff1a;Biscuits Wrapped Finished Biscuits Biscuits (Wrapped)Biscuits Sweet Finished Biscuits Biscuits (Sweets)Biscuits Savoury Finished Biscuits Biscuits For Cheese....我已使用以下代码将其加载到树中&#xff1a;try: groups etree.parse(PRODU…

MySQL 无符号和有符号的区别

随笔记录: mysql无符号和有符号的区别 无符号unsigned 表示设置的的数据为0或者正数&#xff1b; 有符号则可以是负数 -&#xff1b; 内存占比 有符号 0-255 无符号 -127~127

linux下tomcat启动后无进程,Linux中Tomcat shutdown.sh后进程仍然存在解决办法

最近我们在使用Jenkins自动化部署项目时&#xff0c;在生产liunx环境下&#xff0c;使用脚本shutdown.sh停止tomcat服务&#xff0c;然后再start之后发现应用无法访问了&#xff0c;后台查看tomcat进程是发现有个2个tomcat进程&#xff0c;说明之前的shutdown并没有完全停掉tom…

扫地机器人电路原理图_扫地机有这一台就够了:石头扫地机器人T6 首拆

听说集齐13台扫地机器人可以召唤扫地机神兽&#xff0c;所以集齐了22台扫地机后我的神兽呢&#xff1f;自从上个月入手了石头科技出品的小瓦青春版扫地机之后已经集齐了所有小米(石头)系扫地机。小瓦青春版是一款无序清洁的扫地机产品&#xff0c;也是石头科技价格最低的入门级…

让我放弃FastDFS拥抱MinIO的8个瞬间

目前可用于文件存储的网络服务选择有很多&#xff0c;比如阿里云OSS、七牛云、腾讯云等等&#xff0c;但是收费都有点小贵。为了帮公司节约成本&#xff0c;之前一直是使用fastDFS作为文件服务器&#xff0c;准确的说是图片服务器。直到我发现了MinIO&#xff0c;我决定放弃Fas…

linux内核+红黑树删除,关于linux:Linux内核红黑树原理概括

二叉查找树因为在频繁的动静更新过程中&#xff0c;可能会呈现树的高度远大于 log2n的状况&#xff0c;所以就会导致各个操作效率降落&#xff0c;最坏的状况下就会进化为链表&#xff0c;变为O(n)&#xff0e;很显著&#xff0c;想要解决这个问题&#xff0c;无效的一种方法就…

http 和 https_Golang设置https访问,以及http如何重定向到https

设置https访问&#xff1a;初始代码为http监听&#xff1a;func main() { server : &http.Server{ Addr: ":8080", ... } go func() { if err : server.ListenAndServe(); err ! nil && err ! http.ErrServerClosed { log.Fa…

盘点分布式文件存储系统____分布式文件存储系统简介

盘点分布式文件存储系统 在项目的数据存储中&#xff0c;结构化数据通常采用关系型数据库&#xff0c;非结构化数据&#xff08;文件&#xff09;的存储就有很多种方式&#xff0c;服务器本地存储、Nas挂载、ftp等等&#xff0c;今天就来盘点一下&#xff0c;分布式文件存储系统…

linux 64 32 编译支持,在64位linux上编译32位程序 for i386 intel

编辑中# ld -VGNU ld version 2.15.92.0.2 20040927Supported emulations:elf_x86_64elf_i386i386linux#ld -m elf_i386Along with the -m32 flag in gcc, you may need to include the -melf_i386 flag for ld to properly link the 32bit objectfiles to the 32bit libraries…

linux ortp 编译,Linux下oSIP的编译使用应该是很简单的,其Install说明文档.doc

Linux下oSIP的编译使用应该是很简单的,其Install说明文档.docLinux下oSIP的编译使用应该是很简单的&#xff0c;其Install说明文档里也介绍的比较清楚&#xff0c;本文主要就oSIP在Windows平台下VC 6.0开发环境下的使用作出描述。  虽然oSIP的开发人员也说明了&#xff0c;oS…

常见分布式文件存储介绍、选型比较、架构设计

数据正成为世界上最有价值的资源&#xff0c;分布式文件存储是应对数据爆炸的最好解决方案&#xff0c;那就会涉及到分布式文件存储方案、选型、架构设计等。 分布式文件存储的来源 在这个数据爆炸的时代&#xff0c;产生的数据量不断地在攀升&#xff0c;从GB,TB,PB,ZB.挖掘…

python中id函数的用法_用id函数做几个测试

Python内置的id函数其实非常简单&#xff0c;就是将参数对象的内存地址返回&#xff0c;即id函数返回的是一个很大的整数&#xff08;地址&#xff09;。基于Python语言的特性&#xff0c;本文做了几个测试&#xff0c;还比较有趣。 相同整数的id相同 >>> a 6 >&g…