单片机电机测试系统的研制-上位机监控系统设计(7)

2019-02-15 16:06

武汉工程大学毕业设计(论文)说明书

Text3(0).Text = ga_byRcvBuf(4) '电机方向左 Text3(1).Text = ga_byRcvBuf(5) '电机方向右 Text3(2).Text = ga_byRcvBuf(6) ' 电机PWM End If End If

MSComm1.DTREnable = True

MSComm1.InBufferCount = 0 ' 清除缓冲区数据 End If End If

' Text4.Text = \值\End Sub

3.4后台文件存取程序设计

利用GUI历史数据保存和查看,一是当前坐标系上可见的转速变化曲线的保存和查看,该功能用“实时曲线保存”、“历史曲线查看”和“清屏”三个按钮实现;一是系统在当前连续运行时间内所有信息的保存和查看,这些信息包括:用户保存数据的时间,系统采样的次数,各采样点的时间,在采样时间点的给定转速值、实际转速值、PID调节输出的转速值以及用户设定PID参数(KP、KI、KD和下位机采样周期)等,显然这些数据的记录也是在EveBytesAvailableCallback函数里完成的,数据是以Excel表格的格式保存的,而这些数据的保存和查看则是在界面上的标准菜单的“数据处理”选项下实现,如图4-7所示。

在“数据处理”选项下有“数据和信息保存”和“历史数据查看”两个选项。在“数据和信息保存”选项的响应函数里用uiput函数打开用户准备保存数据的excel文件的位置,然后用xlsread函数将数据写入该excel文件即可;在“历史数据查看”选项的响应函数里用uiget函数让用户选择将要打开的保存有历史数据的Excel文件,用winopen函数打开该excel即可。

同理,可用相关函数在“实时曲线保存”、“历史曲线查看”和“清屏”按

28

武汉工程大学毕业设计(论文)说明书

钮的相应响应函数里运用相关函数保存和查看转速曲线。

3.5底层通信程序设计

3.5.1制定串行通信协议 1. 串行通信的基本数据帧格式

本系统采用的串行通信基本数据帧格式为每帧9位:8位数据位,1位停止位,无奇偶校验位,采用异步通信,通信双方的波特率都采用57600bit/s。

2. 单片机向PC机发送的数据包格式

单片机向PC机发送的数据主要是单片机测量的实际转速和PID调节计算所得的输出转速,每个变量用2个字节表示,则每次发送4字节数据。同时,为了增强通信的可靠性减少误码率,在通信过程中约定软件握手协议。为了不致通信过于复杂,加快通信的速度,决定在每次发送的数据开始加一个字节的通信握手信号如0XFF。因此,单片机每次向PC机发送的数据包格式为:1字节的握手信号,2字节的实时转速信号,2字节的PID调节输出转速信号,总共5个字节数据。

3. PC机向单片机发送的数据包格式

PC机每次向单片机发送的数据有上传转速命令、给定转速、开闭环控制命令、起停控制命令、PID调调节系数KP/KI/KD以及采样时间常数,同理,为增强通信的可靠性,在数据的开始加握手信号。

根据系统控制的实际需要,决定PC机每次向单片机发送的数据包格式如下:0握手信号,1上传转速命令,2给定转速高8位,3给定转速低8位,4开闭环控制命令,5正反转控制命令,6起停控制命令,7 KP高8位,8 KP低8位,9 KI高8位,10 KI低8位,11 KD高8位,12 KD低8位,13采样时间常数T高8位,14采样时间常数T低8位,总共15字节的数据包。

至此,可以制订带有软件握手协议的通信协议:每次通信由上位机首先发起,即上位机先向下位机发送含有握手信号0XFF的15字节数据包。下位机接受到数据包后,首先取出数据包开头的握手信号:若握手信号为0XFF,则认为通信正

29

武汉工程大学毕业设计(论文)说明书

确,一方面存贮接受到的数据,另一方面将握手信号0XFF加到将要上传的转速信号的开头后向上位机发送该数据包;若握手信号不为0XFF,则认为通信错误,一方面丢弃接受到的数据,另一方面将表示通信错误的握手信号0X00加到下位机待发送数据的开头仍然向上位机发送固定格式的数据包。上位机接收到单片机发回的5字节数据包后,也首先读取握手信号:若握手信号为0XFF,则认为通信正确,存贮接受到的转速数据,然后开始下一周期的通信;若握手信号不为0XFF,则认为通信错误,一方面丢弃接受到的转速数据,另一方面重新向单片机发送15字节的数据包,但数据连续重发的次数只有一次,若重发后依然通信错误,则直接转入下一周期的通信,本系统采用定时通信的方式完成数据的自动发送和接收。

3.5.2 MATLAB实现串行通信的程序设计

在Matlab 环境下,读取串口数据的方法可以分为两种——查询和中断。以查询的方式进行串行通信时,如下位单片机有大量的数据分时分批传送给PC 机,就需要不停查询串行口的缓冲区,有数据就读取;虽然编程容易,但这样做不能对数据进行实时处理,系统实时性不高,而且会极大地占用系统的资源。以中断的方式对串口进行控制实现串行通信,就可以实时处理下位机传送的数据;但编程相对复杂一些,需要采用Matlab 的事件和回调函数机制。

(1)基于Matlab 中断方式的实时串行通信编程

在Matlab环境下以中断的方式进行串行通信,实际上是采用事件驱动的方法实现的。Matlab 提供了instrcallback(obj, event)回调函数, 用户根据需要可以自行设置具体的串行通信事件。

Matlab 常用的串行口通信中断事件有:缓冲区有指定字节数目的数据可用事件(bytes-available event)、定时器事件(timer-ewent)、错误中断事件(error-event)、 串口接收到的数据长时间处于非激活状态事件(break-interrupt event)、 串行口引脚状态改变事件(pin-status event)、输出缓冲区为空事件(output empty event)等。当串口上有监视的事件发生时,Matlab 会自动调用回调函数进行通信事件的处理。因此,事件驱动实质上是一

30

武汉工程大学毕业设计(论文)说明书

种中断机制,而回调函数实质上相当于一个中断服务子程序。

本系统将使用两个串行中断事件:定时器事件(timer-ewent)和缓冲区有指定字节数目的数据可用事件(bytes-available event)。定时器事件用于控制上位机向单片机发送数据包的通信周期,即在串口打开的情况下,上位机将周期性地自动发送15字节数据包;字节数据事件用来控制上位机完成实时接受串口数据并进行数据处理的任务。两个串行中断事件相互配合即可稳定可靠的实现PC机与单片机的实时通信。

Matlab 实时串行通信的程序流程如图4-3所示。 1.串口设备初始化程序。

由于本系统所有上位机操作都是是在Matlab的用户界面下进行的,故串行通信程序也在该界面下开发。可在GUI的“打开串口”按钮控件的回调函数open_close_serial_Callback下进行串口设备初始化操作,并指定回调函数中串行通信的中断事件。

程序主要源代码如下:

%===================COM端口初始化===================

value = get(handles.com_choose,'Value'); %%%端口选择 str = ['com' num2str(value)]; set(handles.g,'Port',str); guidata(hObject, handles);

handles.g.InputBufferSize=1024; %%%设置缓冲区大小 handles.g.OutputBufferSize=1024; handles.g.Timeout=5;

handles.g.BaudRate=57600; %%oudRate初始化 handles.g.DataBits=8; %%%设置数据长度 handles.g.StopBits =1; %%%设置停止位长度 handles.g.ReadAsyncMode='continuous';

handles.g.Terminator ='LF'; guidata(hObject, handles);

31

武汉工程大学毕业设计(论文)说明书

%==========指定串口中断事件============

%-----------定义时间事件-------------- global tt1;

开始 设置串口参数 打开串口设备 发送15字节数据包 (握手信号\\命令\\数据) 接收单片机发回的数据 检测握手信号 通信错误 数据重发 通信 正确 数据处理 返回

图4-3 上位机串行通信流程图

tt0=str2num(get(handles.TimerPeriod_set,'string'));

%串口时间事件TimerPeriod参数设置

if isempty(tt0)==1 tt1=1; else

32


单片机电机测试系统的研制-上位机监控系统设计(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:安全检查表应用培训计划和内容 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: