近期琢磨着这样一件事,怎样带着真实的C代码去Simulink仿真。 多番尝试之后,使用Simulink自带的Sfunction模块和PLECS嵌入版中的C-Script模块两者均可快速实现。 其中C-Script更易上手,本期就对该方法简短介绍。
01Simulink仿真的一点思考
作者作为一名电力电子控制工程师,常常需要将Simulink仿真的算法转化为可烧录到嵌入式芯片的代码,于是仿真完后还需要费一番心思,将积木式的模型或者m语言翻译为可用的代码,而且还不确定代码是否有bug。 是否能这样,仿真用的就是真实的C代码,既节省了翻译代码的时间,又让你的代码经受了Simulink仿真的检验,何乐而不为!
解决方案是这样的:
1. 建立个人的函数库,将常见的如PID,SVPWM,PLL,滤波器等写成函数,定义其对应的c文件和头文件。
2. Simulink仿真的控制不再积木式搭建,使用C-Script(或者S function)包含个人函数库,另外在cscript中只需要加入部分代码即可。
02PLECS C script工具的简单介绍
作者采用plecs 3.6.1,该软件可以作为一个工具包嵌入到Simulink中使用。 里面的C-Script是专门用来在simulink仿真中运行c代码的。 帮助菜单如下介绍C-Script模块:
打开C script模块,将代码分为六层,Code declarations,Start function code,output function code,Updata function code,Derivative function code和Terminate function code。
Code declarations:此代码部分用于全局声明和定义,这是包含标准库标头的位置(例如math.h 或 stdio.h),可以定义要在C-Script 函数中使用的宏、静态变量和外部源文件。 包含Simulink模型文件的目录将自动添加到包含的搜索路径。
Start function code:开始函数代码在仿真开始时调用。 一般用于初始化代码。
Output function code:在主要和次要时间步长期间调用输出函数,以更新该部分的输出信号。 可以使用宏Input(i),Output(i)和CurrentTime来访问块的输入和输出以及当前时间。
Updata function code:如果该块具有离散的状态变量,则在处理完输出函数之后的主要时间步中,将调用一次更新函数。 一般使用较少。
Derivative function code:如果块具有连续的状态变量,则在求解器的积分循环期间将调用导数函数。 一般使用较少。
Terminate function code:在仿真结束时调用终止函数。
03示例:三相三电平逆变器的模型搭建
a.将个人的PID函数库,SPWM函数库,ADC函数库以及数据类型定义头文件放在Simulink文件同路径下。 用于Simulink模型中C-Script调用。
图1 C函数库与simulink模型置于同一路径
b. 搭建电路模型,模型分为电路部分,C代码部分,模拟芯片底层的脉冲生成模块。
图2 三电平simulink仿真模型结构
c. C-Script 中编辑代码
首先在C-Script 的设置界面输入该模块的输入个数,输出格式,运算步长等。
在Code declartions部分包含PID函数库,SPWM函数库,ADC函数库以及数据类型定义头文件,以及一些宏定义,如下图示例所示:
图3 C-Script 中Code declartions的定义
在Start function code中完成系统的初始化,本仿真中只对adc采样函数初始化。
图4 C-Script 中Start function code的定义
Output function code执行主要部分,如下截图所示,Output function code先后分别执行C-Script模块的输入,包含三电平逆变器的输出线电压和输出电压幅度指令。 接着对输出电压平均值的计算,输出电压平均值与指令值的PID计算,相位的计算以及三电平的SVPWM调制。 最后为C-Script的对外输出三电平逆变器的脉冲周期,翻转时间,生成脉冲。
图5 C-Script 中Output function code的定义
运行模型,三电平模块输出电压波形如下:
滤波后输出电压和电流波形如下所示:
模块输出电压波形验证了三电平SVPWM调制函数的正确性。 滤波后输出电压和电流波形可以得到该逆变器从0到目标电压建立需要0.35s左右,可根据项目实际需要调整PID参数。
全部0条评论
快来发表一下你的评论吧 !