電池内部抵抗測定ユニット

電池の起電力を E 、端子電圧を V とすると、この電池を電気回路に接続していない場合、V と E は等しくなります。
しかし、電気回路に接続し電流 I が流れると、V は E より小さくなります。この現象は電池の内部に電気抵抗 r が存在するためです。
そこでこの内部抵抗を求めるためのユニットを作成してみました。

電池の内部抵抗®を求め、その結果を表示するには、次のような流れで処理を行います。

  1. 電池に負荷抵抗を接続しないときの起電力(E)を測定する。
  2. 既知の負荷抵抗(R)を接続する。(プッシュスイッチを押す)
  3. その時の電圧(V)を測定する。
  4. RとVより、電流(I)を求める。(I=V÷R)
  5. これらの測定値より、電池の内部抵抗を求める。(r=(E-V)÷I)
  6. これらの値(E、V、I、r)をLCDへ表示します。

Impedance.c
//********************************************************************** 
/*
  『電池内部抵抗測定』 
 
  I=V/R
 V=E-rI
 V+rI=E
  rI=E-V
  r=(E-V)/I 
 
 
*/
//********************************************************************** 
 
unsigned	int	measurement(unsigned short channel)
{
	unsigned	int		ad, cnt;
	// 電圧を50回累積測定する。 
	ad = 0;
	for (cnt = 0; cnt < 50; cnt++) {
		ad += Adc_Read(channel);
	}
	return (ad);
}
 
//********************************************************************** 
 
#define		SW		PORTB.F0
 
void main()
{
	unsigned	char	buf[8];
	unsigned	int		ad2, ad3;
	double				E, V, I, r;
	//
	OSCCON = 0b01110000;		// クロックは8Mhz 
	CMCON  = 0b00000111;		// コンパレータは使用しない。
	// A/D変換を使用する。 
	ANSEL  = 0b00001100;
	// ポートを初期化する。 
	TRISA  = 0b00111110;
	TRISB  = 0b00001111;
	OPTION_REG.F7 = 0;
	// LCDを初期化する。 
	Lcd_Custom_Config(&PORTB,4,5,6,7,&PORTA,0,7,6);
	Lcd_Custom_Cmd(LCD_CURSOR_OFF);
	Lcd_Custom_Cmd(LCD_CLEAR);
	//
	while (1) {
		// Vの測定 
		ad3 = measurement(3);
		V = ((double)ad3 * 4.8828125) / 50.0;
		if(V < 100.0) {
			Lcd_Custom_Cmd(LCD_CLEAR);
			// Eの測定 
			ad2 = measurement(2);
			E = ((double)ad2 * 4.8828125) / 50.0;
			// Eの表示 
			WordToStr((unsigned int)E, buf);
			Lcd_Custom_Out(1, 1, "E");
			Lcd_Custom_Out(1, 2, &buf[1]);
			Lcd_Custom_Out(1, 6, "mV");
		} else {
			// Vの表示 
			WordToStr((unsigned int)V, buf);
			Lcd_Custom_Out(1, 9, "V");
			Lcd_Custom_Out(1, 10, &buf[1]);
			Lcd_Custom_Out(1, 14, "mV");
			// Iの計算 
			I = V / 4.7;
			// Iの表示 
			WordToStr((unsigned int)I, buf);
			Lcd_Custom_Out(2, 1, "I");
			Lcd_Custom_Out(2, 2, &buf[1]);
			Lcd_Custom_Out(2, 6, "mA");
			// rの計算 
			r = ((E - V) * 1000.0) / I;
			// rの表示 
			WordToStr((unsigned int)r, buf);
			Lcd_Custom_Out(2, 9, "r");
			Lcd_Custom_Out(2, 10, &buf[1]);
			buf[0] = 'm';
			buf[1] = 0xF4;
			buf[2] = 0x00;
			Lcd_Custom_Out(2, 14, buf);
		}
		Delay_ms(500);
	}
}
 
//**********************************************************************

いつものブレッドボードで確認しました。
中央に見える緑色のプッシュスイッチを押すことにより、電池の内部抵抗を測定し表示します。
プッシュスイッチが押されていないときには、電池の起電力(電圧)を表示します。

使用した負荷抵抗は手持ちの物(4.7Ωのセメント抵抗)を使用しました。

手持ちのアルカリ乾電池を測定してみました。約1.4Ωありました。
無負荷ですと約1.6Vありますが、負荷を接続すると0.4Vも電圧が下がってしまいました。

手持ちのニッカド電池を測定してみました。これも約1.4Ωありました。

手持ちの古いアルカリ乾電池を測定してみました。約2.2Ωありました。

如何ですか?
これで電池が使えるか使えないかを正確に判断することが出来ますね。 ^_^

著作権表示 copyright notice

このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。詳細
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.Details
  • elechobby/picdic/pic16f88/77.txt
  • 最終更新: 2025/10/17 14:29
  • by 127.0.0.1