串行通讯系统设计.docx
- 文档编号:4957748
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:10
- 大小:143.23KB
串行通讯系统设计.docx
《串行通讯系统设计.docx》由会员分享,可在线阅读,更多相关《串行通讯系统设计.docx(10页珍藏版)》请在冰豆网上搜索。
串行通讯系统设计
MSTN串口通讯系统设计
一、MSTN控制系统的通讯需求分析
MSTN控制系统的控制器部分使用的是两块的DSP,型号为TMS320F2812,分别在控制板和显示板上。
其中控制板负责实现磁浮控制;另一块负责实时显示磁浮轴的位置和光电码盘的角度信息。
在系统的调试阶段,控制板的控制参数需要通过键盘或PC机现场调整,同时,磁浮轴的位置和光电码盘的角度信息也要传送到PC机进行更深入分析和处理。
因此,通讯系统要实现的功能可以具体分为以下几个部分:
(1)控制器参数——从显示板到控制板(来自键盘或PC机)
(2)控制器参数——从PC机到显示板(手动设置)
(3)控制器参数——从显示板到PC机(来自键盘或PC机)
(4)磁浮间距数据——从控制板到显示板(来自传感器)
(5)磁浮间距数据——从显示板到PC机(来自控制板)
(6)方向角度数据——从显示板到PC机(来自光电码盘)
这样,通讯任务可以尽可能的集中到显示板,从而减轻了控制板工作,使其可以集中力量完成磁浮系统的控制这个核心工作。
二、串口通讯可行性分析
串口通讯接口(SCI)是一个两线制异步串行接口,通常称为UART。
这种通讯方式硬件实现容易,通讯格式简单,适合于近距离,小流量的通讯系统。
本系统采用这种通讯方式主要有以下几个原因:
(1)本系统的通讯数据数量不大,尤其是两个DSP之间的数据量较小;
(2)通讯数据种类较多,需要一种易于控制数据格式的通讯方式,异步串口的单字节通讯方式便于软件控制数据格式;
(3)串口是一种较为常用的通讯接口,现有的PC机和我们所使用的DSP均有现成的串行口可以使用。
(4)通讯距离很近,两个DSP距离不超过30cm,到PC机的距离不超过2m。
三、串口通讯系统设计
1、整体设计
根据第一部分的需求分析可以把整个系统的通讯数据流程可以用图3-1表示。
图3-1MSTN数据通讯示意图
通过可行性分析,我们采用异步串行通讯来实现控制板、显示板和PC机之间的通讯。
因此,整个通讯系统可以用图3-2表示。
图3-2MSTN通讯系统框图
2、硬件电路设计
硬件设计部分较为简单,主要是为了电平匹配,加入RS-232电平转换电路。
由于PC机使用是RS-232的串行接口标准,DSP使用的是3.3v的coms电平,因此需要加入RS-232电平转换电路。
同时,采用RS-232的串行接口标准可以提高串口通讯的可靠性和抗干扰能力,因此DSP之间的通讯也采用这种标准。
电平转换芯片可以采用max232或者max202,它们都是含有两路串口转化功能的RS-232电平转换芯片,所不同的只是前者使用的是1uF的外接电容,而后者使用的是0.1uF的外接电容。
具体接口电路如图3-3所示。
图3-3RS-232电平转化电路
图中74LVC04是一个六反相器,采用的是3.3v供电。
在这里通过两次反相,SCIRXA和SCIRXB实现了5v到3.3v逻辑电平的转换,之后才可以和DSP相连接。
但是DSP的输出3.3v逻辑电平是可以驱动MAX202,因此,TXD端不需要加入电平转换。
3、软件设计
软件设计包括通讯数据帧格式的设计、显示板通讯程序设计、控制板通讯程序设计、PC机通讯程序设计。
其中,通讯数据帧格式的设计和显示板通讯程序设计是本文做的最主要的工作,将在下一部分详细介绍。
四、串口通讯系统软件设计
1、DSP的增强型SCI模块分析
TMS320F2812内部集成了两个增强型的SCI外设模块。
这使得我们可以很方便的实现显示板上的双路串口通讯。
该模块有以下几个部分组成:
(1)发送数据缓冲寄存器和发送移位寄存器
这是发送接口的基本组成,缓冲器暂存要发送的数据,然后由移位器把数据按照设定的格式和速率一位一位的移到SCITXD引脚。
(2)接收移位寄存器和接收数据缓冲寄存器
移位寄存器从SCIRXD引脚上逐位读取数据,然后暂存到缓冲器等待CPU来读取。
(3)16级深度的发送/接收FIFO寄存器
增强型的的SCI增加了可选的16级深度的发送和接收FIFO寄存器,可一次写入或读出最多16个数据,这样可以有效地减轻CPU由于反复操作串口所导致的开销。
并且,这种结构给我们设计通讯的数据帧带来了很大的方便,当一个特定的数据帧不超过16个字节时,可以通过一次对串口的操作来完成数据帧的发送或接收。
我们下面的数据帧设计和软件编程正式基于这种方式实现的。
(4)可编程的波特率发生器
为了增强系统的通用性和可调性,我们采用的是最为常用的9600bps。
(5)控制寄存器和状态寄存器
实现SCI的配置和状态的读取。
2、数据帧格式设计
通过第一部分的需求分析,可以看出在整个通讯系统中要传送的数据包括三类,即控制器参数、磁浮间距数据和方向角度信息。
另外,在接收信息出错时,还要发送错误信息帧,请求数据重发。
串行通讯系统的出错帧主要针对控制器参数和磁浮间距数据。
所以,我们总共需要五种数据帧。
为了同步数据帧,每种数据帧总是以’$’打头,以’#’结尾,这样也可以起到一定程度容错作用。
为了区别各种不同的数据帧,在每帧的起始位置还应加入帧标识符。
下面根据每种数据的要求分别进行数据帧格式的设计。
(1)控制器参数帧格式
当采用PID方法对磁浮系统进行控制时,每个自由度共需要3-4个控制参数。
在MSTN控制系统中,共需要控制五个自由度,因此,我们数据帧中应该至少设计20个数据区。
考虑到控制板的DA输出为12位,为保证控制器的计算精度,控制参数可以选为16位,即两个字节。
这样,共需要传输40个数据字节,由于串口的FIFO深度为16级,不适合一次把这些数据放到一个帧中。
进一步考虑五路PID控制的相对独立性,我们可以把这些数据分为五组进行传输,并在数据中加入标识加以区分。
控制参数帧格式具体设计如下:
$C打头。
后跟1个字节,标识控制器参数的组号(0~4)。
然后是8个字节的数据区,每两个字节表示一个参数,高位字节在前,低位字节在后。
最后是#结尾。
用表格的形式给出如表4-1所示。
表4-1控制参数数据帧格式
字节数
2
1
2
2
2
2
1
控制参数
$C
Num
Kp
Ki
Kd
Td
#
(2)磁浮间距数据帧格式
磁浮间距数据指的是磁浮轴的的外表面到磁浮轴承内表面的距离,共五路,即上径向的X轴和Y轴、上径向的X轴和Y轴以及轴向。
它是控制板通过AD采集霍尔位移传感器的信号得来的。
控制板AD模块的分辨率也是12位的,故数据也应该选择两个字节。
这样,共需10个字节的数据区,可以放在一个数据帧中。
控制磁浮间距数据帧格式具体设计如下:
$D打头。
接下来是数据区,包括上部XY、下部XY、Z,共五部分,每部分两个字节,高字节在前,低字节在后。
最后以#结尾。
用表格的形式给出如表4-2所示。
表4-2磁浮间距数据帧格式
字节数
2
2
2
2
2
2
1
距离
$D
Xtop
Ytop
Xbottom
Ybottom
Z
#
(3)方向角度信息数据帧格式
角度信息来自于光电码盘,原定精度为10角秒,测量范围-180~180度,可以得出数据至少是17位的,故需要三个字节。
帧设计如下:
以$A打头。
然后是角度信息,共3字节数据,高字节在前,低字节在后。
以#结尾。
用表格的形式给出如表4-2。
用表格的形式给出如表4-2所示。
表4-3方向角度数据帧格式
字节数
2
3
1
角度
$A
Angle
#
(4)出错信息帧格式
出错信息帧应该与对应接收方所接收的数据帧用相同的帧长度和类似的帧结构,这样可以简化编程,提高系统可靠性。
具体设计如下:
控制参数出错帧,以$E打头,然后是10个字节的0x00,#结尾。
磁浮间距出错帧,以$E打头,然后是9个字节的0x00,#结尾。
3、通讯程序设计
根据上一节的帧设计结果,我们有3三种编程思路可供选择:
(1)发送方每次发送一个字节,直到把一帧数据发送完毕;接收方在检测到正确的帧头后,把以后接收的数据依次存入一个全局数组,在正确接收完一个帧后,设置全局标志位通知CPU进行处理。
(2)发送方利用增强型SCI的FIFO功能,每次发送一帧数据;接收方也利用FIFO功能,只有当FIFO接收到一帧的数据量,才通知CPU进行数据的读取和处理。
(3)发送方利用增强型SCI的FIFO功能,每次发送一帧数据;接收方在检测到正确的帧头后,设置合适的FIFO中断级,一次性接收数据帧后续的字节,验证帧数据格式后,通知CPU进行数据的处理。
第一种编程方法是最为灵活的,对发送的时间间隔没有任何要求,但是这样会频繁的触发接收方的CPU中断,这正就增加了CPU的开销,尤其不适用于像控制板这样对时间要求非常严格的通讯节点。
考虑第二种方法,它有效的利用了增强型SCI的特点,极大地提高了CPU的工作效率。
但是,由于在接收一帧数据过程中无法判断该帧的有效性,故有可能接受整帧数据都是无用的。
并且,由于CPU的工作频率相对SCI传输速率是很高的,经常会造成连续接到错误的数据帧的情况,这个问题是致命的。
因此,我们对第二种方法进行了改进,也可以认为是对前两种方法的一个折中,得到了第三种方法。
开始的检测方式以较小的开销保证了以后接收到的整帧数据的正确性。
实践证明这种方法是完全可行的。
采用改进的方法设计发送部分程序流程图如图4-1所示。
图4-1串口发送程序流程图
该程序的关键部分是把一帧数据写入FIFO后要等待该帧数据发送完毕后再发送下一帧,否则接收方会出现丢帧的情况。
另外,当接收方处理一帧数据的时间较长时应该在上诉位置加一定的延时。
例如,控制参数的发送程序如下所示:
for(i=0;i<5;i++)
{
SciaRegs.SCITXBUF='$';
SciaRegs.SCITXBUF='C';
SciaRegs.SCITXBUF=i;
for(j=0;j<4;j++)
{
SciaRegs.SCITXBUF=DCpro_HiByte(DCpro_ControlDataSet[i][j]);
SciaRegs.SCITXBUF=DCpro_LoByte(DCpro_ControlDataSet[i][j]);
}
SciaRegs.SCITXBUF='#';
while(SciaRegs.SCIFFTX.bit.TXFFST!
=0);
}
该程序一次发送了全部五个数据帧。
DCpro_HiByte()函数用于区数据高八位,DCpro_LoByte()取的是低八位。
DCpro_ControlDataSet[][]为存储控制参数的数组,数据要在发送之前设置好。
接收数据的程序设计是整个程序的一个难点。
第一,要注意处理好中断级别的设置,即FIFO在接受到几个数据后产生中断;第二,在接收完一组数据后,要紧接着复位FIFO队列和清除中断相应。
程序流程图如图4-2所示。
图4-2串口接收程序流程图
图4-2的左半部分是检测数据帧头的程序,当检测到有效的数据帧后就会重新配置FIFO,使其接收正帧数据;右半部分为接收整个数据帧的程序流程,再根据数据帧格式的正确性,决定保留数据还是发送出错信息,最后重置FIFO来检测数据帧帧头。
interruptvoidDCpro_SciaRecieve_isr(void)
{
inti,j,tmp[13];
//检测数据帧帧头程序段
if(SciaRegs.SCIFFRX.bit.RXFIFST==1)
{
tmp[0]=SciaRegs.SCIRXBUF.all;
ScibRegs.SCITXBUF=tmp[0];
if(tmp[0]=='$')SciaRegs.SCIFFRX.all=0x206c;//中断级别为12
else
{
发送出错信息帧
}
}
//接收完整数据帧程序段
else
{
for(i=1;i<13;i++)
{
tmp[i]=SciaRegs.SCIRXBUF.all;
ScibRegs.SCITXBUF=tmp[i];
}
if((tmp[1]=='D')&&(tmp[12]=='#'))
{
for(i=0;i<5;i++)
{
DCpro_DataScia[i]=(tmp[2*(i+1)]<<8)+tmp[2*(i+1)+1];
}
DCpro_FlagScia=1;
}
//当接收到来自控制dsp的错误帧时,重发控制参数
elseif((tmp[1]=='E')&&(tmp[12]=='#'))
{
发送控制参数数据帧
}
}
else
{
发送出错信息帧
}
SciaRegs.SCIFFRX.all=0x2061;//中断级别为1
}
//复位FIFO寄存器,清除中断相应
SciaRegs.SCIFFRX.bit.RXFIFORESET=0;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
PieCtrlRegs.PIEACK.bit.ACK9=1;
}
需要注意的一点,在实际的程序中,在串口接收程序中还要加入接收到出错信息的处理程序,重发数据帧。
该段程序与发送程序相同。
五、调试与结论
串口系统的显示板局部调试已经完成,调试方法是把显示板的两个串口通过交叉串口线和PC机的两个串口相连,其中PC机的一个串口用来模拟控制板发送和接收数据。
传输的数据都是按照系统的要求,人为编写的。
首先,使用正确的数据帧进行测试,发送和接收程序都能正常工作,各种数据帧都能正确传输。
然后,在无效数据中加入有效数据帧进行测试,系统可以很好的处理错误数据,并正确地接收有效数据帧。
这说明通讯系统有很好的容错能力。
六、其他说明
为简化系统设计,串口通讯格式选择的是:
1位起始位,8位数据为,无奇偶校验,1位停止位,波特率9600bps。
由于没有设置校验位,数据传输过程中可能会出错。
这一问题虽然在局部调试中并未出现,但在以后调试中还应该给予关注。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 串行 通讯 系统 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)