在单片机应用中经常需要在掉电时(包括人为的关机和偶然的外部电源故障),对运行的数据进行保存。目前,常用的方法是单独给单片机增加一个较大的电容(一般为2000 μf以上,也有用法拉级的),外部掉电后,靠大电容存储的电量缓慢放电,提供单片机向eeprom存储数据所需要的时间。所选的电容小,提供的时间短,存储数据不可靠,所选电容大提供时间长,存储数据可靠。但是随之而来的问题是,掉电后电容放电过程中,单片机的供电电压在缓慢下降,当下将到某个值但还没有降到复位门限电压之前,如果此时再次开机,则单片机不能正常启动,导致单片机重复上电后工作混乱。下面具体分析这一过程并给出解决的办法。
我们先了解一下AVR的上电复位特点。上表是AVR数据手册提供的上电复位参数。
AVR复位特征
,即在单片机上电时,其电源电压要低于此值,才能使单片机上电复位。单片机的正常工作电源电压范围是2.7~5.5V。当电源电压低于2.7V时,单片机已经停止工作,如果此时电压高于1.3V,并且再次上电,则单片机不能正常复位,导致工作混乱。一些场合的停电可能是瞬间的,包括人为断电可能都是瞬间的,可能几秒钟之内又再次上电,而此时单片机电容的电压恰好处于复位电压以上和正常工作电压以下,就会出现上面的现象。这是本人在实际应用当中所遇到的情况。
由此可见,虽然解决了数据保护问题,却又带来了新的麻烦。所以在解决单片机掉电数据保护时,应该注意的是既要保证充足的时间用于数据存储,又要尽快放电,保证正常重新上电。
上图是本文所用的电路,图中交流电经过CON2输入,整流滤波后到达三端稳压块7806(注意在此用7806而不是7805),7806的输出一路经dl送到单片机(cpu_v=5.3V),单独给单片机供电,单片机耗电通常小于5毫安,由于使用C4(2200μf)电容,该路电源的放电时间较长。另外一路电源经过d2送到电路负载中(VCC=5.3V),通常此路电源的电流较大,超过几十毫安。
这样,在断电后,Vcc由于放电电流大而且滤波电容小,很快放电,通常在几毫秒以内。而另外一路cpu_v,由于滤波电容大而且放电电流小,所以放电很慢,t》2200μf×10-6×5V/5ma×10-3=2.2s;Vcc经过R4、W2分压接到单片机比较器的输入端ain0,cpu_v经过R6和稳压管(3.3V)接到单片机比较器的ain‘I端。电路正常工作时,调整电位器W2,使得ain0电压大于ain1电压0.2V,当掉电(或断电)发生时,ain0下降快,ainl下降慢,当ain0低于ainl时,比较器翻转。AVR比较器的翻转可以触发中断,在中断里完成eeprom的数据保存。图中Q1及周围的电路的工作作用是:初次上电时,由于电容C1两端电压不能突变,所以三极管的b、e结电压为OV,处于截止状态,截止的时间取决于Cl和R2的时间常数,本电路中参数可以保证截止时间超过10ms,在此时间之内CPU已经进入正常工作状态,在程序中将OUT端置“1”电平,继续使三极管截止。当断电发生时,先存储数据到eep-rom,然后out端置“0”电平,三极管饱和导通,立刻给cpu_v电源放电,R3是限流电阻。这样放电时间取决于R3和C4,大