作為一個正式的系統(tǒng)或產(chǎn)品,當系統(tǒng)基本功能調(diào)試完成后,一旦進行現(xiàn)場測試階段,請注意馬上改寫熔絲位的配置,啟用AVR的電源檢測(BOD)功能。
對于5V系統(tǒng),設(shè)置BOD電平為4.0V;對于3V系統(tǒng),設(shè)置BOD電平為2.7V。然后允許BOD檢測。
這樣,一旦AVR的供電電壓低于BOD電平,AVR進入RESET(不執(zhí)行程序了)。而當電源恢復到BOD電平以上,AVR才正式開始從頭執(zhí)行程序。保證了系統(tǒng)的可靠性!
原因分析如下:
AVR是寬電壓工作的芯片,當電壓跌至2.5V,系統(tǒng)程序還能工作。這是有2個可怕的現(xiàn)象可能出現(xiàn),
1。外圍芯片工作已經(jīng)混亂,AVR讀到的東西不正確,造成程序的執(zhí)行發(fā)生邏輯錯誤(不是AVR本身的原因)。
2。當電源低到臨界點,如2.4V時,并且在此互上互下的,AVR本身的程序執(zhí)行也不正常,取指令、讀數(shù)據(jù)都可能發(fā)生錯誤,或程序亂飛、不穩(wěn)定(AVR本身的原因,實際任何的單片機都是這樣的),非常容易造成EEPROM、FALSH的破壞。有人問51怎么不會?實際上51也是這樣,只是51內(nèi)部沒有直接寫EEPROM、FLASH的指令,它的程序亂飛留不下痕跡。還有人有疑問:外掛EEPROM,掉電時怎么不會改寫?實際是外掛EEPROM,當電壓低于4V(2.7V)時,它已經(jīng)不工作了,程序去改內(nèi)容也改不了。而AVR內(nèi)部的東西在臨界電壓時都能工作,但非常不穩(wěn)定。
AVR的BOD功能必須要使用,我早期使用51時,凡是產(chǎn)品外部都要使用電源監(jiān)測芯片,現(xiàn)在AVR自己本身就有該功能,一定要使用。
下面是AVR獵手的經(jīng)驗之談:
在做的一個控制系統(tǒng),現(xiàn)場環(huán)境提供給我的電源是DC 24V,我的系統(tǒng)需要兩個電壓,一個是DC 12V 3A,一個是DC 5V 200mA。12V穩(wěn)壓選用了1501A12開關(guān)穩(wěn)壓IC(此芯片最大電流可以承受5A,如果要達到這么大的電流,配套的電感很重要,必須使用藍綠磁環(huán),0.85mm的漆包線繞制,22uH的電感量)。5V的電源用7805對12V電源進行穩(wěn)壓。單片機用的是ATMEGA48,使用洞洞板焊接做實驗,芯片的熔絲只修改了下振蕩源為外部晶體振蕩和關(guān)閉8分頻功能,未開啟BOD。
因為12V的電壓系統(tǒng)要帶動一個直流電機,由12V的繼電器進行帶動控制,因為電機工作時帶動的負載有可能會被外力阻擋而造成電機停轉(zhuǎn)過載,這個時候電機的堵轉(zhuǎn)電流可能達到3A左右,所以在硬件上我做了保護,采用AVR的ADC檢測電機的工作電流,如果發(fā)生過載,則馬上停止電機工作。
這個手工焊接的控制板測試時工作正常,包括電機過載測試,都未發(fā)生什么故障。
都測試通過后,制板回來,燒寫程序的時候順便打開AVR的BOD,設(shè)置為4.3V。然后開始著手做一些過載測試,發(fā)現(xiàn)一過載MCU就馬上復位~~~超級郁悶啊~~~以為自己又改了什么程序?qū)е虏环€(wěn)定,或者是啟動電機工作后的延時時間不夠(大家都知道:在驅(qū)動大功率負載的時候,在接通繼電器的時候,MCU的指令控制一定要再延時幾十個毫秒~幾百個毫秒左右,否則會出現(xiàn)繼電器吸合后馬上斷開的問題。詳細原因不在本文討論范圍之內(nèi)就不多說了,書本上都有詳細說明這些用法),真的很打擊人~ 想想AVR也沒這么脆弱~~或者是我布板設(shè)計不合理???沒這個理由的,以前的板子可是用洞洞板焊接的,以前不管怎么測試都不會復位。試著增加了輸出控制的延時時間,還是一樣的結(jié)果,一過載就復位。
軟件改了~不行~~~寫入以前的軟件~也不行
換回以前的洞洞板測試,OK,沒問題。不會吧~~~
靜下心來仔細想想,兩個板的差異,硬件一樣,軟件一樣,芯片一樣。等等…好象…對了!新做的板子都開啟了BOD使能。馬上先把BOD關(guān)了,果然,系統(tǒng)沒有再發(fā)生過一次復位的情況。問題是解決了,但總得給個理由吧,總不能就放著BOD不用~~~再用眼睛仔細觀察電機過載時電路板的一些狀態(tài),發(fā)現(xiàn)12V的LED電源指示燈會在電機過載的瞬間暗了一下,哇靠~!火眼金睛啊~!多帶了個眼鏡果然不一樣!^_^哈哈,知道哪里的問題了。應(yīng)該是電機過載時,12V的電壓有所跌落,然后導致經(jīng)過7805穩(wěn)壓后的5V電壓也有所跌落,雖然這個電壓的跌落只是瞬間,可能有跌到 4.3V以下,但這個瞬間馬上被BOD檢測到了,BOD強制MCU復位。這個瞬間的跌落用萬用表是檢測不出的,特別是用數(shù)字表更看不出了,有示波器的話就可以看下這個的跌落波形了。我手上只有兩個數(shù)字表,所以沒法把這個瞬間的波形捕捉出來給大家看了。(有些時候數(shù)字表還不如指針表,指針表可能還會更直觀的顯示出一些瞬態(tài)變化,如果有指針表應(yīng)該也可以看出一些細微的電壓波動)
解決方法:BOD的作用上面馬老師已經(jīng)說了,所以還是不能關(guān)掉了事,設(shè)置為2.7V即可,我這樣做有沒有道理大家自己想咯^_^
把自己使用BOD的過程分享出來是想告訴大家:使用BOD的時候不是隨手開下就了事的,要注意實際工作的一些異常狀況的發(fā)生,設(shè)置好適合系統(tǒng)的BOD電壓才能保證你的系統(tǒng)工作的更可靠。
擴展閱讀:AVR的IO用法筆記