本帖最后由 cjseng 于 2012-8-6 21:50 编辑
重现画了线路板,问题已解决。
做了一个产品,在家里测试一切正常,到客户那里测试一开始也完全正常,开始小批量供货,第一批没问题,从第二批开始,故障不断,症状就是:单片机程序跑飞。
本来一直自诩为单片机老鸟,做过的产品也有几十种了,没想到在这个问题上栽了跟头。
简单描述一下产品:
输入:有三路外接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、源程序(简化版)以及实物图 |