矢量控制入门FOC 串口通信协议解读 通信协议

通信协议

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程序中的通信部分,上位机中的代码和这个模式一模一样,学习时只需要掌握这个原理,就可以很方便的将代码移植到自己的程序中,实现电机运行过程数据的监控、分析,这对学习很有帮助。