dSPACE控制电机启动与停止

电机接线

接线的细节可以参考我们前面的几篇博客,在此不多介绍

https://blog.csdn.net/qq_34935373/article/details/103131748
https://blog.csdn.net/qq_34935373/article/details/86562250

在这里插入图片描述
需要注意的是在电源处串接一个开关起到类似急停的作用

Simulink建模

在这里插入图片描述
模型主要由5部分组成。1:指令单元;2:指令转换单元;3:Serial Setup单元;4:Serial Transmit单元;5:Serial Receive单元,下面将分块介绍。

指令单元

运用简单的Multiple Switch模块,Constant常量作为控制口输入,Constant值为1,输出指令“UM=2;JV=5000;M0=1;BG;“指令有两个地方需要注。BG后要有分号,JV值需要在MO=0的条件下设置。Constant值为2,输出指令”ST;MO=0;”,即电机停转、驱动器不使能,关于指令的详细解释可参考《ELMO驱动器命令中文手册》,在此不多作介绍。还有一点需要注意的是,这两条指令均预先在串口调试助手中验证可行,如下图。
在这里插入图片描述

ELMO驱动器在收到指令后会返回一条相同的指令,以此验证通信是否正常以及命令是否正确,若指令错误则会返回相关错误信息。

指令转换单元

由于dSPACE的Serial Transmit模块TXBytes端口只能接受8位无符号整型量(后面会详细介绍),因此需要将String类型的指令进行类型转换,一共进行了三次。第一次是String转ASCII,此时是一个一维数组;接着运用MATLAB Function模块将数组变为一维的列向量;此时元素还都是Double类型,最后将Double转化为Uint8。这样指令就可以传输了。
在这里插入图片描述

Serial Setup单元

在这里插入图片描述
关于该模块的描述如上图,凡是用到串口通信就必须包含该模块,其中可以设置波特率、数据位、校验位等
在这里插入图片描述

经串口调试助手验证,波特率19200、8位数据位、1位停止位、0位校验位可实现与Elmo驱动器的通信。此处有一个细节需要注意,即Handshake mode,通讯时常见的握手模式,但问题是Elmo无法发出CTS信号,使能的话可能会导致dSPACE的长期等待,所以这里暂时未使能,关于串口流控(CTS/RTS,DTR/DSR)可以看下面的文章:

https://blog.csdn.net/u014783785/article/details/91959820?ops_request_misc=&request_id=&biz_id=102&utm_term=RTS mode&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-91959820.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

"Copy data to RX SW FIFO after reception of 14 bytes at latest"中的14是数据缓冲区的大小,为串口通讯提供额外的数据存储空间,当数据收发出现问题时,部分数据会暂存于此。Transmit buffer不能够覆写,如果缓冲区溢出,那么要么丢弃新数据,要么尽可能多的在缓冲区内写数据。Receive buffer如果溢出,旧数据可被覆写,或者丢弃新的数据。
在这里插入图片描述SW FIFO size必须为2的幂级数,我们一开始的指令不长,暂时定为128bytes,后面预计需要更改,以及考虑数据溢出的问题。Overwrite Mode有两种,Discard new data和Replace old data with FIFO method,根据实际使用选择,这里暂时选择第二种。
在这里插入图片描述
在这里插入图片描述

Serial Transmit单元

在这里插入图片描述
该模块的目的是通过串口发数据,发送的数据长度可以是固定的,也可以是可调的。TXBytes是要发送的数据;NumBytes是数据长度可调下的数据长度调节端口;NumTXBytes的已发送的数据量;Status是发送的状态。各个端口的特征、数据类型,以及不同状态值的意义如下图所示:
在这里插入图片描述
在这里插入图片描述
Transmission SW FIFO mode选择为Discard all new data,Parameter flexibility为tunable,Specify the number of bytes选择by block parameter,这里会出现一个问题,发送的数据量必须和Maximum number of bytes相一致,否则Ctrl+B的时候会报错,所以暂时先选择by block parameter,现在想到可以选择by input port,然后再Control Desk中调节,这里需要改进。
在这里插入图片描述
也就是下图模块的vector size要与Maximum number of bytes相一致
在这里插入图片描述
在Advance选项卡下使能模块右侧两个端口,有助于我们观察通讯时的状态。
在这里插入图片描述

Serial Receive单元

在这里插入图片描述
该模块用于串口通讯时接收数据。NumBytes设置最大接收数据量,必须小于SW FIFO size-1;RXBytes显示接收到的数据;NumRXBytes显示接收到的数据量;Status显示接收状态。各个端口的特征、数据类型,以及不同状态值的意义如下图所示:
在这里插入图片描述
我们设置Reception mode为Read available data anyway,即有新的数据来就读取新的数据,另一种模式是Discard all new data,即缓冲区满后丢弃所有新传输来的数据,这两种模式根据实际应用选择。同时使能模块右侧两端口以观察运行时的数据接收情况。
在这里插入图片描述
在这里插入图片描述

Control Desk运行

总算走到这一步,因为没有好好看培训手册,还傻里傻气地问dSPACE的技术支持,如何在运行中更改Constant常量的值,不过真心感谢赵工的耐心指导,晚上还打电话给我(之后一定好好看手册~)。Ctrl+B后(此时程序其实已经下载到驱动器),在Control Desk中加载.sdf文件,将要观察的变量拖入Layout面板,选择合适的Display方式,尤其注意Constant应选择Numeric input,这样才可以在运行中更改其值,实现不同指令的输出,控制电机的启动与停止。
在这里插入图片描述

Guess you like

Origin blog.csdn.net/qq_34935373/article/details/120895830