RS485硬件電路設計中需注意的問(wèn)題
在工業(yè)控制及測量領(lǐng)域較為常用的網(wǎng)絡(luò )之一就是物理層采用RS-485通信接口所組成的工控設備網(wǎng)絡(luò )。這種通信接口可以十分方便地將許多設備組成一個(gè)控制網(wǎng)絡(luò )。從目前解決單片機之間中長(cháng)距離通信的諸多方案分析來(lái)看,RS-485總線(xiàn)通信模式由于具有結構簡(jiǎn)單、價(jià)格低廉、通信距離和數據傳輸速率適當等特點(diǎn)而被廣泛應用于儀器儀表、智能化傳感器集散控制、樓宇控制、監控報警等領(lǐng)域。但RS485總線(xiàn)存在自適應、自保護功能脆弱等缺點(diǎn),如不注意一些細節的處理,常出現通信失敗甚至系統癱瘓等故障,因此提高RS-485總線(xiàn)運行可靠性至關(guān)重要。
2、硬件電路設計中需注意的問(wèn)題
圖1 RS485通信接口原理
2.1 電路基本原理
某節點(diǎn)的硬件電路設計如圖1所示,在該電路中,使用了一種RS-485接口芯片SN75LBC184,它采用單一電源Vcc,電壓在+3~+5.5 V范圍內都能正常工作。與普通的RS-485芯片相比,它不但能抗雷電的沖擊而且能承受高達8 kV的靜電放電沖擊,片內集成4個(gè)瞬時(shí)過(guò)壓保護管,可承受高達400 V的瞬態(tài)脈沖電壓。因此,它能顯著(zhù)提高防止雷電損壞器件的可靠性。對一些環(huán)境比較惡劣的現場(chǎng),可直接與傳輸線(xiàn)相接而不需要任何外加保護元件。該芯片還有一個(gè)獨特的設計,當輸入端開(kāi)路時(shí),其輸出為高電平,這樣可保證接收器輸入端電纜有開(kāi)路故障時(shí),不影響系統的正常工作。另外,它的輸入阻抗為RS485標準輸入阻抗的2倍(≥24 kΩ),故可以在總線(xiàn)上連接64個(gè)收發(fā)器。芯片內部設計了限斜率驅動(dòng),使輸出信號邊沿不會(huì )過(guò)陡,使傳輸線(xiàn)上不會(huì )產(chǎn)生過(guò)多的高頻分量,從而有效扼制電磁干擾。在圖1中,四位一體的光電耦合器TLP521讓單片機與SN75LBC184之間完全沒(méi)有了電的聯(lián)系,提高了工作的可靠性?;驹頌椋寒攩纹瑱CP1.6=0時(shí),光電耦合器的發(fā)光二極管發(fā)光,光敏三極管導通,輸出高電壓(+5 V),選中RS485接口芯片的DE端,允許發(fā)送。當單片機P1.6=1時(shí),光電耦合器的發(fā)光二極管不發(fā)光,光敏三極管不導通,輸出低電壓(0 V),選中RS485接口芯片的RE端,允許接收。SN75LBC184的R端(接收端)和D端(發(fā)送端)的原理與上述類(lèi)似。
2.2 RS-485的DE控制端設計
在RS-485總線(xiàn)構筑的半雙工通信系統中,在整個(gè)網(wǎng)絡(luò )中任一時(shí)刻只能有一個(gè)節點(diǎn)處于發(fā)送狀態(tài)并向總線(xiàn)發(fā)送數據,其他所有節點(diǎn)都必須處于接收狀態(tài)。如果有2個(gè)節點(diǎn)或2個(gè)以上節點(diǎn)同時(shí)向總線(xiàn)發(fā)送數據,將會(huì )導致所有發(fā)送方的數據發(fā)送失敗。因此,在系統各個(gè)節點(diǎn)的硬件設計中,應首先力求避免因異常情況而引起本節點(diǎn)向總線(xiàn)發(fā)送數據而導致總線(xiàn)數據沖突。以MCS51系列的單片機為例,因其在系統復位時(shí),I/O口都輸出高電平,如果把I/O口直接與RS-485接口芯片的驅動(dòng)器使能端DE相連,會(huì )在CPU復位期間使DE為高,從而使本節點(diǎn)處于發(fā)送狀態(tài)。如果此時(shí)總線(xiàn)上有其他節點(diǎn)正在發(fā)送數據,則此次數據傳輸將被打斷而告失敗,甚至引起整個(gè)總線(xiàn)因某一節點(diǎn)的故障而通信阻塞,繼而影響整個(gè)系統的正常運行??紤]到通信的穩定性和可靠性,在每個(gè)節點(diǎn)的設計中應將控制RS485總線(xiàn)接口芯片的發(fā)送引腳設計成DE端的反邏輯,即控制引腳為邏輯“1”時(shí),DE端為“0”;控制引腳為邏輯“0”時(shí),DE端為“1”。在圖1中,將CPU的引腳P1.6通過(guò)光電耦合器驅動(dòng)DE端,這樣就可以使控制引腳為高或者異常復位時(shí)使SN75LBC184始終處于接收狀態(tài),從而從硬件上有效避免節點(diǎn)因異常情況而對整個(gè)系統造成的影響。這就為整個(gè)系統的通信可靠奠定了基礎。
此外,電路中還有1片看門(mén)狗MAX813L,能在節點(diǎn)發(fā)生死循環(huán)或其他故障時(shí),自動(dòng)復位程序,交出RS-485總線(xiàn)控制權。這樣就能保證整個(gè)系統不會(huì )因某一節點(diǎn)發(fā)生故障而獨占總線(xiàn),導致整個(gè)系統癱瘓。
2.3 避免總線(xiàn)沖突的設計
當一個(gè)節點(diǎn)需要使用總線(xiàn)時(shí),為了實(shí)現總線(xiàn)通信可靠,在有數據需要發(fā)送的情況下先偵聽(tīng)總線(xiàn)。在硬件接口上,首先將RS-485接口芯片的數據接收引腳反相后接至CPU的中斷引腳INT0。在圖1中,INT0是連至光電耦合器的輸出端。當總線(xiàn)上有數據正在傳輸時(shí),SN75LBC184的數據接收端(R端)表現為變化的高低電平,利用其產(chǎn)生的CPU下降沿中斷(也可采用查詢(xún)方式),能得知此時(shí)總線(xiàn)是否正“忙”,即總線(xiàn)上是否有節點(diǎn)正在通信。如果“空閑”,則可以得到對總線(xiàn)的使用權限,這樣就較好地解決了總線(xiàn)沖突的問(wèn)題。在此基礎上,還可以定義各種消息的優(yōu)先級,使高優(yōu)先級的消息得以?xún)?yōu)先發(fā)送,從而進(jìn)一步提高系統的實(shí)時(shí)性。采用這種工作方式后,系統中已經(jīng)沒(méi)有主、從節點(diǎn)之分,各個(gè)節點(diǎn)對總線(xiàn)的使用權限是平等的,從而有效避免了個(gè)別節點(diǎn)通信負擔較重的情況??偩€(xiàn)的利用率和系統的通信效率都得以大大提高,從而也使系統響應的實(shí)時(shí)性得到改善,而且即使系統中個(gè)別節點(diǎn)發(fā)生故障,也不會(huì )影響其他節點(diǎn)的正常通信和正常工作。這樣使得系統的“危險”分散了,從某種程度上來(lái)說(shuō)增強了系統的工作可靠性和穩定性。
2.4 RS-485輸出電路部分的設計
在圖1中,VD1~VD4為信號限幅二極管,其穩壓值應保證符合RS-485標準,VD1和VD3取12 V,VD2 和VD4取7 V,以保證將信號幅度限定在-7~+12 V之間,進(jìn)一步提高抗過(guò)壓的能力??紤]到線(xiàn)路的特殊情況(如某一節點(diǎn)的RS-485芯片被擊穿短路),為防止總線(xiàn)中其他分機的通信受到影響,在SN75LBC184的信號輸出端串聯(lián)了2個(gè)20 Ω的電阻R1和R2,這樣本機的硬件故障就不會(huì )使整個(gè)總線(xiàn)的通信受到影響。在應用系統工程的現場(chǎng)施工中,由于通信載體是雙絞線(xiàn),它的特性阻抗為120 Ω左右,所以線(xiàn)路設計時(shí),在RS485網(wǎng)絡(luò )傳輸線(xiàn)的始端和末端應各接1個(gè)120 Ω的匹配電阻(如圖1中的R3),以減少線(xiàn)路上傳輸信號的反射。
2.5系統的電源選擇
對于由單片機結合RS-485組建的測控網(wǎng)絡(luò ),應優(yōu)先采用各節點(diǎn)獨立供電的方案,同時(shí)電源線(xiàn)不能與RS-485信號線(xiàn)共用同一股多芯電纜。RS-485信號線(xiàn)宜選用截面積0.75 mm2以上的雙絞線(xiàn)而不是平直線(xiàn),并且選用線(xiàn)性電源TL750L05比選用開(kāi)關(guān)電源更合適。TL750L05必須有輸出電容,若沒(méi)有輸出電容,則其輸出端的電壓為鋸齒波形狀,鋸齒波的上升沿隨輸入電壓變化而變化,加輸出電容后,可以抑制該現象。
3、軟件的編程
SN75LBC184在接收方式時(shí),A、B為輸入,R為輸出;在發(fā)送方式時(shí),D為輸入,A、B為輸出。當傳送方向改變一次后,如果輸入未變化,則此時(shí)輸出為隨機狀態(tài),直至輸入狀態(tài)變化一次,輸出狀態(tài)才確定。顯然,在由發(fā)送方式轉入接收方式后,如果A、B狀態(tài)變化前,R為低電平,在第一個(gè)數據起始位時(shí),R仍為低電平,CPU認為此時(shí)無(wú)起始位,直到出現第一個(gè)下降沿,CPU才開(kāi)始接收第一個(gè)數據,這將導致接收錯誤。由接收方式轉入發(fā)送方式后,D變化前,若A與B之間為低電壓,發(fā)送第一個(gè)數據起始位時(shí),A與B之間仍為低電壓,A、B引腳無(wú)起始位,同樣會(huì )導致發(fā)送錯誤??朔@種后果的方案是:主機連續發(fā)送兩個(gè)同步字,同步字要包含多次邊沿變化(如55H ,0AAH),并發(fā)送兩次(第一次可能接收錯誤而忽略) ,接收端收到同步字后,就可以傳送數據了,從而保證正確通信。
為了更可靠地工作,在RS485總線(xiàn)狀態(tài)切換時(shí)需要適當延時(shí),再進(jìn)行數據的收發(fā)。具體的做法是在數據發(fā)送狀態(tài)下,先將控制端置“1”,延時(shí)0.5 ms左右的時(shí)間,再發(fā)送有效的數據,數據發(fā)送結束后,再延時(shí)0.5 ms,將控制端置“0”。這樣的處理會(huì )使總線(xiàn)在狀態(tài)切換時(shí),有一個(gè)穩定的工作過(guò)程。數據通信程序基本流程圖如圖2所示。
圖2 數據通信程序基本流程圖
單片機通信節點(diǎn)的程序基本上可以分為6個(gè)主要部分,分別為預定義部分、初始化部分、主程序部分、設備狀態(tài)檢測部分、幀接收部分和幀發(fā)送部分。預定義部分主要定義了通信中使用的握手信號,用于保存設備信息的緩沖區和保存本節點(diǎn)設備號的變量。設備狀態(tài)檢測部分應能在程序初始化后,當硬件發(fā)生故障時(shí),作出相應的反應。主程序部分應能接收命令幀,并根據命令的內容作出相應的回應。為縮短篇幅,這里僅給出主程序部分的代碼。如下所示:
/* 主程序流程*/
while(1) { //主循環(huán)
if(recv_cmd(&type)==0) //發(fā)生幀錯誤或幀地址與本機
//地址不符,丟棄當前幀后返回
continue;
switch(type) {
case __ACTIVE_: //主機詢(xún)問(wèn)從機是否存在
send_data(__OK_, 0,dbuf);//發(fā)送應答信息
break;
case __GETDATA_:
len = strlen(dbuf);
send_data(__STATUS_, len,dbuf);//發(fā)送狀態(tài)信息
break;
default:
break; //命令類(lèi)型錯誤,丟棄當前幀后返回
}
}
4、結論
RS-485由于使用了差分電平傳輸信號,傳輸距離比RS-232更長(cháng),最多可以達到3000 m,因此很適合工業(yè)環(huán)境下的應用。但與CAN總線(xiàn)等更為先進(jìn)的現場(chǎng)工業(yè)總線(xiàn)相比,其處理錯誤的能力還稍顯遜色,所以在軟件部分還需要進(jìn)行特別的設計,以避免數據錯誤等情況發(fā)生。另外,系統的數據冗余量較大,對于速度要求高的應用場(chǎng)所不適宜用RS-485總線(xiàn)。雖然RS-485總線(xiàn)存在一些缺點(diǎn),但由于它的線(xiàn)路設計簡(jiǎn)單、價(jià)格低廉、控制方便,只要處理好細節,在某些工程應用中仍然能發(fā)揮良好的作用??傊?,解決可靠性的關(guān)鍵在于工程開(kāi)始施工前就要全盤(pán)考慮可采取的措施,這樣才能從根本上解決問(wèn)題,而不要等到工程后期再去亡羊補牢。
評論