串行通信在波特率誤差超過一定范圍時,會產生錯誤。本節介紹的內容在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)來產生,波特率有以下公式:
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的串行接口中。
評論
查看更多