应读者要求,这一篇文章来讲一下仿真里那些可以让结果更贴合实际的东西。
首先重中之重:s-function模块。这是一个可以模拟数字处理器的模块,你完全可以把它当做是一个单片机,然后在里面写对应的代码。
使用s-function有三个明显的好处,第一是可以将仿真离散化,毕竟现实项目基本都是数字化离散化的。而连续和离散还是有一定区别的,有些问题在连续仿真中被掩盖了,离散化后才会显现出来。
第二个好处是易于调试,有时候修改代码比修改模块更加方便,尤其是复杂项目。
第三个好处是s-function的代码可以移植大部分到现实项目中,省下很多时间。
下面来介绍一下具体如何使用。首先放出来s-function模块后,双击它,给它起一个独一无二的名字,比如这里我就起名叫processor,名字是s-function们区别彼此的方法。
艾师傅
随后,点击edit打开s-function的模板代码,这里面有很多复杂的设置函数,各有各的用处,这里就不一一介绍,只介绍几个基本的必须的。首先是开头的宏定义,S_FUNCTION_NAME必须定义为你之前模块中命名的名字,这样才能把代码和模块联系起来。
艾师傅
接下来必须包含"simstruc.h"头文件,这个模板里好像已经包含了。然后是设置输入和输出的个数。如下图,我的输入有19个,输出有4个。
再然后是设置工作频率和仿真开始后多久开始工作:
接下来是初始化和开始函数,这俩函数只会在开始时被执行一次,我一般只在mdlStart()函数里写一些初始化,另一个空着。
最后是mdlOutputs,这里依次定义你的输入,主代码和输出。
全部定义好后就可以把它当做是一块单片机裸机了,也支持包含自己写的头文件。
最后则是编译,需要使用mex命令来编译。使用方法和gcc g++等编译器差不多,输入mex 所有.c文件即可。具体格式如下:
mex a.c b.c c.c
编译器本身就是gcc编译器,需要到matalb库里搜索gcc编译器下载。另外一个实用的小技巧是单独写一个matlab运行脚本,在里面提前写好编译命令,再起个简单的名字例如make,就可以简单输入make即可编译所有代码,使用起来就好像Makefile一样方便。
最后需要注意的是,s-function的输出并不是连续的,所以输出一定要接一个uniti delay或者zoh模块。还有s-funciton模块只有单个输入输出口,所有信号需要经过mux和demux。
我上传了一个s-function的模板代码,嫌麻烦的小伙伴可以直接下下来用(注:这个模板来自我的一位授课老师,Shafiq Odhano)。
另外再说说传感器仿真。
传感器仿真主要有两块,一个是噪声,另一个是量化。先说噪声,不同的传感器有不同的噪声特征,这个要自己去设置,主要就是频率和幅值大小,simulink有很多模块可以产生各种各样的噪声,就不多介绍。
然后是量化,这个使用quantizer模块就行,然后设置量化大小。每个传感器都有自己的分辨率,比如一个量程为5v的9位adc,分辨率就是5/(2^9-1) = 0.02v,quantizer设置为0.02就好。有的传感器比如编码器没有噪声,但是基本都有分辨率,都需要量化。
如果需要的话还可以增加限幅模块或者别的什么东西来使你的信号更加接近一个真实的传感器输出。