通信协议
1、SCI通信模式配置
波特率460800,不校验,8个字符长度,1个停止位。
RX FIFO中断深度1,TX FIFO中断深度0.
2、收发流程
(1)先收上位机发来的数据
如果帧头是AA或者BB或者55,则接收数据。
RecData_ctrl_tmp[0],放置帧头;
RecData_ctrl_tmp[1]~ [7],放置数据;
RecData_ctrl_tmp[8],放置校验和;
(2)数据拼接
Rec_mode.Head = RecData_ctrl_tmp[0],放置帧头
如果帧头是AA、55:工作模式
Rec_mode.Data0=RecData_ctrl_tmp[1]、[2]、[3]; //数据(暂未用)
Rec_mode.Data1=RecData_ctrl_tmp[4]、[5]、[6]; //数据
temp = (int32)(([4]*65536) + ([5]*256) + [6]);
Rec_mode.Data1 = temp*0.01-10000;
Rec_mode.CmdMode=RecData_ctrl_tmp[7]; //[7]是工作模式
如果帧头是BB:参数配置模式
Rec_mode.FrameCnt = RecData_ctrl_tmp[2]; //帧计数
Rec_mode.ParaSet = RecData_ctrl_tmp[3]; //指令
Rec_mode.CmdMode = 0x04; //参数配置时应停机
根据Rec_mode.ParaSet对不同的参数进行调整。
(3)解析上位机指令
根据Rec_mode.CmdMode选择执行不同的流程。(0电流环,1速度环,2位置环,3停机,4参数配置,并将模式回传给上位机Snd_mode.CmdModeFdb)。Rec_mode.Data1为上位机发来的具体指令值。
(4)选择需要监测的数据
Snd_mode.Data0,Data1,Data2, Data3。
可以将需要监测的数据赋给Data0,Data1,Data2,Data3,就能将数据传送给上位机,并保存下来,利用Matlab进行分析。
(5)数据处理
如果收到的帧头是55:
SndData_ctrl_tmp[0]=0x55;
SndData_ctrl_tmp[1] = Snd_mode.CmdModeFdb; //工作模式回传
SndData_ctrl_tmp[2] = Snd_mode.FaultStatus; //故障模式回传
ftemp1=(short)(Snd_mode.Data0 *100.0); SndData_ctrl_tmp[3]=(ftemp1>>8)&0x00FF; //高8位放在[3]
SndData_ctrl_tmp[4]=ftemp1&0xFF;
[5\6]放Data1,[7\8]放Data2,[9\10]放Data3,[9\10]未用。
SndData_ctrl_tmp[13]放数据[1]~[12]的校验和。
如果收到的帧头是AA、BB:
SndData_ctrl_tmp[0] = 0xCC;
[1]~ [9]放PI参数
SndData_ctrl_tmp[10] = Snd_mode.FaultStatus;故障码
SndData_ctrl_tmp[11] = Rec_mode.FrameCnt; 调参次数
SndData_ctrl_tmp[12] = Snd_mode.CmdModeFdb; //工作模式回传
SndData_ctrl_tmp[13]放数据[1]~[12]的校验和。
(6)回传数据
每1ms,向上位机回传SndData_ctrl_tmp[1]~[14]。
程序中设计的标志位,比如Rec_mode.flag_New、Snd_mode.flag_New等,是为了让数据传送有条不紊的进行,即以下几个流程按顺序执行。
scic_ctrl_RecData(); //从测控串口接收数据
RecData_Ctrl_Update(); //接收数据更新
Message_Ctrl_Decode(); //数据解码
Message_Ctrl_Encode(); //要发送的数据及回传数据编码
SndData_Ctrl_Update(); //发送数据更新
以上即为DSP程序中的通信部分,上位机中的代码和这个模式一模一样,学习时只需要掌握这个原理,就可以很方便的将代码移植到自己的程序中,实现电机运行过程数据的监控、分析,这对学习很有帮助。