標(biāo)題: 電解電容放電時間怎么計(jì)算 [打印本頁]

作者: baobao125    時間: 2022-9-14 16:18
標(biāo)題: 電解電容放電時間怎么計(jì)算
5V2200UF的電容,后面帶0.025A的負(fù)載,這樣在斷開電源的情況下還能維持電路多久時間,夠不夠芯片做掉電存儲動作

作者: 188610329    時間: 2022-9-14 16:28
進(jìn)入掉電中斷后, 先關(guān)負(fù)載,再做存儲動作。
作者: yzwzfyz    時間: 2022-9-14 16:45
電容上的電荷:Qc=U*C=5V*2200uF
負(fù)載使用電量:Q = I*t = 0.025A * t
假設(shè):電壓降到3.6V停止工作,則電容可提供的電荷 =Qc * (1-3.6/5)。
以下,樓主自己算吧。

夠不夠做掉電存儲,還取決于存數(shù)的多少及技巧。通常夠了。

作者: 羚羊樹懶書架    時間: 2022-9-14 16:55
Q=CU=0.011C
t=Q/I=0.44s
一般的芯片夠了,芯片一般都是微秒級的
作者: fj51hei    時間: 2022-9-14 19:47
你這0.011電荷怎么算的
作者: baobao125    時間: 2022-9-14 20:09
羚羊樹懶書架 發(fā)表于 2022-9-14 16:55
Q=CU=0.011C
t=Q/I=0.44s
一般的芯片夠了,芯片一般都是微秒級的

0.44S是放電放完的時間,芯片電壓過低不可能工作啊
作者: 188610329    時間: 2022-9-14 20:22
baobao125 發(fā)表于 2022-9-14 20:09
0.44S是放電放完的時間,芯片電壓過低不可能工作啊

所以,算這些沒有意義。 關(guān)鍵是要先關(guān)閉 負(fù)載,再開始保存數(shù)據(jù),
從低壓中斷觸發(fā)(3.8V)開始,只要關(guān)了 負(fù)載,哪怕你只有 47uf 的電容,也足夠?qū)?50個字節(jié)以上 到片內(nèi)Eeprom 了。
作者: wulin    時間: 2022-9-14 20:53
根據(jù)壇友的示例經(jīng)修改實(shí)測成功,利用編程技巧不需要多大電容。TX-1C實(shí)驗(yàn)板上外圍元件不少,電源濾波電容僅10uf,能夠掉電后可靠保存2個字節(jié)(沒有做保存更多字節(jié)試驗(yàn))。測試掉電后能維持2.5ms。如需要保存更多字節(jié)應(yīng)該要適當(dāng)增大電容。
  1. //測試條件:TX-1C實(shí)驗(yàn)板,MCU型號IAP15W4K58S4,系統(tǒng)時鐘11.0592MHz
  2. //注意:測試本示例時,需在ISP下載時將低壓復(fù)位功能和低壓時禁止EEPROM操作關(guān)閉

  3. #include "STC15Fxxxx.H"
  4. #include <intrins.h>                                //庫頭文件
  5. #define uint unsigned int                         //宏定義數(shù)據(jù)類型uint
  6. #define uchar unsigned char                 //宏定義數(shù)據(jù)類型uchar
  7. //宏定義ISP的操作命令
  8. #define CMD_IDLE    0               //空閑模式
  9. #define CMD_READ    1               //IAP字節(jié)讀命令
  10. #define CMD_PROGRAM 2               //IAP字節(jié)編程命令
  11. #define CMD_ERASE   3               //IAP扇區(qū)擦除命令
  12. #define ENABLE_IAP  0x82            //CPU的等待時間
  13. #define IAP_ADDRESS 0x0800                        //測試地址
  14. sbit duan=P2^6;
  15. sbit wein=P2^7;

  16. //順序共陰極數(shù)碼管段碼表,段碼a-h順序接PX0-PX7
  17. uchar code table[]={//共陰數(shù)碼管段碼"0~f-."
  18.                 0x3f,0x06,0x5b,0x4f,
  19.                 0x66,0x6d,0x7d,0x07,
  20.                 0x7f,0x6f,0x77,0x7c,
  21.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  22. uchar data dis_buf[8];                //緩存數(shù)組
  23. uint num,sec;
  24. uchar i;

  25. void Timer0Init();                                        //定時器初始化聲明
  26. void IapIdle();                                                //關(guān)閉IAP/EEPROM
  27. uchar IapReadByte(uint addr);                //讀取EEPROM數(shù)據(jù)
  28. void IapProgramByte(uint addr, uchar dat);//寫入EEPROM數(shù)據(jù)
  29. void IapEraseSector(uint addr);                //擦除EEPROM數(shù)據(jù)

  30. void main()                                                       
  31. {
  32.         P0M0 = 0x00;
  33.         P0M1 = 0x00;
  34.         P1M0 = 0x00;
  35.         P1M1 = 0x00;
  36.         P2M0 = 0x00;
  37.         P2M1 = 0x00;
  38.         P3M0 = 0x00;
  39.         P3M1 = 0x00;
  40.         P4M0 = 0x00;
  41.         P4M1 = 0x00;
  42.         P5M0 = 0x00;
  43.         P5M1 = 0x00;
  44.         P6M0 = 0x00;
  45.         P6M1 = 0x00;
  46.         P7M0 = 0x00;
  47.         P7M1 = 0x00;
  48.         sec=IapReadByte(IAP_ADDRESS)<<8|IapReadByte(IAP_ADDRESS+1);//讀取保存的數(shù)據(jù) 用時11.75us
  49.         if(sec==0xffff)//如果沒有保存數(shù)據(jù)
  50.                 sec=0;//變量為0
  51.         else IapEraseSector(IAP_ADDRESS);//擦除數(shù)據(jù),為下次掉電保存數(shù)據(jù)做準(zhǔn)備

  52.         PCON &= 0xDF;//清0掉電標(biāo)志
  53.         ELVD = 1;//開低壓中斷
  54.         EA   = 1;//開總中斷

  55.         Timer0Init();//初始化定時器

  56.         while(1)
  57.         {
  58.                 if(TF0)//查詢T0中斷請求標(biāo)志
  59.                 {               
  60.                         TF0=0;//T0中斷請求標(biāo)志清0
  61.                         if(++num>=1000)//1秒
  62.                         {
  63.                                 num=0;                               
  64.                                 sec++;
  65.                         }
  66.                         dis_buf[0]=table[sec/10000%10];
  67.                         dis_buf[1]=table[sec/1000%10];
  68.                         dis_buf[2]=table[sec/100%10];
  69.                         dis_buf[3]=table[sec/10%10];
  70.                         dis_buf[4]=table[sec%10];
  71.                         //5位數(shù)碼管動態(tài)顯示
  72.                         P0=0x00;duan=1;duan=0;
  73.                         P0=~(0x01<<i);wein=1;wein=0;
  74.                         P0=dis_buf[i];duan=1;duan=0;
  75.                         i=++i%5;
  76.                 }
  77.         }
  78. }

  79. void Timer0Init(void)        //1毫秒@11.0592MHz
  80. {
  81.         AUXR |= 0x80;                //定時器時鐘1T模式
  82.         TMOD &= 0xF0;                //設(shè)置定時器模式
  83.         TL0 = 0xCD;                        //設(shè)置定時初始值
  84.         TH0 = 0xD4;                        //設(shè)置定時初始值
  85.         TF0 = 0;                        //清除TF0標(biāo)志
  86.         TR0 = 1;                        //定時器0開始計(jì)時
  87. }
  88. /*----------------------------
  89.         關(guān)閉IAP功能
  90. ----------------------------*/
  91. void IapIdle()
  92. {
  93.     IAP_CONTR = 0;                  //關(guān)閉IAP功能
  94.     IAP_CMD = 0;                    //清除命令寄存器
  95.     IAP_TRIG = 0;                   //清除觸發(fā)寄存器
  96.     IAP_ADDRH = 0x80;               //將地址設(shè)置到非IAP區(qū)域
  97.     IAP_ADDRL = 0;
  98. }
  99. /*----------------------------
  100. 從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
  101. ----------------------------*/
  102. uchar IapReadByte(uint addr)
  103. {
  104.     uchar dat;                       //數(shù)據(jù)緩沖區(qū)

  105.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  106.     IAP_CMD = CMD_READ;             //設(shè)置IAP命令
  107.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  108.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  109.     IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
  110.     IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
  111.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  112.     dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數(shù)據(jù)
  113.     IapIdle();                      //關(guān)閉IAP功能
  114.     return dat;                     //返回
  115. }
  116. /*-------------------------------
  117. 寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
  118. --------------------------------*/
  119. void IapProgramByte(uint addr, uchar dat)
  120. {
  121.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  122.     IAP_CMD = CMD_PROGRAM;          //設(shè)置IAP命令
  123.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  124.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  125.     IAP_DATA = dat;                 //寫ISP/IAP/EEPROM數(shù)據(jù)
  126.     IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
  127.     IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
  128.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  129.     IapIdle();                      //關(guān)閉IAP功能
  130. }
  131. /*----------------------------
  132. ISP/IAP/EEPROM扇區(qū)擦除
  133. ----------------------------*/
  134. void IapEraseSector(uint addr)
  135. {
  136.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  137.     IAP_CMD = CMD_ERASE;            //設(shè)置IAP命令
  138.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  139.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  140.     IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
  141.     IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
  142.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  143.     IapIdle();                      //關(guān)閉IAP功能
  144. }
  145. void PowerLost() interrupt 6                //剩余電量從中斷開始到完全斷電2.5ms
  146. {
  147.         EA = 0;                                                //關(guān)閉總中斷
  148.         P0M1 = 0xff;                                //所有端口高阻用時2.75us
  149.         P1M1 = 0xff;
  150.         P2M1 = 0xff;
  151.         P3M1 = 0xff;
  152.         P4M1 = 0xff;
  153.         P5M1 = 0xff;
  154.         P6M1 = 0xff;
  155.         P7M1 = 0xff;
  156.         IapProgramByte(IAP_ADDRESS,sec>>8);//寫數(shù)據(jù)高8位到EEPROM
  157.         IapProgramByte(IAP_ADDRESS+1,sec);//寫數(shù)據(jù)低8位到EEPROM  寫兩個字節(jié)用時215.25us

  158.         while((PCON & 0x20) != 0)         //復(fù)查低壓標(biāo)志
  159.         {
  160.                 PCON &= 0xDF;                  //清除低壓標(biāo)志
  161.                 _nop_();               
  162.                 _nop_();                            //坐等掉電
  163.         }
  164.         IAP_CONTR = 0x20;                 //發(fā)現(xiàn)是誤報(bào),重啟單片機(jī),恢復(fù)正常工作
  165. }
復(fù)制代碼


作者: baobao125    時間: 2022-9-14 21:10
188610329 發(fā)表于 2022-9-14 20:22
所以,算這些沒有意義。 關(guān)鍵是要先關(guān)閉 負(fù)載,再開始保存數(shù)據(jù),
從低壓中斷觸發(fā)(3.8V)開始,只要關(guān)了 ...

我是先關(guān)負(fù)載,再存儲的。用1MS中斷掃描IO口電平,因?yàn)殡娙萸懊嬗袀二極管,后面穩(wěn)壓,想著斷電后應(yīng)該是IO口先讀取到低電平,比低壓中斷有更多的時間用于存儲,穩(wěn)妥些。但stc單片機(jī)有時候就是到擦除完后就不工作了。有時候還是可以完成存儲的。 只用12M的頻率
作者: rundstedt    時間: 2022-9-14 23:39
跟工作頻率無關(guān),flash寫一個字節(jié)或者寫一個頁面需要不到10ms時間,單片機(jī)執(zhí)行時間可以忽略不計(jì),完全夠用了。
作者: 188610329    時間: 2022-9-15 08:14
baobao125 發(fā)表于 2022-9-14 21:10
我是先關(guān)負(fù)載,再存儲的。用1MS中斷掃描IO口電平,因?yàn)殡娙萸懊嬗袀二極管,后面穩(wěn)壓,想著斷電后應(yīng)該是I ...

你發(fā)現(xiàn)斷電了,再去擦除eeprom的做法是不可取的,雖然不知道你是什么型號的單片機(jī),但是,往eeprom寫數(shù)據(jù)的話,一個字節(jié)2us,50個字節(jié)也只要0.1ms,而擦除一個扇區(qū),基本要20ms以上,發(fā)現(xiàn)斷電,再浪費(fèi)這寶貴的20ms是極端不合理的。最后,檢測前端斷電,并不見得比掉電中斷更及時,先不說,你的1ms間隔掃描低電平,是否比發(fā)現(xiàn)低于3.8v來的更及時,前段也有容性的吧?在單片機(jī)功耗大的情況下,單片機(jī)停振了,前端還沒達(dá)到低電平的標(biāo)準(zhǔn),不是不可能。個人的一些經(jīng)驗(yàn),僅供參考。
作者: powbir    時間: 2022-9-15 08:42
假如降至3V仍可維持工作,可以用如下式子估算:(5-3)* 0.0022(電容量) /0.025, 約0.17s,
作者: powbir    時間: 2022-9-15 08:43
假如至3V仍可工作,持續(xù)時間 則可用下式估算:(5-3)*0.0022 /0.025,約0.17S,
作者: szb314    時間: 2022-9-15 09:16
有計(jì)算電容放電的在線工具網(wǎng)站,,另外找個示波器測一下就解決問題了,為什么要去算? 實(shí)際測量才是關(guān)鍵,測完可以考慮電容加大一點(diǎn),以防時間久了電容容量降低




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1