分享

带着真实C代码去simulink仿真

 limao164 2022-04-11

近期琢磨着这样一件事,怎样带着真实的C代码去Simulink仿真。多番尝试之后,使用Simulink自带的S function模块和PLECS嵌入版中的C-Script模块两者均可快速实现。其中C-Script更易上手,本期就对该方法简短介绍。

01

Simulink仿真的一点思考

作者作为一名电力电子控制工程师,常常需要将Simulink仿真的算法转化为可烧录到嵌入式芯片的代码,于是仿真完后还需要费一番心思,将积木式的模型或者m语言翻译为可用的代码,而且还不确定代码是否有bug。是否能这样,仿真用的就是真实的C代码,既节省了翻译代码的时间,又让你的代码经受了Simulink仿真的检验,何乐而不为!

解决方案是这样的:

     1. 建立个人的函数库,将常见的如PID,SVPWM,PLL,滤波器等写成函数,定义其对应的c文件和头文件。     

      2. Simulink仿真的控制不再积木式搭建,使用C-Script(或者S function)包含个人函数库,另外在c script中只需要加入部分代码即可。

02

PLECS 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参数。

                  04

您的关注是我们持续创作的动力!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多