電池容量是衡量電池質量的重要指標。充電電池的容量測試有很多的方法??梢砸罁姵氐姆烹娗€,進行短時間放電,從而粗略得出電池容量。這種方法大的優(yōu)點是快速,但是充電電池的放電曲線并不具有普遍性,很多劣質電池放電初期電壓也很平穩(wěn),一旦進入中后期,電壓下降非常迅速,所以采用這種方法得出的結論將非常不準確的。準確無誤的還是以標準電流放電,全程測量實際放電時間的方式。不同的放電電流,充電電池終能夠釋放出的電量是不同的,有一定的差距。蓄電池的容量標注都是有統一標準的。目前使用多的是10小時率放電容量與20小時率放電容量兩種。10小時率放電容量就是電池以恒定電流放電,至電量耗盡放電時間能夠維持10個小時左右,這個電流就被稱作10小時率電流(衡量電量用盡的標準,不能以電池放電端電壓降低到零為準。電池過度放電,會導致電池容量減少,無法恢復,乃至提早損壞、*失效。所以每種電池放電終止電壓都有嚴格的規(guī)定,這個可以查閱相關資料。過度放電與過度充電是造成充電電池不能達到使用年限、提前報廢的主要原因)。實時放電的測量方法大的缺點就是費時費力,因為耗時久這樣測量精度也很容易受到各種外部因素的影響。測量過程中如果用10小時率電流持續(xù)放電時間至少都要在5個小時以上,作這樣長時間的測試更需要足夠的耐心與精力以及充裕的時間。科技的發(fā)展是非常迅速,今天單片機已經非常普及了。通過單片機程序控制對放電時間,深度進行自動化控制,就很容易準確測出電池的實際容量,實現整個過程的自動控制。模擬實際放電測量容量的方法雖然對能源有一點浪費,但是對于1A、2A以下的小容量充電電池還是*可行的,對大容量電池進行抽樣檢查也是很有必要。
下面介紹的電池容量測試儀采用89S51作為控制芯片,圖1就是硬件的電路原理圖。
圖1 硬件的電路原理圖
這個電池容量測試儀由放電電路、單片機控制計時兩個*獨立部分組合而成。單片機部分制作費時費力,而且市面上單片機已很普及,沒必要親手制作,隨便找一片51單片機實驗板就可以了。放電電路則是比較簡單的,僅由四五只元件構成。單片機部分主要負責對放電時間計時,終得到一組可靠的數據,用于電池性能的考量。
這種放電電路的實質就是一模擬可控硅。當我們將待測電池接入電路相應位置時,點按啟動鍵,如果電池尚有余量,則電池兩端放電電壓將維持在設定值以上,三極管VT1就會瞬間飽和,電池通過電阻R2進行放電。這種電路有可靠準確陡峭的開關特性,VT1工作于飽和截止兩種狀態(tài)之下。通過可調電阻對開關電路臨界值(即充電電池放電終止電壓)進行調節(jié)設定,便可適應于各種不同類型充電電池的全程保護放電。由于個人的應用不需要非常準確的測試結果,所以實際測試中電池模擬放電原則上還是以快些為好,只需要得到一個大致的電池容量。為了較快完成電池測試過程,這里的電路設計采用兩小時率電流進行放電。通過對各種電池測量結果的橫向比較,容量的差異還是顯而易見的,以此作為衡量電池優(yōu)劣的標準,就已經足夠了。這里以1000mAH、1.2V規(guī)格鎳氫電池測試為例,放電電流500mA就需要采用2Ω的放電電阻,電池終止放電電壓應控制在1V以上。放電終止電壓通過可調電阻R1來調節(jié)設定。普通可調電阻精度較差,且容易產生漂移,會導致設定好的終止電壓隨時間推移以及使用環(huán)境變化產生較大的波動。為了保證放電終止電壓的準確且易于設定,R1可以使用3296系列精密可調電位器。3296多圈可調精密電位器的可調范圍一般在50T,所以每圈的調節(jié)范圍為2%,每轉動一度,阻值變化大約0.005%,所以很容易調節(jié)獲得一個準確、穩(wěn)定的阻值。
終止電壓的設定必須在實際放電過程中進行,負載電阻R2阻值變動,已經設定的終止電壓也會隨之改變,需要重新設置。具體的調試方法就不再詳述了,參考一下相關資料。
這個放電電路不需要單獨的工作電源,而且與電池種類沒有相關性,*可以適應鎘鎳、鎳氫、鋰電池、鉛酸電池各種類型蓄電池的保護性放電,只是需要根據電池類型以及容量大小重新設置電路的終止電壓及放電電流。如果電池容量相對較高,那么三極管VT1、VT2的耗散功率也要相應加大一些,同時不要忘了加大負載電阻R2的功率。
圖2是放電電路的印刷電路圖,元件數量少,很容易制作。
圖2 印刷電路圖
各種電池兩小時率電流放電能夠維持的放電時間一般都是在1.5小時以下的。這里單片機計時系統使用秒計時,4位LED數碼管顯示。大計時時間9999秒,大約2.7小時。
圖1單只LED數碼管內部都是由8只發(fā)光管組合而成,分別作為8的7段字型部分,以及一位小數點。這里使用的是共陽極數碼管,內部8只發(fā)光管的陽極是并連共同引出的,作為使能控制。
在實際電路中,L1就是diyi只數碼管的共陽極duan。單片機的輸出、輸入接口數量都很有限,所以4位LED數碼管驅動都是使用動態(tài)顯示的方式。4只獨立數碼管LED的內部a、b、c、d、e、f、g、dp這8段發(fā)光管相對應的陰極都是并連的。統一由單片機P0口8位輸出進行驅動。數碼管要顯示出數碼還必須在共陽極duan同時施加正電壓才行。所以要讓4位中某一數碼管進行顯示,只要在P0口輸出字型碼的同時,給這位數碼管共陽極duan加上正電壓就行了,當然與此同時其他三位數碼管的共陽極duan要保持低電壓,才不致顯示出現混亂。數碼管共陽極duan驅動電流較大,所以采用了三極管進行控制。以diyi只數碼管為例,在P0端口輸出字型碼的同時,P37輸出低電平,三極管T4導通,則共陽極duanL1就得到高電平了,數字就會顯示在diyi只數碼管上了。
程序設計是以單片機P37口作為計時控制端子,P37口輸入低電平,計時程序啟動,4只數碼管顯示時間。放電電路中按下啟動按鍵,放電過程觸發(fā),VT1導通,電池端電壓降落到放電電阻R2兩端,A端對地為高電平,通過電阻R4迫使三極管VT3導通,P37口電平就被拉低了,單片機計時程序啟動。電池電壓降到終止電壓以后,放電電路自動關閉,A端電壓消失,VT3恢復截止狀態(tài),計時程序停止,數碼管維持顯示當前持續(xù)時間。
如要進入下次測試,首先按動單片機復位鍵,當前計時清零,等待下一次測試開始。
程序設計比較簡單。它的大致流程如下:初始化,P3端口置位,設立常量a為時間計數器,依次對a的十進制數值各位進行提取,順序輸送到P0端口,P2端口中的P24、P25、P26、P27各位是依次作為四位數碼管的使能控制端,通過P2端口的配合,就可以完成對各位數碼管的驅動,時間的動態(tài)顯示。程序進行中要不斷地檢測P3端口數值以決定計時狀態(tài):如果電池處于放電過程之中,三極管VT3導通,將迫使P37端口電壓降到零,P3端口值就是127,單片機程序檢測到這一結果,時間常量a將自動加1,指示期間放電時間已經延續(xù)1秒種了。這1秒鐘的時間準確計算是比較麻煩的。計時程序是一個循環(huán)結構,每一周期耗用時間都是一致的。所以在使用keil軟件調試過程中,通過對時間計數寄存器sec的觀察計算,可以得出一次循環(huán)大致需要的時間。以此為據再通過適當改變延時子程序循環(huán)次數將常量a計時周期控制在1秒以下,剩余微小的時間差就可以通過插補空指令來校正了。計時精度只要控制在千分之一以下就可以了。在51單片機使用11.0592MHz晶體振蕩器的情況下,指令周期大約1.085微秒,所以將計時精度控制在千分之一以下問題不大。誤差總是會有的,只能通過準確計算來控制了,也可以通過更換更高頻率的晶體振蕩器提高單片機時鐘頻率的方法來進一步提高計時的精度。如果放電過程中,意外原因或者人為終止放電過程,P37端口變?yōu)楦唠娖?,程序循環(huán)依舊會進行下去,只是時間常量a停止自動加一,時間顯示維持不變。
編譯后,寫入單片機內部,做好放電電路部分與51單片機的連接,便可投入使用。
電池接入后,按動輕觸按鍵“啟動”,就會進入一次容量測試過程,期間電池取出接入,都不會影響到單片機計時。電池放電完畢,單片機數碼管顯示鎖定,給出總放電持續(xù)時間,單位為秒??梢宰孕腥斯び嬎惴烹娦r數。當然也是可以自行對程序進行改進,直接以小時分鐘形式進行顯示。只要單片機不斷電,數碼管將持續(xù)顯示當前放電時長。如果要進入下次測量過程,只需要按動單片機復位鍵,數碼管清零,單片機程序轉入起點,你就可以進入新一次的容量測試過程了。
充電電池如果較長時間閑置,它的實際容量將受到影響,重新啟用diyi次能夠釋放的容量遠遠達不到標注容量,放電電壓也很不平穩(wěn)。至少要經過三次以上的充電放電循環(huán),電池*激活,容量才能恢復到應有的水平。充分考慮這種因素的影響,所以容量測試一般采取多次平均的方式,或者循環(huán)充放電三次以后放電持續(xù)時間為準,以此衡量電池容量才算是恰當。
#Include “reg51.h”
char
code disp[]=;
//字形碼
void delay(unsigned int dt)
{ unsigned int j=0;
for(;dt>0;dt--)
{ for(j=0;j125;j++)
}
}
void main()
{ int a,b,c,led1,led2,led3,led4;
P3=255;
a=0;
for(;;)
{b=a;
led1=b%10;
P2=239;
P0=disp[led1];
delay(6);
P2=255;
b=b/10;
led2=b%10;
P2=223;
P0=disp[led2];
delay(6);
P2=255;
b=b/10;
led3=b%10;
P2=191;
P0=disp[led3];
delay(6);
P2=255;
b=b/10;
led4=b%10;
P2=127;
P0=disp[led4];
delay(6);
P2=255;
for(c=44;c>0;c--)
{
P2=239;
P0=disp[led1];
delay(5);
P2=255;
P2=223;
P0=disp[led2];
delay(5);
P2=255;
P2=191;
P0=disp[led3];
delay(5);
P2=255;
P2=127;
P0=disp[led4];
delay(5);
P2=255;
}
if(P3==127)
delay(3);
if(P3==127)
a=a+1;
else a=a;
}
}