電瓶是電動車的能量來源,直接關系到電動車性能的好壞,是電動車最容易損壞的部件,直接關系到電動車的經濟成本,在一定周期內對電瓶的容量檢測,能及時了解電瓶性能及發現個別電池容量的不足,對電瓶組進行調整配對,使電瓶充分發揮其性能。單片機構成的電瓶放電容量檢測儀,由89C2051單片機組成的時鐘電路及電池電壓檢測和放電控制電路組成。原理圖如圖所示。

單片機構成的電瓶放電容量檢測儀工作原理:電瓶電壓經接線端子SP1輸入分成三路,一路經7805供電給由89C2051組成的時鐘電路,一路經7808供電給由集成塊U4 LM358組成的電池電壓檢測電路,另一路為主放電通路,由Q5,Q6,繼電器JDQ1及放電負載組成。當電池接入電路后, U4 LM358檢測電池電壓,如果電池電壓高于放電下限10.5V,取樣電壓經RP1,R19與電阻R20分壓后加至比較器反相輸入端,此時反相輸入端電壓高于同相輸入端電壓,LM358輸出低電平,單片機89C2051的P3.4端口檢測到低電平,等待啟動,按下啟動按鈕K1,單片機啟動,時鐘電路開始計時,端口P3.7輸出低電平,Q5 ,Q6導通,繼電器JDQ1吸合,放電通路接通,開始放電,當電池放電到放電極限10.5V時,比較器反相端電壓低于同相端電壓,LM358輸出高電平,單片機檢測到高電平后,時鐘電路停止,并保持時鐘數據顯示,端口P3.7輸出高電平,Q5 ,Q6截止,繼電器JDQ1釋放,放電停止,此時可記下放電時間,然后乘以放電電流就是電瓶容量。只有斷開電瓶線或重新按下啟動按鈕,時鐘電路才清零重新計時。
電瓶放電容量檢測儀裝于一個機箱內,引出兩對接電池的接線夾子,機箱后安裝了兩對接線端子,用于接放電負載,測試時先用電動車充電器充滿電,然后拆開電瓶外殼,接好本放電器,啟動電路,兩塊電瓶同時放電,這樣,48V電瓶只需兩次就可測完,最后根據電瓶放電記錄,就可估測出電瓶的容量,如果電瓶容量相差懸殊,那就要對電瓶重新配對,使一組電瓶的各個電池容量相近,如果電瓶容量低于標稱容量的50%,那就需要根據實際情況加水或去硫化處理了。
本電瓶放電容量檢測儀還可用于電瓶放電保護器,只要通過本電路接上12V照明燈具就可放心使用,不必擔心過放電損壞電池。注意,本電路只適用于12V電池。
單片機構成的電瓶放電容量檢測儀源程序:
- //89C2051單片機電瓶容量檢測儀
- #include<reg51.h>
- // 包含51單片機寄存器定義的頭文件
- unsigned char code Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //數字0~9的段碼
- unsigned char int_time ;
- //中斷次數計數變量
- unsigned char minute; //分鐘計數變量
- unsigned char hour; //小時計數變量
- unsigned char second; //秒計數變量
- sbit out=P3^7; //將OUT位定義為P3.7
- sbit shuru=P3^4;
- //將SHURU位定義為P3.4
- sbit S1=P3^5; //將K1位定義為P3.5
- sbit led0=P3^0;
- sbit led1=P3^1;
- sbit led2=P3^2;
- sbit led3=P3^3;
- void delay(void) ; 數碼管掃描延時
- {
- unsigned char j;
- for(j=0;j<200;j++)
- }
- /******函數功能:鍵盤掃描延時**********/
- void delay60ms(void)
- {
- unsigned char i,j;
- for(i=0;i<200;i++)
- for(j=0;j<100;j++)
- }
- void DisplayMinute(unsigned char m)
- {
- led1=0; // P3.1引腳輸出低電平
- P1=Tab[m/10]; //顯示十位
- delay();
- led0=1; //關閉所有數碼管
- led1=1;
- led2=1;
- led3=1;
- delay();
- led0=0; // P3.0引腳輸出低電平
- P1=Tab[m%10]; //顯示個位
- delay();
- led0=1; //關閉所有數碼管
- led1=1;
- led2=1;
- led3=1;
- }
- void DisplayHour(unsigned char h)
- {
- led3=0; //P3.3引腳輸出低電平
- P1=Tab[h/10]; //顯示十位
- delay();
- led0=1; //關閉所有數碼管
- led1=1;
- led2=1;
- led3=1;
- delay();
- led2=0; //P3.2引腳輸出低電平
- P1=Tab[h%10]; //顯示個位
- delay();
- led0=1; //關閉所有數碼管
- led1=1;
- led2=1;
- led3=1;
- }
- void key_scan(void)
- {
- if(S1==0) //如果是K1鍵按下
- {
- delay60ms(); //延時60ms再檢測
- if(S1==0) //如果是K1鍵按下
- {
- second=0;
- minute=0;
- hour=0;
- out=0; //啟動輸出
- TR0=1; //啟動定時器T0
- }
- }
- if(shuru==1) //如果SHURU是高電平
- {
- delay60ms(); //延時60ms再檢測
- if(shuru==1) //如果是SHURU高電平
- {
- TR0=0; //停止定時器T0
- out=1; //停止輸出
- }
- }
- }
- /*******函數功能:主函數************/
- void main(void)
- {
- TMOD=0x01; //使用定時器T0 EA=1; //開中斷總允許
- ET0=1; //允許T0中斷
- TH0=(65536-46083)/256;
- //定時器高八位賦初值
- TL0=(65536-46083)%256;
- //定時器低八位賦初值
- out=0;
- int_time=0; //中斷計數變量初始化
- second=0; //秒計數變量初始化
- minute=0; //分鐘計數變量初始化
- hour=0; //小時計數變量初始化
- while(1)
- {
- key_scan(); //執行鍵盤掃描 DisplayMinute(minute);
- //調用分鐘顯示子程序
- DisplayHour(hour);
- //調用小時顯示子程序
- }
- }
- void interserve(void ) interrupt 1 using 1 //using Time0
- {
- TR0=0; //關閉定時器T0
- int_time++; //中斷次數加1
- if(int_time==20) //如果中斷次數滿20
- {
- int_time=0; //中斷計數變量清0
- second++; //秒計數變量加1
- }
- if(second==60) //如果秒計滿60
- {
- second=0;
- //如果秒計滿60,將秒計數變量清0
- minute++; //分鐘計數變量加1
- }
- if(minute==60) //如果分鐘計滿60
- {
- minute=0;
- //如果分鐘計滿60,將分鐘計數變量清0
- hour++; //小時計數變量加1
- }
- if(hour==24) //如果小時計滿24
- {
- hour=0;
- //如果小時計滿24,將小時計數變量清0
- }
- TH0=(65536-46083)/256;
- //定時器T0高四位賦值
- TL0=(65536-46083)%256;
- //定時器T 0低四位賦值
- TR0=1; //啟動定時器T0
- }
復制代碼
|