在上期中介绍了在Simulink仿真中用S函数构建控制器,方便代码从仿真到嵌入式设备的迁移,本期则直接进入正题,通过两电平逆变器模型来介绍S函数在电力电子仿真中的应用。
01S函数的简单介绍
官方对S函数是这样介绍的:S-Function 可以使用 MATLAB®, C, C++, Ada,或 Fortran 语言来编写。 使用 MEX实用工具,将 C, C++, Ada,和 Fortran 语言的 S-Function 编译成MEX-文件,在需要的时候,它们可与其它的MEX-文件一起动态地连接到 MATLAB 中。
S-Function 使用一种特殊的调用格式让你可以与 Simulink 方程求解器相互作用,这与发生在求解器和内置 Simulink块之间的相互作用非常相似。 S-Function 的形式是非常通用的,且适用于连续、离散和混合系统。
这段话包含以下几层意思:
1. S函数可以用m语言,c语言等多种语言编写,Simulink库中的User-Defined Functions中的S-Function Example包含了多种语言的多种模板, S-Function Builder 是一个 Simulink 模块,可以通过设定自动生成c语言的S函数;
图1 Simulink库中S函数相关模块
2. S函数与Simulink的运行原理相似,要了解S函数是如何工作的,就要了解Simulink 是如何进行模型仿真的, Simulink模型的执行分几个阶段进行。 首先进行的是初始化阶段,在此阶段, Simulink将库块合并到模型中来,确定传送宽度、数据类型和采样时间,计算块参数,确定块的执行顺序,以及分配内存。 然后, Simulink进入到“仿真循环”,每次循环可认为是一个“仿真步”。 在每个仿真步期间,Simulink 按照初始化阶段确定的块执行顺序依次执行模型中的每个块。 对于每个块而言,Simulink 调用函数来计算块在当前采样时间下的状态,导数和输出。 如此反复,一直持续到仿真结束。
下图所示为一个仿真的步骤:
图2 Simulink 执行仿真的步骤
3. S函数使用一种特殊的调用格式使其在 Simulink方程求解器相互作用,S函数主要通过多种特殊格式的回调函数,用来表示仿真执行的初始化、输出、计算导数、结束等多个阶段。
02两电平逆变器调制的S函数示例
文章结尾的下载链接提供了两电平逆变器调制的S函数的示例程序,该示例主体程序部分如下:
图3 两电平逆变器调制的S函数主体部分
该S函数主要包含以下回调函数:
a. mdlInitializeSizes回调函数
对参数进行初始化设置,比如离散状态个数、连续状态个数、模块输入和输出的路数、模块的采样周期个数、状态变量初始数值等;
b. mdlInitializeSampleTimes回调函数
该函数设置S-Function模块的采样时间,决定了mdlOutputs多久执行一次;
c. mdlInitializeConditions回调函数
初始化时调用,对输入输出数组指针地址进行定义;
d. mdlOutputs回调函数
可以用来执行我们定义的函数,本例中执行了三个任务:
来自S函数的外部数据的输入;
执行100us的定时中断(计算输出电压相位,输出电压指令)、741us的定时中断(模拟PWM中断,调用两电平SVPWM调制算法)。
S函数输出(输出内部监视变量和PWM波占空比)
e. mdlUpdate回调函数
如果该块具有离散的状态变量,则在处理完所有块的输出函数之后的主要时间步中,将调用一次更新函数,本例未使用;
f. mdlTerminate回调函数
S函数终止时执行的函数,本例未使用。
多个回调函数的执行顺序如下:
图4 两电平逆变器调制的S函数回调函数执行顺序
完成S函数的c文件的编写后,需要在Matlab中调用编译器对S函数的c文件进行编译。 由于Matlab存在32位和64位,调用的编译器也不一样。 32位直接使用自带的lcc-win32即可,64位则需要额外安装的VS的C++编译器。 matlab通过mex-setup命令选择编译器。
本示例模型在Simulink的File->Model Properties->Model Properties->Callbacks->InitFcn中通过以下命令对S函数编译,使模式在每次运行时执行该编译命令生成格式mexw64的文件给Simulink模型调用:
-g -v InveterController.c Func_SVPWM_2L.c...
03仿真结果
运行仿真模型:INV_2L3Ph_SPWM.slx,在S函数的mdlOutputs回调函数中,调用Func_SVPWM_2L()调制函数之后,数组y_Scope输出ABC三相PWM波的占空比为:
图5 ABC三相PWM波的占空比
在S函数的mdlOutputs回调函数中采集了逆变器的模拟量,通过数组y_Scope输出,其波形为:
图6 S函数的输出波形
全部0条评论
快来发表一下你的评论吧 !