搜索
bottom↓
回复: 159
打印 上一主题 下一主题

在掉电时怎样保护数据到EEPROM中

  [复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2007-8-14 19:00:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想在掉电时保存数据(3个字节)到EEPROM中,用BOD掉电检测,不知怎样使用。望高手指点:

1。在BOOT区设置好BODEN,BODLEVEL,后软件还要怎样设置?

2。掉电中断是否是产生复位?我的写EEPROM程序应该放在什么地方?他和其他复位怎样区别?

3。设置了BOOT区后,硬件上是否要加电源到一个管脚比较后才产生中断??

===================================================================================

掉电检测BOD的误解

AVR自带的BOD(Brown-out Detection)电路,作用是在电压过低(低于设定值)时产生复位信号,防止CPU意外动作.

对EEPROM的保护作用是当电压过低时保持RESET信号为低,防止CPU意外动作,错误修改了EEPROM的内容



而我们所理解的掉电检测功能是指 具有预测功能的可以进行软件处理的功能。

例如,用户想在电源掉电时把SRAM数据转存到EEPROM,可行的方法是

外接一个在4.5V翻转的电压比较器(VCC=5.0V,BOD=2.7V),输出接到外部中断引脚(或其他中断)

一但电压低于4.5V,马上触发中断,在中断服务程序中把数据写到EEPROM中保护起来

注意: 写一个字节的EEPROM时间长达8mS,所以不能写入太多数据,电源滤波电容也要选大一些

====================================================================================

将AVR的BOD设为2.7V,从4.5v到2.7这段时间写EEPROM。AVR的供电采用14楼方案,掉电检测使用IMP809。

软件编写思路请参考我的《M128》书是第5章,或10月出版的书的第7章。参考电路如下:









在图中,外部9V电源通过7805稳压到5V,作为系统电源使用。而AVR的工作电源则是单独提供的,由5v系统电源通过低压差肖特基二极管1N5817后得到。IN5817的正向压降为0.3v,因此,AVR的工作电压为4.7v。电源监控芯片IMP809-L的监控电压为4.63V,当系统电源的电压低于4.63V时,在R脚上产生由高电平到低电平的变化,使AVR进入INT0中断。

     

    该电路的工作原理为:首先通过配置AVR的熔丝位,设置BOD掉电检测电压门限为2.7V,并允许BOD检测。因此,当AVR的Vcc电压掉到2.7v以下时,AVR就停止工作(掉电检测功能是AVR片内的功能之一,见第二章的2.6.2 AVR的复位源和复位方式)。电源监控芯片IMP809-L检测电压门限为4.63v,用于检测系统电源的电压。当系统电源大于4.63v时,IMP809-L的R端输出高电平,整个系统正常工作。当系统电源的电压跌到4.63v以下时,IMP809-L的R脚输出低电平,作为AVR外部中断INT0的申请。INT0设计为掉电处理中断,其主要任务是备份系统运行的重要数据到EEPROM中。



    在提供AVR工作的电源系统中,大容量的电解电容C5作为储能电容,一旦系统电源电压下降,二极管1N5817截止,此时AVR可以靠C5提供的电储可以继续工作一段时间。C5容量应足够大,在系统电源掉电过程中,IMP809-L的R端输出低电平(下降到4.63v)时,要能够保证维持AVR的工作电压Vcc从4.7v降到2.7V的时间超过300ms,使AVR有时间做紧急处理和备份数据。AVR写EEPROM大约需要50-100mA的电流,所以电容C5的值应该在1000u~4700u,需要保存的数据越多,C5的容量应该越大。



    INT0是AVR优先级最高的中断,采用外部电平变化的下降沿触发方式。一旦IMP809-L的R脚电平由正常的高电平变为低电平时,将触发INT0中断,进入INT0掉电中断服务程序。

在INT0掉电保护中断服务程序中,应按以下的步骤和过程处理:

A)紧急处理,关闭所有外部器件的工作,或将外部状态设置到安全模式,如关闭马达、开关等,保证系统不出事故。

B)将AVR所有I/O设置为输入方式,最大程度的减少AVR芯片对电源的消耗。

C)将重要数据写入到EEPROM中。

D)循环检测INT0引脚是否恢复高电平。如为高电平则转到下一步E执行;如果INT0电平一直为低,程序将在此循环,直到完全停止运行(因为储能电容C5的电压低于2.7v后,AVR的BOD起作用,产生内部复位,AVR停止运行程序)。

E)软件延时一段时间。

F)再次检测INT0引脚电平。为低电平时转回D再次循环检测;为高电平时继续向下执行(这种情况表示系统电源受到干扰或短时掉电,现已经恢复正常)。

G)恢复外部器件工作(此时尽管进入了掉电保护程序,但AVR在C5的维持下,一直正常工作,所有的数据并没有破坏,可以继续进行工作);

H)中断返回。

在实际应用中,系统断电保护的设计是一个比较难的问题,实现的方法和手段也有不同。这个设计主要是作为一个使用外部中断的例子,让读者可以从中体会到如何合理和正确的使用外部中断。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

2
发表于 2007-9-19 20:00:35 | 只看该作者
"大容量的电解电容C5作为储能电容"图上2200uF是C4,马老师这里标错还是打错了?
可以用法拉电容吗?成本会太高吗?
能不能在电压输入端9V那里分压用AD检测呢?省掉IMP809-L?可能会造成AD没完成就没电的情况……我只是随便想想,还没有很成熟的考虑,但是如果用法拉电容的话,好像又是做得到的……我果然很混乱……呵呵,请马老师指教……

出0入0汤圆

3
发表于 2007-9-20 11:09:40 | 只看该作者
我觉得应检测9V的电压,一旦低于7.5V,MCU中断保存数据

出0入0汤圆

4
 楼主| 发表于 2007-9-22 10:15:34 | 只看该作者
回1楼:
1。可以使用法拉电容,价格是高一点,但体积小;同时容量大,可以保护更多的数据,也提高了掉电保护的可靠性。
2。用AD检测不如使用IMP809可靠,因为IMP809是硬件的。使用AD检测,增加了AVR的系统程序的复杂性,而且AD检测的响应也慢,不提倡。因为掉电保护是要求绝对可靠的。

回2楼:
理论上可以,但实际当中实现比较困难:
1。输入的9V电压一般不是稳定,电压波动大。而经过7805会稳定的多。
2。检测7.5v的电压监测芯片比较少。

出0入0汤圆

5
发表于 2007-9-23 13:38:15 | 只看该作者
呵呵!
具体要看项目而定了,成本与品质找到一个平衡点就行了!

出0入0汤圆

6
发表于 2007-12-23 19:34:23 | 只看该作者
谢谢马老师

出0入0汤圆

7
发表于 2007-12-24 09:24:39 | 只看该作者
收藏起来,以后一定用得着

出0入0汤圆

8
发表于 2007-12-24 09:41:35 | 只看该作者
收藏了,感谢马老师

出0入0汤圆

9
发表于 2007-12-28 12:02:17 | 只看该作者
IMP809贵了点. 我用台湾合泰的HT7044A. 北京中发售价¥0.85. 据说广州还要低。

出0入0汤圆

10
发表于 2008-1-10 10:11:31 | 只看该作者
学习 学习

出0入0汤圆

11
发表于 2008-1-10 20:07:08 | 只看该作者
在测试漏电保护器的动作持性时,必须准确测知漏电保护器的动作时刻。本系统设计的断电检测电路见图2。6N138为光电二极管与达林顿光电晶体管封装的光电耦合器,一次侧工作电流IF为1.6mA,Ifmax为20mA,Vfmax为1.7V。考虑到整流桥的正向导通压降Vdmax为2.4V,6N138一次侧电流iF由下式确定:

从v1的零时刻开始使iF增加到1.6mA所需的时间t可由式(1)求得:t=0.4ms。因为iF为脉动直流信号,所以的关断时间大于0.8ms,即可判断电网断电、漏电保护器已动作。我们设计的判断时间为1ms,在电网电压波动较大时仍保证判断正确。由式(1)还可求得iFmax=11.4mA,小于6N138的Ifmax。


断电检测模块
该模块由模块主程序、外部中断INT1和定时器T1中断服务子程序组成。
T1在INT1端变为高电平(6N138截止)时启动,定时到1ms发生中断,说明电路已断电,漏电保护器已动作。在T1中断服务子程序中置位断电标志、关闭INT1和T1中断。
根据1.2所述,在电网正常通电情况下,6N138截止使INT1端保护高电平的时间小于1ms。INT1端电平由高变低发生中断,在其中断服务子程序中设置使T1重新定时1ms,从而使T1不会在电网正常通电情况下发生中断。
模块主程序初始化INT1、T1,复位断电标志。

出0入0汤圆

12
发表于 2008-1-10 20:09:38 | 只看该作者
只要你的电容大1点就可以了

出0入0汤圆

13
发表于 2008-1-31 02:08:00 | 只看该作者
我曾经用和马老师差不多的电路进行掉电数据保护,C4用680μF的,电源监测用两个19kΩ电阻分压,至少可保存10个字节的数据.

出0入0汤圆

14
发表于 2008-1-31 02:12:57 | 只看该作者
C4的大小取决于CPU的型号即Icc的大小,由D1,C4单独为CPU供电是关键.

出0入0汤圆

15
发表于 2008-3-19 18:24:43 | 只看该作者
收藏起来,好好学习一番。

出0入0汤圆

16
发表于 2008-5-20 15:42:24 | 只看该作者

思路不错
谢谢

出0入0汤圆

17
发表于 2008-5-20 16:54:46 | 只看该作者
收藏...
谢谢

出0入0汤圆

18
发表于 2008-5-20 21:17:18 | 只看该作者
受教,这个项目一定得改了。没掉电时的数据保护!

非常感谢马老师!

出0入0汤圆

19
发表于 2008-6-9 22:16:24 | 只看该作者
马老师,51单片机可否采取您的这个方法啊?

出0入0汤圆

20
发表于 2008-6-9 22:33:39 | 只看该作者
好 记好

出0入0汤圆

21
发表于 2008-6-14 08:55:59 | 只看该作者
没用过,本没发言权。
但有一点疑问:从手册看,mega8在5V,16MHz时才20mA,而文中提到“AVR写EEPROM大约需要50-100mA的电流”,觉得应该还能改善,比如:进中断后所有端口高阻输入,adc禁止等。

出0入0汤圆

22
 楼主| 发表于 2008-6-14 13:18:26 | 只看该作者
to 18楼:标准51不能采用这样的设计,因为这个设计利用和需要AVR中BOD的功能的配合.大部分的51没有这样的功能.

to 20楼:文中提到“AVR写EEPROM大约需要50-100mA的电流”,不是单纯指对EEPROM操作,是指通常情况下,因为此时AVR可能还做其它的事情,如点亮一个LED,驱动某个部件等.

"进中断后所有端口高阻输入,adc禁止"等这些措施是可行的,但要根据实际情况,因为掉电的处理过程,实际上电还没有真正的"掉"光,或者控制板的电源掉了,但驱动电源没掉.因此AVR必须还要保证外部部件要正常处在安全的状态,不能乱。如果把"所有端口高阻输入"就等于放弃了对外部的控制,这样在工业控制中是非常危险的.

另外, "进中断后所有端口高阻输入,adc禁止"需要执行指令,需要时间.时间和电流是矛盾,要找到最佳的平衡点.把计算的电流放大一点,意味者储能电容要大,但留出必要的或更多的余量,可以保证系统的可靠.如果使用这样的掉电保护措施,说明系统可靠是第一位的,成本上稍微多点可以忽略掉了.

出0入0汤圆

23
发表于 2008-6-16 09:22:53 | 只看该作者
马潮老师您说的很对,掉电前“对外部电路进行最后控制”和“计算的电流放大一点”都很正确。
只是还有点异议,“所有端口高阻输入,adc禁止”和最终掉电后的状态是一样的(当然,这里没有考虑掉电警报等问题),而这些指令的执行时间是微秒级,eeprom写等待是毫秒级,所以我觉得应该是没问题的

出0入0汤圆

24
 楼主| 发表于 2008-6-16 11:31:12 | 只看该作者
楼上说的对,指令的执行时间是微秒级的,可以做许多的工作.

请你仔细看我LZ位的掉电中断处理过程的描述.

因为对于电源掉电的处理,需要考虑存在电源确实掉电和电源不稳定产生波动的2种可能性.

因此在我的掉电处理过程中包含有对外部控制的处理部分,在进入掉电中断后,马上处理的是确保安全的动作,如将控制马达的I/O口输出0,以及消耗系统电源比较多(如LED显示)的部件关闭.可是没有将全部的I/O做处理.

这样的话,如果进入掉电中断是由于电源不稳定产生波动产生的,那么电源经过短时间波动后恢复了正常,实际没有掉电.在这种情况下AVR实际还在正常工作,当它检测到电源正常后,恢复外部器件工作,就可以从掉电中断中返回继续原来正常的程序执行了.

如果进入中断就把所有端口设置高阻输入,adc禁止等,那么正常恢复前就需要重新做初始化配置,而且还要恢复到进中断前的状态,这样就比较麻烦,另外代码也长,占用了资源.

所以,我认为不必要将全部的I/O做处理,只处理重要的I/O口.不是仅仅从时间上考虑问题,要综合考虑.固我不是以AVE本身最小的电流10~20mA做标准,而是用了"大约需要50-100mA的电流".这样,尽管储能电容大了些,不仅提高了可靠性,也方便做后面的处理.

出0入0汤圆

25
发表于 2008-6-16 14:44:50 | 只看该作者
明白了

出0入0汤圆

26
发表于 2008-8-24 14:28:13 | 只看该作者
学习。谢谢。

出0入0汤圆

27
发表于 2008-10-26 23:31:09 | 只看该作者
这个用AVR自带的电压比较器啊!我做过实验的,在5V的电源VCC中串接一个二极管,然后再在二极管的输出侧接一个大容量的电容。

把电压比较器的AIN0端接到二极管的A端,比较器的AIN1端接到二极管的K端。然后打开全局中断和电压比较中断。在电压比较的中断程序中写入写EEPROM的程序,就可以了。我在M128上做过测试很好用,当然那个电容的容量要足够大。



 (原文件名:电压比较.jpg) 

这个是用M16做的成品板的一部分,现在板子还没有做好。不过程序已经在M128上调试好了。

出75入4汤圆

28
发表于 2009-1-8 09:47:01 | 只看该作者
学习,准备整理后下载。

出0入0汤圆

29
发表于 2009-1-8 10:15:03 | 只看该作者
mark

出0入0汤圆

30
发表于 2009-2-24 13:50:17 | 只看该作者
很好,谢谢马潮老师

出0入0汤圆

31
发表于 2009-4-14 22:38:44 | 只看该作者

思路不错
谢谢

出0入0汤圆

32
发表于 2009-4-16 23:42:58 | 只看该作者
为什么加了大的电容有的时候就死机了

出0入0汤圆

33
发表于 2009-4-17 10:10:40 | 只看该作者
mark!

出0入0汤圆

34
发表于 2009-4-17 12:44:12 | 只看该作者
31楼 应该是电容过大,导致掉电后电容的电量短时间内放电不完全后导致的。建议用空闲的管脚接上一个放电电阻,在保存完EEPROM数据后就进入放电状态。同时开启BOD功能。

出0入0汤圆

35
发表于 2009-4-22 20:57:26 | 只看该作者
mark

出0入0汤圆

36
发表于 2009-4-26 10:43:09 | 只看该作者
受教了!

出0入0汤圆

37
发表于 2009-5-5 18:07:39 | 只看该作者
收藏了 谢谢 日后可能用到

出0入0汤圆

38
发表于 2009-5-5 20:44:13 | 只看该作者
大家说的都不孬!

出0入0汤圆

39
发表于 2009-5-5 20:58:59 | 只看该作者
jh

出0入0汤圆

40
发表于 2009-5-18 10:50:34 | 只看该作者
收藏
MARK

出100入0汤圆

41
发表于 2009-5-18 16:06:57 | 只看该作者
我是判断24V的电压,降低到12V时,通过光耦将信号输入到INT脚进行判断
个人认为直接侦测前级电压能给我们的操作提供更充裕的时间
我做的东西是24V供电,通过DC/DC提供MCU的5V工作电压,试验中,即时再iN5817后不加电容(24V和前面的5V有100uF电容),MCU也能正常写入数据,当然为了保险,我还是用了100uF

出0入4汤圆

42
发表于 2009-5-18 21:29:39 | 只看该作者
经典!绝对收藏

出0入0汤圆

43
发表于 2009-5-25 15:44:38 | 只看该作者
真是只有想不到 没有做不到阿。

出0入0汤圆

44
发表于 2009-5-25 16:06:42 | 只看该作者
mark

出0入0汤圆

45
发表于 2009-5-25 20:22:35 | 只看该作者
最近项目需要掉电保存数据,mark

出0入0汤圆

46
发表于 2009-5-30 19:59:56 | 只看该作者
留名学习

出10入95汤圆

47
发表于 2009-5-30 23:39:04 | 只看该作者
记号

出0入0汤圆

48
发表于 2009-5-31 08:59:18 | 只看该作者
mark~

出0入0汤圆

49
发表于 2009-5-31 13:08:38 | 只看该作者
我挖

出0入0汤圆

50
发表于 2009-6-20 23:27:08 | 只看该作者
收藏!!

出0入0汤圆

51
发表于 2009-9-17 16:08:48 | 只看该作者
mark

出0入0汤圆

52
发表于 2009-9-26 16:53:56 | 只看该作者
路过.
这个实践过了.选电容合适就可以了.

出0入0汤圆

53
发表于 2009-10-23 15:49:26 | 只看该作者
mark

出0入0汤圆

54
发表于 2009-11-22 11:47:44 | 只看该作者
最近项目也用掉电保护数据,学习了!

出0入0汤圆

55
发表于 2009-11-22 11:59:47 | 只看该作者
mark

出0入0汤圆

56
发表于 2009-12-8 22:39:32 | 只看该作者
我想在7805前用电阻分压再用HT7044检测,分压电阻保证在约18V(电源电压为24V)时,HT7044输出低电平来产生停电信号,这样支持的时间会不会长一些,因为7805输入7V就能保证输出5V,

出0入0汤圆

57
发表于 2009-12-9 01:36:32 | 只看该作者
记号

出0入0汤圆

58
发表于 2009-12-9 08:57:54 | 只看该作者
学习。谢谢。

出0入0汤圆

59
发表于 2010-1-4 16:29:56 | 只看该作者
很有用,谢谢!!

出0入0汤圆

60
发表于 2010-1-4 18:12:06 | 只看该作者
mark

出0入0汤圆

61
发表于 2010-1-4 19:40:40 | 只看该作者
Mark!

出0入0汤圆

62
发表于 2010-1-24 20:08:02 | 只看该作者
受教了!!!

出0入0汤圆

63
发表于 2010-1-24 20:14:39 | 只看该作者
正需要用呢

出0入0汤圆

64
发表于 2010-1-27 18:52:26 | 只看该作者
太好了,收藏了,以后绝对能用到的!

出0入0汤圆

65
发表于 2010-1-29 13:32:05 | 只看该作者
收藏.

出0入0汤圆

66
发表于 2010-2-2 20:09:48 | 只看该作者
收藏

出0入0汤圆

67
发表于 2010-2-2 23:46:14 | 只看该作者
留着 后用

出0入0汤圆

68
发表于 2010-3-8 11:18:09 | 只看该作者
好贴

出0入0汤圆

69
发表于 2010-3-8 16:31:18 | 只看该作者
mark

出0入0汤圆

70
发表于 2010-3-16 22:28:59 | 只看该作者
mark。

出0入0汤圆

71
发表于 2010-3-20 14:12:21 | 只看该作者
不好意思,马潮老师,我对你这个方案看了后还是不明白,能不能帮忙解答一下?
这个掉电保护功能是针对哪个电压掉电保护呢?是9V的还是5V的?为什么要用两个分开的电源供电呢?AVR的5V不能从7805出来吗?
谢谢~~~~

出0入0汤圆

72
发表于 2010-3-26 12:41:24 | 只看该作者
hao

出0入0汤圆

73
发表于 2010-4-14 18:01:33 | 只看该作者
学习了!

出0入59汤圆

74
发表于 2010-4-14 20:56:15 | 只看该作者
不错~

出0入0汤圆

75
发表于 2010-4-22 16:22:36 | 只看该作者
我试验的是使用DS1302,这样写入数据的速度快的多,或者是PCF8583,有240字节的空间。

出0入0汤圆

76
发表于 2010-4-23 09:47:33 | 只看该作者
26 33 楼 改进

出0入0汤圆

77
发表于 2010-4-23 13:02:03 | 只看该作者
dig

出0入0汤圆

78
发表于 2010-4-26 22:16:45 | 只看该作者
学习了。。。

出0入0汤圆

79
发表于 2010-5-6 19:54:34 | 只看该作者
ji

出0入0汤圆

80
发表于 2010-5-13 12:57:27 | 只看该作者
学习了,谢谢

出0入0汤圆

81
发表于 2010-5-13 13:56:22 | 只看该作者
学习

出0入0汤圆

82
发表于 2010-5-13 14:57:06 | 只看该作者
收藏

出0入0汤圆

83
发表于 2010-7-9 21:06:01 | 只看该作者
MARK 掉电保护数据

出0入0汤圆

84
发表于 2010-7-14 08:39:04 | 只看该作者
mark

出0入0汤圆

85
发表于 2010-7-14 08:47:45 | 只看该作者
能不能直接将5V接到INT0脚,省掉电压比较器

出0入0汤圆

86
发表于 2010-7-14 09:25:10 | 只看该作者
mark~~

出0入0汤圆

87
发表于 2010-7-14 11:17:35 | 只看该作者
学习

出0入0汤圆

88
发表于 2010-7-22 14:38:30 | 只看该作者
学习 学习 学习 学习

出0入0汤圆

89
发表于 2010-7-29 21:59:07 | 只看该作者
ddddd

出0入0汤圆

90
发表于 2010-8-10 16:31:53 | 只看该作者
mark

出0入0汤圆

91
发表于 2010-8-16 13:47:17 | 只看该作者
mark

出0入0汤圆

92
发表于 2010-9-24 17:04:17 | 只看该作者
谢谢马潮老师!

出0入0汤圆

93
发表于 2010-9-24 17:04:34 | 只看该作者
谢谢马潮老师!

出0入0汤圆

94
发表于 2010-10-7 15:53:47 | 只看该作者
谢谢分享

出0入0汤圆

95
发表于 2010-12-4 00:25:40 | 只看该作者
收藏了 谢谢 日后可能用到

出0入0汤圆

96
发表于 2011-1-28 16:27:46 | 只看该作者
来学习的,谢谢。

出0入0汤圆

97
发表于 2011-1-28 17:57:18 | 只看该作者
mark下!谢谢了,这么好的资料!

出0入0汤圆

98
发表于 2011-1-28 21:01:17 | 只看该作者
mark

出0入0汤圆

99
发表于 2011-1-29 09:10:13 | 只看该作者
mark e2

出0入0汤圆

100
发表于 2011-1-29 11:28:29 | 只看该作者
MARK
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 13:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表