隨著單片微機在各個領域中的應用越來越廣泛,對其可靠性要求也越來越高。單片機系統的可靠性由多種因素決定,其中系統抗干擾性能是可靠性的重要指標。工業環境有強烈的電磁干擾,因此必須采取抗干擾措施,否則難以穩定、可靠運行。
工業環境中的干擾一般是以脈沖形式進入微機系統,渠道主要有三條,如圖1所示。
空間干擾(場干擾),電磁信號通過空間輻射進入系統。
過程通道干擾,干擾通過與系統相連的前向通道、后向通道及與其它系統的相互通道進入。
供電系統干擾,電磁信號通過供電線路進入系統。
一般情況下空間干擾在強度上遠小于其它兩種,故微機系統中應重點防止過程通道與供電系統的干擾。
抗干擾措施有硬件措施和軟件措施。硬件措施如果得當,可將絕大部分干擾拒之門外,但仍然會有少數干擾進入微機系統,故軟件措施作為第二道防線必不可少。由于軟件抗干擾措施是以CPU為代價的,如果沒有硬件消除絕大多數干擾,CPU將疲于奔命,無暇顧及正常工作,嚴重影響系統的工作效率和實時性。因此,一個成功的抗干擾系統是由硬件和軟件相結合構成的。
筆者設計的激光打標控制系統由于現場使用環境較惡劣,各種干擾因素較多,如交流噪聲、電網干擾及其它電磁干擾等,因此必須采取有效的抗干擾措施以確保系統穩定工作,下面介紹我們在該系統硬件、軟件和CPU上采取的抗干擾措施。
硬件措施
光電隔離
在輸入和輸出通道上采用光電隔離器來進行信息傳輸是很有好處的,它將微機系統與各種傳感器、開關、執行機構從電氣上隔離開來,很大一部分干擾將被阻擋。本系統中步進電機驅動電路采用了光電隔離器4N33。電路如圖2所示。
過壓保護電路
在輸入輸出通道上應采用一過壓保護電路,以防引入高電壓,傷害微機系統。過壓保護電路由限流電阻和穩壓管組成,限流電阻選擇要適宜,太大會引起信號衰減,太小起不到保護穩壓管的作用。穩壓管的選擇也要適宜,其穩壓值以略高于最高傳送信號電壓為宜,太低將對有效信號起限幅效果,使信號失真。步進電機驅動電路即采用過壓保護電路。
抗干擾電源
微機系統供電線路是干擾的主要來源,電源采用隔離變壓器接入電網,可以防止電網的干擾侵入微機系統。隔離變壓器與普通變壓器的不同之處在于它在初級和次級之間加了一層屏蔽層,并將它和鐵芯一起接地。
配置去耦電容
原則上每個集成電路芯片都應安置一個0.01mF的陶瓷電容器,可以消除大部分高頻干擾。
良好接地
本系統既有模擬電路又有數字電路,因此數字地與模擬地要分開,最后只在一點相連,如果兩者不分,則會互相干擾。
軟件措施
單片機在輸出信號時,外部干擾有可能使信號出錯。本系統中單片機發出的驅動步進電機的信號經鎖存器鎖存后傳送給驅動電路,鎖存器對干擾非常敏感,當鎖存線上出現干擾時,會盲目鎖存當前數據,而不管是否有效。因此首先應將鎖存器與單片機安裝在同一電路板上,使傳輸線上傳送的是已經鎖存好的控制信號。在軟件上,最有效的方法就是重復輸出同一個信號,只要重復周期盡可能短,鎖存器接收到一個被干擾的錯誤信號后還來不及作出有效的反應,一個正確的輸出信號又來到,就可以及時防止錯誤動作的產生。
CPU抗干擾措施
前面幾項抗干擾措施是針對I/O通道,干擾還未作用到單片機本身,這時單片機還能正確無誤地執行各種抗干擾程序,當干擾作用到單片機本身時(通過干擾三總線等),單片機將不能按正常狀態執行程序,從而引起混亂。如何發現單片機受到干擾,如何攔截失去控制的程序流向,如何使系統的損失減小,如何恢復系統的正常運行,這些就是CPU抗干擾需要解決的問題。我們采用了以下幾種方法。
人工復位
對于失控的CPU,最簡單的方法是使其復位,程序自動從0000H開始執行。為此只要在單片機的RESET端加上一個高電平信號,并持續10ms以上即可。
掉電保護
電網瞬間斷電或電壓突然下降將使微機系統陷入混亂狀態,電網電壓恢復正常后,微機系統難以恢復正常。對付這一類事故的有效方法就是掉電保護。掉電信號由硬件電路檢測到,加到單片機的外部中斷輸入端。軟件中斷將掉電中斷規定為高級中斷,使系統及時對掉電作出反應。在掉電中斷子程序中,首先進行現場保護,保存當時重要的狀態參數,當電源恢復正常時,CPU重新復位,恢復現場,繼續未完成的工作。
睡眠抗干擾
CMOS型的51系列單片機具有睡眠狀態,此時只有定時/計數系統和中斷系統處于工作狀態。這時CPU對系統三總線上出現的干擾不會作出任何反應,從而大大降低系統對干擾的敏感程度。
我們仔細分析系統軟件后發現,CPU很多情況下是在執行一些等待指令和循環檢查程序,由于這時CPU雖沒有重要工作,但卻是清醒的,很容易受干擾。讓CPU在沒有正常工作時休眠,必要時再由中斷系統來喚醒它,之后又處于休眠。采用這種安排之后,大多數CPU可以有50~95%的時間用于睡眠,從而使CPU受到隨機干擾的威脅大大降低,同時降低了CPU的功耗。
指令冗余
當CPU受到干擾后,往往將一些操作數當作指令碼來執行,引起程序混亂。這時我們首先要盡快將程序納入正軌(執行真正的指令系列)。MCS-51系統中所有指令都不超過3個字節,而且有很多單字節指令。當程序彈飛到某一條單字節指令上時,便自動納入正軌。當彈飛到某一雙字節或三字書指令上時,有可能落到其操作數上,從而繼續出錯。因此,我們應多采用單字節指令,并在關鍵的地方人為地插入一些單字節指令(NOP),或將有效單字書指令重復書寫,這便是指令冗余。
在雙字節和三字節指令之后插入兩條NOP指令,可保護其后的指令不被拆散;蛘哒f,某指令前如果插入兩條NOP指令,則這條指令就不會被前面沖下來的失控程序拆散,并將被完整執行,從而使程序走上正軌。但不能加入太多的冗余指令,以免明顯降低程序正常運行的效率。因此,常在一些對程序流向起決定作用的指令之前插入兩條NOP指令,以保證彈飛的程序迅速納入正確的控制軌道。此類指令有:RET、RETI、LCALL、SJMP、JZ、CJNE等。在某些對系統工作狀態至關重要的指令(如SETB EA之類)前也可插人兩條NOP指令,以保證被正確執行。上述關鍵指令中,RET和RETI本身即為單字書指令,可以直接用其本身來代替NOP指令,但有可能增加潛在危險,不如NOP指令安全。
軟件陷阱
指令冗余使彈飛的程序安定下來是有條件的,首先彈飛的程序必須落到程序區,其次必須執行到冗余指令。當彈飛的程序落到非程序區(如EPROM中未使用的空間、程序中的數據表格區)時前一個條件即不滿足,當彈飛的程序在沒有碰到冗余指令之前,已經自動形成一個死循環,這時第二個條件也不滿足。對付前一種情況采取的措施就是設立軟件陷阱,對于后一種情況采取的措施是建立程序運行監視系統(WATCHDOG)。
所謂軟件陷阱,就是一條引導指令,強行將捕獲的程序引向對程序出錯進行處理的程序。如果我們把這段程序的入口標號稱為ERR的話,軟件陷阱即為一條LJMP ERR指令,為加強其捕捉效果,一般還在它前面加兩條NOP指令,因此,真正的軟件陷阱由三條指令構成:
NOP
NOP
LJIMP ERR
軟件陷阱安排在下列四種地方:
(1)未使用的中斷向量區。當干擾使未使用的中斷開放,并激活這些中斷時,就會進一步引起混亂。如果在這些地方布上陷阱,就能及時捕捉到錯誤中斷。
(2)未使用的大片ROM空間。現在使用EPROM都很少將其全部用完。對于剩余的大片未編程的ROM空間,一般均維持原狀(0FFH),0FFH對于指令系統,是一條單字節指令(MOV R7,A),程序彈飛到這一區域后將順流而下,不再跳躍(除非受到新的干擾)我們只要每隔一段設置一個陷阱,就一定能捕捉到彈飛的程序。軟件陷阱一定要指向出錯處理過程ERR。我們可以將ERR字排在0030H開始的地方,程序不管怎樣修改,編譯后ERR的地址總是固定的(因為它前面的中斷向量區是固定的)。這樣我們就可以用00 00 02 00 30五個字節作為陷阱來填充ROM中的未使用空間,或者每隔一段設置一個陷阱(02 00 30),其它單元保持0FFH不變。
(3)表格。有兩類表格,一類是數據表格,供MOVC A,@A+PC指令或MOVC A,@A+DPTR指令使用,其內容完全不是指令。另一類是散轉表格,供JMP @A+DPTR指令使用,其內容為一系列的三字節指令 LJMP或兩字節指令 AJMP。由于表格內容和檢索值有一一對應關系,在表格中間安排陷阱將會破壞其連續性和對應關系,只能在表格的最后安排五字節陷阱(NOP NOP LJMP ERR)。
(4)程序區。程序區是由一串串執行指令構成的,在這些指令串之間常有一些斷裂點,正常執行的程序到此便不會繼續往下執行了,這類指令有JMP、RET等。這時PC的值應發生正常跳變。如果還要順次往下執行,必然就出錯了。當然,彈飛來的程序剛好落到斷裂點的操作數上或落到前面指令的操作數上(又沒有在這條指令之前使用冗余指令),則程序就會越過斷裂點,繼續往前沖。我們在這種地方安排陷阱之后,就能有效地捕捉住它,而又不影響正常執行的程序流程。例如:
……
AJMP ABC
NOP
NOP
LJMP ERR
……
ABC:MOV A,R2
RET
NOP
NOP
LJMP ERR
ERR: ……
由于軟件陷阱都安排在程序正常執行不到的地方,故不會影響程序執行效率。
結語
綜上所述,通過對單片機應用系統的軟硬件全面考慮,并針對不同的情況采取不同的技術措施,保證了系統準確、可靠運行。激光打標控制系統采用了上述抗干擾措施后,系統可靠性大大增強,運行穩定,效果理想,現已批量生產,取得了良好的經濟效益!
|