你好,欢迎访问达普芯片交易网!|  电话:010-82614113

利用S函数实现自编模块

发布时间:2008-12-09阅读:3279

  有些过程用普通的Simulink模块不容易搭建,可以利用s函数编程来实现所需要的模块,S函数可以极大地扩展Simulink的功能,使得Simulink的仿真变得更灵活、更强大。

  S函数是一种采用Matlab或C语言编写,用以描述动态系统行为的算法语言。它采用一种特殊的调用规则,从而让用户能够同Simulink自身的方程求解器进行交互,这种交互过程同Simulink本身标准模块的工作机制几乎完全相同。

  要使用S函数,必须了解Simulink的工作机制。Simulink在仿真过程中每隔一段时间就会对模型中的所有模块进行调用,每个模块在调用过程中都会完成诸如输出信号的计算、内部状态变量的更新及其导数的计算等工作。而仿真开始和结束时刻的调用将完成该模块的初始化和扫尾工作。

  Simulink在仿真过程中反复调用s函数,在调用过程中,Simulink将调用S函数子程序,这些子程序将完成一下工作:

  (1)在仿真循环开始之前的初始化工作:初始化SimStruct结构,其中包含了关于S函数的相关信息;设置输入输出端口的数目和大小;设置模块的采样周期;分配内存并设置sizes数组。

  (2)下一个采样时刻的计算:如果设置的是可变步长的积分算法,则计算下一个计算时刻。如果是固定步长,则计算下一个仿真的步长。

  (3)在最大时间步长内计算模块的输出。这一步完成以后,模块所有的输出都变成有效值。

  (4)在最小时间步长内更新离散状态。

  (5)积分过程,这一步一般是针对连续系统而言的。

  S函数的引导语旬为:[sys,x0,str,ts]=f(t,x,u,flag,p1,p2,…)。从源程序角度来看,Simulink将t,x,u,flag,p1,p2等参数传递给S函数,同时需要S函数返回sys,x0,str,ts四个向量。它们的具体含义是:

  t:目前仿真中的实际时间。

  x:状态向量,可能为空。

  u:输入向量。

  flag:表明Simulink不同仿真状态的标志量。

  sys:依据flag的不同返回不同的结果,如flag=3,sys返回S函数的输出。

  x0:初始状态值,如果没有状态变量,则为空向量,在flag=0时忽略。

  str:保留为将来使用,必须设置为空矩阵。

  ts:两列矩阵,记录采样时间和模块的延时时间。

  在M文件形式的S函数中,Simulink将一个flag的参数传递给S函数,该参数存储了目前仿真的状态,我们必须为每一个flag的值编写适当的函数。表列举了仿真的不同状态下flag的具体以及调用的S函数。

  表    不同仿真阶段下flag的具体值以及调用的S函数

  编码实现时,在各个状态对应的函数下编写相应的功能程序即可。本文就是通过这种方法实现了差动双相码、差动码和弥勒码的构建。

  1. 差动双相码的编码和解码

  差动双相码的编码规则是:在半个位周期中的任意边沿表示二进制“0”,而没有边沿表示二进制“1”。此外,在每一个位周期开始时,电平都要反向。因此,这种码对接收端来说,位节拍比较容易重建。

  根据上述内容,结合差动双相码的编码格式,设计的S函数如下:

  可以用与编码过程类似的方法编程实现差动双相码的解码。解码的思路为:如果这一时刻的输入与上一时刻的输入相同译作“0”,否则译作“1”,由于其滞后性,引入一个位延时。设计的S函数如下:

  将以上的S函数封装成模块并进行仿真,仿真模型和仿真结果如图1所示。

  图1 差动双相码的编解码仿真模型与仿真波形

  2. 差动码的编码与解码

  与差动双相码的编解码思路相似,根据差动码的编码规则可设计出其编解码的S函数。将其封装成模块并进行仿真,仿真模型和仿真结果如图2所示。

  图2 差动码的编解码仿真模型与仿真波形

  3. 米勒码的编码与解码

  米勒码的编码规则是在半个位周期内的任意边沿表示二进制“1”,而经过下一个位周期中不变的电平表示二进制“0”。一连串的零在位周期开始时产生电平交变。解码时在某位的中间看此时的输入是否与上一时刻相同,相同译做“0”,否则译做“1”。同样,用s函数来设计模块。编程过程与差动双相码格式类似,此处不再赘述。

  将米勒码的编码与解码封装成Simulink仿真模块并进行仿真,仿真模型和仿真结果如图3所示。

  图3 米勒码的编解码仿真模型与仿真波形

在线人工客服

点击这里给我发消息

点击这里给我发消息

点击这里给我发消息

010-82614113

客服在线时间周一至周五
9:00-17:30