|
http://bbs.yleee.com.cn/thread-3720-1-1.html
電池內阻檢測價格不斐,這個簡易的測試器,作為測試真假電池很快速!!
// FPGARM于一乐论坛首次开源
// 2010年7月29日
//******锂电池内阻测试器******
//欢迎转载,但不得用于商业目的
//免责声明我不会写,反正就是免
//责啦,出什么事了我不管啊:)
//*********代码开始***********
#include "iom8v.h"
#include "macros.h"
#define uchar unsigned char
#define uint unsigned int
void delay (uint ms)
{
uint t=100;
while (--ms)
{
while (--t);
t=100;
}
}
uint addata()
{
uint addata;
ADCSRA|=BIT(ADSC);
while(!(ADCSRA&(BIT(ADIF))));
addata=ADCL;
addata=addata+ADCH*256;
return addata;
}
void initial ()
{
DDRD=0X3f; //一共5颗LED,应该是0X1F,懒得改了
DDRB|=BIT(2); //PB2,SS,OC1B作为放电控制脚
DDRC&=~BIT(3); //ADC3,PC3作为AD采集脚
ADMUX=0xC3; //内部基准,右对齐
ADCSRA=0X82; //AD使能,ADC时钟4分频
}
void main ()
{
uint ad_yuanlai=0,ad_fangdian=0,du,i,t=6;
delay (90); //延时一段时间,等接触良好
initial (); //上电初始化
while (1) // 大循环开始
{
ad_yuanlai=0;//原來
ad_fangdian=0;//放電
delay (26);
for (i=0;i<t;i++)
ad_yuanlai+=addata(); //采集t次
PORTB|=BIT(2); //开始放电,出现电压降
delay (25); //延时,等待电压稳定
for (i=0;i<t;i++)
ad_fangdian+=addata();//采集t次,此时电压U=E-I*r,
//因为电流变化幅度不大,所以
//所以下面就用du代替I*r,从而
//判断r的大小。
PORTB&=~BIT(2); //结束放电
if (ad_yuanlai>=ad_fangdian)
{
du=ad_yuanlai-ad_fangdian; //得到△V
if (du<22) //0 这里取22不是13是因为考虑到线阻什么的。
PORTD=0X01; //1 - - - - * 内阻小
if (du<35&&du>=22) //13
PORTD=0X03; //2 - - - * *
if (du<48&&du>=35) //13
PORTD=0X07; //3 - - * * *
if (du<61&&du>=48) //13
PORTD=0x0f; //4 - * * * *
if (du<74&&du>=61) //13
PORTD=0X1F; //5 * * * * *
if (du<87&&du>=74) //13
PORTD=0x11; //2 * - - - *
if (du>87) //
PORTD=0x1b; //4 * * - * * 内阻大
}
else PORTD=0x00;
}
}
//***********代码结束***********
放電 25mS 然有檢查 放電前後的電壓 AD 值 決定 LED 的亮燈數 ... 不知道大家對此有何看法!!
|
評分
-
2
查看全部評分
-
|