大家好,今天给大家介绍一下simulink串口模块的配置详解。UP本人应导师要求,去学习硬件在环仿真,但由于家境贫寒,买不起专业的设备,于是准备从串口下手。串口通讯相比于专业的工控设备,只需要一个单片机就能搭建起完整的仿真平台,接下来我会详细介绍simulink的串口配置方法。
【提示】新版的simulink串口模块可能存在故障,比如我最开始使用的是matlab2022A。在matlab2022中,串口模块一直接收不到数据,最后换成matlab2020B就好了。如果是新手朋友建议使用matlab2020B,UP本人亲测没有问题。
一、simulink设置。
我们所有的自动控制系统全部都是离散化的,因此需改变matlab的运行模式。1处 我们将其设置为Fixed-step(定步长),2处 我们将其设置为discrete(离散求解器),3处 设置步长时间(单位s),一般步长设置为0.01s。
simulink仿真的时候会将时间压缩,以降低仿真时长。但对于硬件在环仿真而言,最好使用实时仿真。点击RUN按钮的小三角,点击simulink pacing。在弹出的窗口里选择仿真时间与真实时间的比例为1,即完全模拟真实情况。
至此simulink配置完毕。
二、串口模块配置
串口配置需要用到三给模块,Serial Configuration、Serial Receive、Serial Send。Serial Configuration用于配置串口参数,Serial Receive、Serial Send分别用于接收和发送串口数据。
2.1、Serial Configuration
双击Serial Configuration模块,弹出窗口,选择Communication Port(此处首先需要保证电脑上有空闲的串口才能选中,可以先用串口调试助手测试,然后在simulink中选择。需要确保串口没有被其他软件占用,不然无法打开)。然后根据自己的硬件配置选择相应波特率,其他项可保持一致。
2.2、Serial Receive
与上一步一样,选择硬件端口。此处需要注意,我们传输的数据类型一般包括8~64位的整形以及float、double。然而串口一次只能传输一个字节,因此我们需要把数据拆分再拼接。
上图是单片机中的发送函数,u是一个float变量,我们首先取址然后强制装换为uint8_t类型的指针,然后把所有数据发送出去。(此处不需要考虑字节顺序,直接发送即可,simulink配置好后,上位会自动对数据进行拼接和转换)
接下来介绍数据转换配置,此处极其重要。Data size代表数据数量可以是单纯的数字也可以是矩阵形式([2,4])。各数据按从左至右,从上至下的顺序排列。Data type代表数据类型,如single相当于float,占4个字节。单片机发送数据应把所有数据一次性发送出去,数据按上述规则排列,simulink收到后会自动拆分解析为设置的数据类型。
模块中的Enable blocking我还不太清楚,但应该代表串口阻塞,即串口数据没有接收到的话会停滞等待串口数据返回。Block sample time代表串口采样时间【注意:串口采样频率必须大于等于串口发送频率,不然数据会丢失或卡死】
2.3、Serial Send
这个模块比较简单,配置串口即可。根据传输的数据可使用convert模块将数据装换为我们需要的类型,经过转换的数据会全部发送至单片机。我们需要在下位进行数据的拼接和转换。
以上图为例,我们最终获得的数据是h。下位需要将串口接收的数据存放在数据里,以float为例,其占用四个字节。数组填充完整后将数组强制转换为float类型的指针,然后取址,即可获得我们需要的数据。[此处字节顺序不用做任何更改,直接强制转换]
三、运行
如上图所示,是搭建的简易模型(sine wave采样率设置为0.01),单片机的作用是接收值大于0时输出1,小于0时输出-1。结果如下图所示。