電池の内部抵抗を測定する

電池が3V以下の時の回路の考察

mbedのA/Dコンバーターは3.3V以上は測定できませんから、電池は3V以下を想定します。

電池は消耗すると端子間の電圧が低下しますが、これをテブナンの定理で等価的に考えると、電池には起電力と内部抵抗があり、この内部抵抗rが消耗とともに増大すると考えます。
このような電池に負荷抵抗Rをスイッチと共に繋げるとすると、次のような回路になります。

上記回路図で、
Eは電池の起電力、
rは求める電池の内部抵抗、
Rは計測するための負荷抵抗、
xはMBEDでコントロールされる電子スイッチのON時内部抵抗、
Vswはその抵抗の両端の電位差、
Vは電池の端子電位差、
IはスイッチがONの時の電流です

スイッチがOFFの時、電流は0になります。従って、V=Eとなり、電池の解放電圧は電池の起電力と一致します。
回路の方程式を立てると次のようになります。
I=E/(r+R+x) ------------ (1)
式を変形して、
r = E/I - (R+x) --------- (2)
また、
I=V/(R+x)  -------------- (3)
x = Vsw / I  ------------ (4)
I=(V-Vsw)/R ------------- (5)
であるから、(3)(4)を(2)に代入すると、
r = E*(R+x)/V - (R+x) --- (6)
  = (R+Vsw/I)*(E/V - 1) ------ (7)
  = (R+Vsw*R/(V-Vsw))*(E/V-1)  -----(8)
  = R*(1+Vsw/(V-Vsw))*(E/V-1) 
  = R*((V-Vsw+Vsw)/(V-Vsw))*((E-V)/V)
  = R*(E-V)/(V-Vsw)           ------(9)
(9)の変数は全て計測可能のため電池の内部抵抗rは計測できることがわかる。
ここでは、電子スイッチとしてFETのTND012NMを用いた。
他の電子スイッチでも同様である。
電池の内部抵抗を測定する
#include "mbed.h"

AnalogIn sw(p19);
AnalogIn cell(p20);
Serial pc(USBTX, USBRX); // tx, rx
DigitalOut BatSw(p5);
int main()
{
  const float R = 13;
  float x = 0.27;
  // スイッチOff
  BatSw = 0;
  pc.baud(115200);
  float E, voltage, Vsw, innerR, current, Vr;
  while(true)
  {
    // 解放電圧
    E = cell.read()*3.3;
    pc.printf("E=%.3f ", E);
    // スイッチON
    BatSw = 1;
    wait(1.0);
    Vsw = sw.read()*3.3;
    voltage=cell.read()*3.3;
    Vr = voltage - Vsw;
    pc.printf(" Vr=%.3f Vsw=%.3f", Vr, Vsw);
    innerR = R*(1+Vsw/Vr)*(E/voltage-1);
    current = Vr/R;
    x = Vsw/current;
    pc.printf(" r=%.3f I=%.3f x=%.3f\n", innerR, current, x);
  // スイッチOff
    BatSw = 0;
    wait(1.0);
  }
}
 1 
 2 
 3 TND012NMのOUTに繋げる
 4 電池の+に繋げる
 5 
 6 TND012NMのINに繋げる
 7 
 8 
 9 負荷抵抗の値
10 取り合えずのFETの内部抵抗
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 (9)の式
28 
29 FETの内部抵抗を変更する
30 
31 
32 
33 
34 
35 


電子スイッチTND012NMは次のような内部回路になっています。


単純なFETとかフォトカプラなどを利用しても同様に測定できます。