做了一個產品,在家里測試一切正常,到客戶那里測試一開始也完全正常,開始小批量供貨,第一批沒問題,從第二批開始,故障不斷,癥狀就是:單片機程序跑飛。
本來一直自詡為單片機老鳥,做過的產品也有幾十種了,沒想到在這個問題上栽了跟頭。
簡單描述一下產品:
輸入:有三路外接IO信號,一個由光電開關產生,用于計數,一個急停開關,還有一個按鈕用于手動控制,這三路信號全部經光耦隔離后輸入;
輸出:三個繼電器,繼電器輸出控制設備上的中繼繼電器,由中繼繼電器再去控制三個24V電磁閥的通斷,我線路板上的繼電器是單獨供電,與單片機電源不共地,用光耦隔離后再驅動繼電器的。
其它就是幾個數碼管、按鍵以及蜂鳴器,沒什么特別的。
PCB布局上,輸入、輸出在線路板邊緣,與單片機距離較遠,單片機周圍覆銅屏蔽。
電源采用雙組輸出的變壓器(帶屏蔽),有硬件看門狗,每個芯片電源端有0.1uf瓷片電容。
不帶負載時,一切功能正常,用白熾燈做負載也完全正常,可到了用戶那兒就不正常。數次前往用戶現場,均無功而返。
程序結構是:主程序負責將看門狗信號置1,之后就進入空閑方式,等待定時中斷喚醒,除此啥也不干,定時器0產生一4毫秒中斷,每隔4毫秒將看門狗清0,刷新一次顯示輸出,讀取一下按鍵以及外部輸入,根據輸入狀態確定輸出信號。
故障發生時:數碼管亂閃,但仍可相應外部IO信號以及按鍵信號,大約2秒后,看門狗動作,單片機復位,處于待機狀態。我判斷就是程序跑到我的程序空間外面去了。
我更換了各種單片機,原來用的是AT89C52,換成AT89S52之后,跑飛的幾率幾乎加大了10倍,換華邦的52,比S52好,但是比C52差,STC的表現和S52差不多,換新茂的也不行。
我用示波器觀察單片機電源,每當外部電磁閥動作時,單片機5V電源上產生一小串毛刺,幅度有正負2V以上,持續時間在數十微秒。當時我認為只要將電源上的毛刺解決掉就可以了。
但是,接下來我傻眼了,無論我用什么辦法,5V電源上的毛刺無法消除,包括在產品的電源輸入端加防浪涌濾波器,在5V電源上串電感,并10uf鉭電容,在5V電源上并5.1V穩壓管,甚至我單獨再做一個5V電源,只要此電源和設備共用一組交流電,毛刺就是沒辦法消除。
后來我發現,將這個產品用的雙組輸出的變壓器移到殼子外部,程序跑飛明顯減少,但是客戶不允許外置電源。我將變壓器用錫箔紙包裹起來,故障還是一樣,將單片機用金屬屏蔽罩罩住,還是不行。
無意中發現,我的示波器探頭根本不需要接觸到線路板,只要將探頭與接地夾短接,放在設備附近,每次電磁閥動作時,示波器上就能出現一幅度正負2V以上的毛刺信號。
自此,對于這個產品的問題我實在是無能為力了。
煩請各位有什么高招盡管支招吧。
附件含原理圖、pcb、源程序(簡化版)以及實物圖
抗干擾.zip