控制/MCU
串行通信在波特率误差超过一定范围时,会产生错误。本节介绍的内容在51单片机上仅用软件就实现了波特率自动整定,最大程度地减小了波特率误差,因而可使串行通信的可靠性得到提高。
51单片机具有一个全双工的串行接口,提供了多机通信功能,可方便地构成多机系统(多机容错系统、集散型多级系统),为完成大型的控制任务提供了有效的手段。用51单片机组成的多机控制系统,国内已出现多例。在这样的系统中,可靠地实现多处理器间的信息交换(串行通信)是十分重要的。本节的研究发现,波特率作为串行通信的速率,同时对通信的可靠性有重要影响。
串行通信是按位传送数据的。每个数据有8或9个数据位,加上起始位和停止位构成一个串行帧。每一位占用时间T,1/T称为串行通信的波特率。理想情况下,发送机和接收机设置的波特率一致。接收机的接收控制器在串行帧每一数据位的中点进行采样,能接收到正确的数据,但要求波特率完全一致是不可能的。这就提出了一个问题:要可靠地实现串行通信,允许收发双方的波特率有多大误差?我们以一个10位的串行帧为例进行分析。
图1 - 85 (b)是正常工作的情形,波特率一致。在图1 - 85(a)中,接收波特率不变,而发送波特率变小,每位的时间T延长5%,在第10位采样时,就产生了错位,不能进行正常通信。对于10位的串行帧,允许的最大波特率误差不超过5%;在多机通信方式下,串行帧是11位的,允许的最大波特率误差不超过4. 5%。
上面得到的仅仅是理想情况下的波特率误差允许上限。实际应用中,由于硬件设备的频带有限,数据位的上下跳沿要占用一定时间,每个数据位的有效时间比理想情况要短,所以对波特率误差会有更严格的要求。
1.51单片机串行通信波特率的产生
51单片机的串行口有4种操作模式,由串行口控制字SCON中的两位SMO和SM1设置。模式0作同步移位寄存器,与通信无关;模式2的波特率直接由机器主频fosc决定,不方便应用;常用的是模式1和模式3.分别是8位和9位异步通信口。其波特率是可变的,由机内的定时/计数器1(C/T1)来产生,波特率有以下公式:
其中SMOD是电源控制字PCON中的一位,可编程为0或1。
C/T1有3种工作模式:模式0为13位定时/计数器,模式1为16位定时/计数器,而模式2是可自动重装时间常数的8位定时/计数器。当需要的波特率不是太低时,一般用模式2作波特率发生器:一方面省去了用C/Ti中断服务重装时间常数的工作,更主要的是避免了因中断响应时间不同引起的波特率随机误差。对C/T,的模式2,波特率按如下公式计算:
式中:fosc为晶振频率;TH1为时间常数。
若采用6 MHz的晶振,用模式2可产生的最低波特率为61。对于实时控制系统,绝不会采用更低的信息传递速率(每秒6个数据)。所以,以下讨论只限于C/Ti的模式2作波特率发生器的情况。
2.波特率误差的来源
由式(1 -4)可知,fbit与fosc及TH1有关。首先考虑fosc对.fbit的影响。51的振荡器电路是 由晶体及电容C1、C2构成的。XTAL1及XTAL2为外接晶体管引脚。fosc主要由晶体的固有频率决定,同时也与电容C1、C2及外界温度有一定关系。另外,晶体频率的标称值与实际值也不可能完全一致。我们曾测定过一组标称4 MHz的晶体,发现离散度达2%。由式(1-4)得:
这说明用有误差的fosc去计算fbit时,fbit,会产生同样大小的相对误差。
下面考虑TH,的影响。时间常数只有8位字长,这样就必然存在量化误差。采用四舍五入后,THi的量化误差|△TH1| mAX=0.5。综合式(1-4)、(1-5)得:
由式(1 -6)可以看出,由量化误差产生的波特率误差与波特率成正比,与fosc成反比;并且若置SMOD-l,则可使误差减小一半。
3.减小波特率误差的措施
人工设置波特率,不可避免要用到fosc的标称值,这样就引入了一个误差源。采用自动整定,可以消除由fosc标称值不准确引入的误差。
波特率自动整定可按如下的方法进行:在一个多机系统中,由系统主机产生出一个预定波特率的方波信号,从串行口发送到各从机;各从机以各自的时钟为基准测定此方波的周期所包含的机器周期数N,从N可以方便地换算出产生同样波特率需要的时间常数TH1。计算公式推导如下:
51单片机一个机器周期的时间为δT=12/fosc,一个方波周期包含两个串行数据位,这样,每位数据占用的时间为
而fbit=1/T,代入式(1-4)得
TH1的量化误差总是存在的,为减小其影响,应尽量选SMOD=1;在用式(1-7)进行计算时,要进行舍入,而不是截尾。
采用自动整定时,波特率误差仅由TH,的量化误差引起:
采用12 MHz晶体,fbit=4 800时可能的最大波特率误差为3.84% (SMOD=1).可以保证正常通信。一般系统1 200的波特率就足以满足要求了。
1.自动整定的实现
51单片机的P3口是复用的,其中的P3.0(串行口接收线)和P3.1(发送线)可以用作一般输入/输出口线,也可作为串行口使用。利用这个特点,可以在不对串行口接线作任何变动的情况下,仅利用软件实现波特率的自动整定。
首先要完成的是方波周期的测量。为保证测量精度,共测8个方波周期的机器周期数,然后除以8(移位即可)得N。采用C/T1的模式1(16位定时器)计时,程序流程图如图1- 86所示。
最后得到的16 位计数值存放在TH1、TL1中,其值为8N。取SMOD=1,式(1-7)成为
至此,时间常数TH1计算完毕,接下来可进行常规的串行口初始化。若有必要,还可进行波特率误差校验。编程是很容易的,这里省略。
2.结 论
①串行通信中的波特率误差超过一定范围会影响通信的可靠性,在高波特率下更加严重。
②本例给出的波特率自动整定方法对硬件不作任何变动,仅用软件即可方便实现。在12 MHz晶振下实现了4 800 b/s的高速通信,避免了人工试凑波特率的困难。
③当串行口作为通用仪表对系统机的数据接口时,此方法尤有意义。本节的成果已用于一个通用转速表对IBM - PC的串行接口中。
全部0条评论
快来发表一下你的评论吧 !