基于微控制器的抗干擾軟件編程的方法
出處:電子產(chǎn)品世界 發(fā)布于:2011-09-03 12:33:08
在提高硬件系統(tǒng)抗干擾能力的同時(shí),軟件抗干擾以其設(shè)計(jì)靈活、節(jié)省硬件資源、可靠性好越來(lái)越受到重視。下面以MCS-51單片機(jī)系統(tǒng)為例,對(duì)微機(jī)系統(tǒng)軟件抗干擾方法進(jìn)行研究。在工程實(shí)踐中,軟件抗干擾研究的內(nèi)容主要是: 一、消除模擬輸入信號(hào)的嗓聲(如數(shù)字濾波技術(shù));二、程序運(yùn)行混亂時(shí)使程序重入正軌的方法。本文針對(duì)后者提出了幾種有效的軟件抗干擾方法。
在嵌入式微控制器內(nèi)部,對(duì)于內(nèi)部產(chǎn)生的電磁發(fā)射,采用軟件措施的效果并不明顯。因?yàn)榘l(fā)射主要是由CPU中的內(nèi)部時(shí)鐘和噪聲引起,而且高速開關(guān)電流是由微控制器中的多種不同的門所形成。如果芯片版圖設(shè)計(jì)時(shí)沒有考慮電磁兼容性,那么外部的PCB(印制電路板)將會(huì)大大增強(qiáng)那些不必要的噪聲信號(hào)。所以在很多設(shè)計(jì)中,采用軟件很難消除這種固有的電子發(fā)射影響。
一、內(nèi)嵌抗干擾軟件
在很多的應(yīng)用中,用簡(jiǎn)單的抗干擾設(shè)計(jì),就可以將一個(gè)微控制器的干擾抑制效果大大提高。這種抗干擾設(shè)計(jì)的魅力就在于實(shí)現(xiàn)該設(shè)計(jì)的費(fèi)用較低,還可以節(jié)省PCB板上硬件成本。抗干擾設(shè)計(jì)的常用技巧如下:
1.刷新端口引腳(Refreshing port pins):抗干擾軟件簡(jiǎn)單的一個(gè)例子就是可以不斷地更新I/O端口和一些重要的寄存器。在大多數(shù)微控制器的應(yīng)用中,軟件將會(huì)執(zhí)行一個(gè)有規(guī)律的主循環(huán)。由于微控制器的I/O端口通常靠近連接焊點(diǎn)(bond pads),而這些焊點(diǎn)通常是位于芯片的邊沿。當(dāng)一個(gè)確定振幅的噪聲施加到微控制器時(shí),噪聲將會(huì)從芯片的邊沿向內(nèi)傳入硅晶體中。這意味著芯片邊沿的邏輯電路容易被外部噪聲源破壞,輸入/輸出電路就屬于這種類型。因此有規(guī)律的更新數(shù)據(jù)寄存器和數(shù)據(jù)說(shuō)明寄存器,就可以把這種故障的威脅降低。
2.檢測(cè)輸入腳(Polling inputs):另一個(gè)方法就是采用多次讀輸入腳數(shù)據(jù),且取平均值作為該腳的正確數(shù)據(jù)方式。其典型的應(yīng)用就是用軟件每隔10ms讀鍵盤,以保證真實(shí)的鍵入發(fā)生。這種表決式做法被稱作反彈跳保護(hù)。作為一種高頻率檢測(cè)某個(gè)端腳的Motorola HC05代碼的實(shí)例如圖1所示。
圖1的程序可以很迅速地連續(xù)讀出該端口,如果有3次讀出結(jié)果相同,那么CPU將以進(jìn)位標(biāo)志的狀態(tài)作為讀結(jié)果返回(這是HC05 CPU的BRSET和BRCLR的一個(gè)固有特征)。這個(gè)程序的問(wèn)題在于當(dāng)輸入引腳是處于很嘈雜的環(huán)境時(shí),CPU將會(huì)按這個(gè)程序持續(xù)很長(zhǎng)時(shí)間,這在那些對(duì)時(shí)間要求較苛刻的應(yīng)用中是不實(shí)際的。更好的一個(gè)程序就是多次讀出輸入引腳,并使寄存器遞增,如果結(jié)果小于某個(gè)數(shù),那么就將它當(dāng)作0;如果大于某個(gè)數(shù),就作為1。這個(gè)程序通常會(huì)在有間內(nèi)退出,以保證不會(huì)妨礙到該應(yīng)用中其他程序的運(yùn)行。
3.標(biāo)記通過(guò)(Token Passing):在一些重要的處理中,標(biāo)記通過(guò)用以確認(rèn)任務(wù)已進(jìn)入受控方式而未失去控制。標(biāo)記通過(guò)可以利用RAM里未用到的空間來(lái)完成。在應(yīng)用的一段特定時(shí)間間隔里,該軟件將通過(guò)許多未用的RAM空間循環(huán)一個(gè)1.在任何一個(gè)重要任務(wù)被執(zhí)行之前。這種循環(huán)檢查將會(huì)得出結(jié)果。結(jié)果檢測(cè)通過(guò),該任務(wù)將會(huì)被執(zhí)行。如果以沒通過(guò),則說(shuō)明微控制器是從未指定的跳轉(zhuǎn)進(jìn)入該任務(wù),那么就跳轉(zhuǎn)去執(zhí)行一個(gè)初始化程序。見圖2。
4.未使用的內(nèi)存(Unused Memory):在大多數(shù)的應(yīng)用中,程序的存儲(chǔ)器總有一些區(qū)域未使用。如果在一些事件中,程序計(jì)數(shù)器(Program Counter)被破壞且跳轉(zhuǎn)進(jìn)入未用的存儲(chǔ)空間,那么有些應(yīng)該執(zhí)行的控制就會(huì)起作用。例如,在16K字節(jié)的程序空間里存在未使用的500Byte的子塊。如果我們用"SWI"指令填滿這些未用空間,那么任何指向未用地區(qū)的無(wú)效激勵(lì)將會(huì)導(dǎo)致微控制器去讀取SWI矢量,而該向量是被編程跳轉(zhuǎn)到程序中的已知的起始位置。同樣,在微管制器的應(yīng)用中,SWI也可用其它函數(shù)來(lái)替代,以填充那些未用的區(qū)域,其實(shí)例如圖3所示。
二、看門狗電路
若失控的程序進(jìn)入“死循環(huán)”,通常采用“看門狗”技術(shù)使程序脫離“死循環(huán)”。通過(guò)不斷檢測(cè)程序循環(huán)運(yùn)行時(shí)間,若發(fā)現(xiàn)程序循環(huán)時(shí)間超過(guò)循環(huán)運(yùn)行時(shí)間,則認(rèn)為系統(tǒng)陷入“死循環(huán)”,需進(jìn)行出錯(cuò)處理。
“看門狗”技術(shù)可由硬件實(shí)現(xiàn),也可由軟件實(shí)現(xiàn)。 在工業(yè)應(yīng)用中,嚴(yán)重的干擾有時(shí)會(huì)破壞中斷方式控制字,關(guān)閉中斷。則系統(tǒng)無(wú)法定時(shí)“喂狗”,硬件看門狗電路失效。而軟件看門狗可有效地解決這類問(wèn)題。
筆者在實(shí)際應(yīng)用中,采用環(huán)形中斷監(jiān)視系統(tǒng)。用定時(shí)器T0監(jiān)視定時(shí)器T1,用定時(shí)器T1監(jiān)視主程序,主程序監(jiān)視定時(shí)器T0。采用這種環(huán)形結(jié)構(gòu)的軟件“看門狗”具有良好的抗干擾性能,大大提高了系統(tǒng)可靠性。對(duì)于需經(jīng)常使用T1定時(shí)器進(jìn)行串口通訊的測(cè)控系統(tǒng),則定時(shí)器T1不能進(jìn)行中斷,可改由串口中斷進(jìn)行監(jiān)控(如果用的是MCS-52系列單片機(jī),也可用T2代替T1進(jìn)行監(jiān)視)。這種軟件“看門狗”監(jiān)視原理是:在主程序、T0中斷服務(wù)程序、T1中斷服務(wù)程序中各設(shè)一運(yùn)行觀測(cè)變量,假設(shè)為MWatch、T0Watch 、T1Watch,主程序每循環(huán),MWatch加1,同樣T0、T1中斷服務(wù)程序執(zhí)行,T0Watch、 T1Watch加1。在T0中斷服務(wù)程序中通過(guò)檢測(cè)T1Watch的變化情況判定T1運(yùn)行是否正常,在T1中斷服務(wù)程序中檢測(cè)MWatch的變化情況判定主程序是否正常運(yùn)行,在主程序中通過(guò)檢測(cè)T0Watch的變化情況判別T0是否正常工作。若檢測(cè)到某觀測(cè)變量變化不正常,比如應(yīng)當(dāng)加1而未加1,則轉(zhuǎn)到出錯(cuò)處理程序作排除故障處理。當(dāng)然,對(duì)主程序循環(huán)周期、定時(shí)器T0和T1定時(shí)周期應(yīng)予以全盤合理考慮。限于篇幅不贅述。
一個(gè)看門狗電路通常被描述成一塊在有規(guī)律的時(shí)間間隔中進(jìn)行更新的硬件,該更新必須由微控制器或是使微控制器重新啟動(dòng)的電路來(lái)完成。一個(gè)外部的看門狗電路是的,因?yàn)樗灰蕾囄⒖刂破?,如果微控制器發(fā)生故障需要看門狗更新,則該電路將給出reset信號(hào)使微控制器重新啟動(dòng)。一個(gè)看門狗通常由一個(gè)硬件定時(shí)器構(gòu)成,如果沒有來(lái)看微控制器的更新或是信息,該定時(shí)器將會(huì)溢出。一個(gè)簡(jiǎn)單的看門狗電路如圖4。
在加電的POR時(shí)延內(nèi),微控制器將保持在復(fù)位狀態(tài)。時(shí)鐘可以來(lái)自一個(gè)外部源或是來(lái)自用于微控制器的晶振的一個(gè)脈沖。當(dāng)該微控制器處于復(fù)位狀態(tài)時(shí),輸入/輸出引腳就成為輸入,而此時(shí)計(jì)數(shù)器也開始運(yùn)作。如果Q是0,那么C1就會(huì)被充電,而微控制器將會(huì)跳離復(fù)位狀態(tài)。
微控制器的首要任務(wù)是給出一個(gè)小脈沖來(lái)重啟計(jì)數(shù)器到一個(gè)已知的時(shí)間溢出值,微控制器上的I/O端口形成交流耦合,目的在于保證只有邊沿觸發(fā)才能重新發(fā)計(jì)數(shù)器。這樣就保證了一個(gè)恒定的直流電平將不會(huì)有效作用于微控制器或看門狗。該微控制器必須在Q跳為1之前發(fā)送一個(gè)小的脈沖,以保證微控制器不被復(fù)位(正常情況下該操作至少需要兩個(gè)微控制器的軟件指令)。還有一個(gè)可供選擇的方法就是微控制器在晶片上具有內(nèi)嵌看門狗電路。例如Motorola 的MC68HC705C8就有它自身的看門狗,由一個(gè)可編程計(jì)數(shù)器組成,該計(jì)數(shù)器大約在每32768時(shí)鐘周期就要被刷新,或是它將在內(nèi)部產(chǎn)生一個(gè)清零指令。
CM1,0位通常用來(lái)選擇一個(gè)暫停周期(也就是CPU的時(shí)鐘被2 15,2 17,2 19,2 21 所劃分)。COPE位是"只寫"的而且一旦看門狗有效,就不會(huì)停止,只有重啟才能停止看門狗的動(dòng)作。COPF位是通知用戶的標(biāo)志,它通知用戶前的重啟的由于看門狗的時(shí)溢或是其它原因所引起。刷新看門狗的時(shí)序是在COP重啟寄存器(COPRR)上的兩個(gè)寫操作。即該序列是一個(gè)對(duì)COPRR進(jìn)行$55寫操作后緊跟$AA的寫操作。
不是所有的微控制器都有看門狗電路的,但是在一些設(shè)計(jì)中,設(shè)計(jì)者能夠用未使用的中斷來(lái)執(zhí)行它自己的看門狗功能。舉例來(lái)說(shuō),一個(gè)MC68HC05P1沒有看門狗,但是有一個(gè)16bit可自由運(yùn)行的計(jì)時(shí)器。有3種可能的方式,使該計(jì)時(shí)器能夠產(chǎn)生一個(gè)中斷。這3種方式是:
1)一個(gè)從FFFF向0000溢出的定時(shí)器。
2)一個(gè)輸出比較,16bit寄存器和定時(shí)器的值的比較。
3)對(duì)TCAP端口的上升或下降邊沿的一個(gè)輸入捕捉。
如果此輸出比較(Output Compare)中斷不能被執(zhí)行,則其將被當(dāng)做假的看門狗。在這種情況下,定時(shí)器將與"輸出比較(output compare)"寄存器作個(gè)比較,以檢驗(yàn)系統(tǒng)是否都正常。如果系統(tǒng)運(yùn)行正確,那么將執(zhí)行一個(gè)中斷返回。如果有不正常情況,那么堆棧指針的復(fù)位和一個(gè)往初始化程序的跳轉(zhuǎn)將會(huì)執(zhí)行。該系統(tǒng)檢驗(yàn)可以是前述的"標(biāo)志通過(guò)"程序。
三、開機(jī)復(fù)位
開機(jī)復(fù)位與看門狗故障復(fù)位因同屬硬件復(fù)位, 所以要想予以正確識(shí)別,一般要借助非易失性RAM或者EEROM。當(dāng)系統(tǒng)正常運(yùn)行時(shí),設(shè)置一可掉電保護(hù)的觀測(cè)單元。當(dāng)系統(tǒng)正常運(yùn)行時(shí),在定時(shí)喂狗的中斷服務(wù)程序中使該觀測(cè)單元保持正常值(設(shè)為 AAH),而在主程中將該單元清零,因觀測(cè)單元掉電可保護(hù),則開機(jī)時(shí)通過(guò)檢測(cè)該單元是否為正常值可判斷是否看門狗復(fù)位。
識(shí)別測(cè)控系統(tǒng)中因意外情況如系統(tǒng)掉電等情況引起的開機(jī)復(fù)位與正常開機(jī)復(fù)位,對(duì)于過(guò)程控制系統(tǒng)尤為重要。如某以時(shí)間為控制標(biāo)準(zhǔn)的測(cè)控系統(tǒng),完成測(cè)控任務(wù)需1小時(shí)。在已執(zhí)行測(cè)控50分鐘的情況下,系統(tǒng)電壓異常引起復(fù)位,此時(shí)若系統(tǒng)復(fù)位后又從頭開始進(jìn)行測(cè)控則會(huì)造成不必要的時(shí)間消耗。因此可通過(guò)一監(jiān)測(cè)單元對(duì)當(dāng)前系統(tǒng)的運(yùn)行狀態(tài)、系統(tǒng)時(shí)間予以監(jiān)控,將控制過(guò)程分解為若干步或若干時(shí)間段,每執(zhí)行完一步或每運(yùn)行一個(gè)時(shí)間段則對(duì)監(jiān)測(cè)單元置為關(guān)機(jī)允許值,不同的任務(wù)或任務(wù)的不同階段有不同的值,若系統(tǒng)正在進(jìn)行測(cè)控任務(wù)或正在執(zhí)某時(shí)間段,則將監(jiān)測(cè)單元置為非正常關(guān)機(jī)值。那么系統(tǒng)復(fù)位后可據(jù)此單元判系統(tǒng)原來(lái)的運(yùn)行狀態(tài),并跳到出錯(cuò)處理程序中恢復(fù)系統(tǒng)原運(yùn)行狀態(tài)。
四、結(jié)束語(yǔ)
在一個(gè)程序里,"看門狗更新(watchdog updates)"選位置的選擇不是一個(gè)簡(jiǎn)單的事情,一般說(shuō)來(lái),是結(jié)束程序時(shí)的進(jìn)程。通常用戶需要測(cè)試軟件流程和所有的中斷程序和子程序的時(shí)序,關(guān)鍵的和非關(guān)鍵的應(yīng)用。在所有的程序中進(jìn)行看門狗惻新是的,但是由于微控制器有很長(zhǎng)的程序和很多的芯片功能,因此這樣是很難做到的。如果可能的話,看門狗刷新程序不應(yīng)該被放在中斷或是子程序中。原則上應(yīng)該直接放入主程序中。要注意的是刷新速率不要太大,否則將使失控狀態(tài)恢復(fù)的幾率下降。
對(duì)于軟件抗干擾的一些其它常用方法如數(shù)字濾波、RAM數(shù)據(jù)保護(hù)與糾錯(cuò)等,限于篇幅,本文未作討論。在工程實(shí)踐中通常都是幾種抗干擾方法并用,互相補(bǔ)充完善,才能取得較好的抗干擾效果。從根本上來(lái)說(shuō),硬件抗干擾是主動(dòng)的,而軟件是抗干擾是被動(dòng)的。細(xì)致周到地分析干擾源,硬件與軟件抗干擾相結(jié)合,完善系統(tǒng)監(jiān)控程序,設(shè)計(jì)一穩(wěn)定可靠的單片機(jī)系統(tǒng)是完全可行的。
參考文獻(xiàn):
[1]. MCS-51 datasheet http://m.58mhw.cn/datasheet/MCS-51_477840.html.
[2]. PCB datasheet http://m.58mhw.cn/datasheet/PCB_1201640.html.
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開發(fā)實(shí)踐指南2026/1/6 10:40:19
- 嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計(jì)實(shí)踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時(shí)代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識(shí)2025/7/14 16:59:04









