2Win 差動式 低電圧バランス型 DCヘッドフォンアンプ(電池寿命の計測)

基板が出来上がるのを待って、電池寿命の計測をしようと思い、今回はフォークリフト・コントロールで使ったArduinoマイコンを用意しました。マイコン基板の上に重ねて機能が拡張できることと、ソフトが簡単に作れることがその理由です。

HPA_v7_BAL_25.jpg

左下が低電圧バランス型DC HPA 試作器です。そばに見えるアルカリ電池2本で駆動します。
計測に使うのが右側に見えるArduinoもどき(もどきが私の趣向のようです)で、上側基板に液晶とmicroSDが載ってます。
上側真ん中が、HPAの電池±電圧を全てプラス側にする変換アンプです。ノイズを嫌い電池駆動です。

【Arduinoもどきマイコン】

HPA_v7_BAL_27.jpg

電池電圧は初期1.6Vから最終1.2V程度までなのでArduinoマイコンの電圧計測をそのまま使います。
上側に3.3V動作のI2CインターフェースのLCDで、計測している経過時間と電圧を表示させます。
下側に3.3V動作のmicroSDを載せ、計測値をcsvファイルで保存します。

Arduinoの電源は5VのACアダプターから直接供給しています。長時間動作なので電池では持ちそうにないからです。
私が使っている秋月製Arduinoもどきでは外部5V駆動にするためにはリセット回路の改造が必要です。詳しくは取扱説明書に書いてありました。
LCDとmicroSD用3.3V電源は3.3Vの3端子レギュレータを載せています。

ここでのポイントは5V動作のArduinoマイコンと3.3V機器のインタフェース電圧差の変換です。

Arduinoはこれを使う先人方々が非常に多いので、自分で1から考えることが少ないです。
LCD液晶の場合はこちらのHPを参考にしました。ここで使われているのが秋月のI2Cバス双方向レベル変換ICなのですが、自作モットーの小生としては自分で用意できるものを探しました。

I2Cレベル変換で探すとこのようなページがありました。原典はNXPらしいですが、最近はNXPが推奨してないらしいです(詳しくは参照ページをご覧ください)が、手持ちのN-FETで簡単に作れるのでこれを使ってみました。プルアップ抵抗は10kです(1kでは動作しません)
写真中央に見える6P基板が2段積みにしたN-FET基板です。

参照図にプルアップ抵抗値が書いてなかったのでここで回路を描いてみました。

HPA_v7_BAL_29.jpg

SDカードを接続する記事も沢山ありますね。私が見たページはここです。
Arduino 5Vと microSD 3.3V のインタフェース電圧変換には抵抗分圧を使ってます。I2C変換に使ったFET回路も使えそうなのですが、横着して抵抗分圧のままです。

【±電圧を全てプラスに変換するアンプ】
HPA_v7_BAL_28.jpg

HPAの電池電圧はGNDに対して±なので、Arduino の電圧計測ではマイナス電圧が測れません。
これまでは電池のプラス側しか計測していなかったのですが、マイナス側電池も計測します。電池の消費による電圧バランスを確かめたかったからです。

HPA_v7_BAL_30.jpg

オペアンプは±6V程度で動作させます。電池電圧(例)はプラス側+1.6Vと0Vの差動出力+1.6V、マイナス側0Vと-1.6Vの差動出力+1.6Vがオペアンプのout端子から出ます。

HPA_v7_BAL_26.jpg

使用過程の電池電圧を示しますが、各々1.39Vでかなり良く揃っています。時間の単位は秒です(約1.7時間経過)

これを10秒ピッチで計測します。計測したデータ例です。Excelのcsvファイル読み込みです。
Excelの最大行数は古いバージョンでも約65,000行なので、70時間計測でも25,200行程度で収まります。
尚、変換アンプは単三電池で駆動しますが、オペアンプ(LM358)に流れる電流は約1.2mAなので十二分に持ちます。

HPA_v7_BAL_21.jpg

Arduinoは簡単にシリアル出力ができるので、計測中のデータをPCで表示させることもできます。

HPA_v7_BAL_24.jpg

しかし、計測途中でシリアル計測をONさせるとリセット機能が作動するので時間がゼロクリアされます。要注意です。

さて電圧計測ができましたが、こうなると電流も計測したくなってきます。
基板が到着するまでまだ数日あるので電流計測アンプも増設してみましょうか。

30mA程度の電流を1Ωの計測抵抗に流すと、差分電圧が30mV出ます。これを3Vに上げるためには100倍の増幅率です。オペアンプならば簡単に設定できます(入力抵抗10kと増幅抵抗1M)が、さてノイズは大丈夫かな?

--------- 22015/9/23 追記 ---------

【電流計測機能を追加しました】

HPA_v7_BAL_32.jpg

電圧計測用変換基板の上に電流計測用基板を載せています。

電流センサーはバッテリーからHPAに供給する端子の間に1Ωの金属皮膜抵抗を挿入してます。
電流が30mAならば30mVの両端電圧が発生します。HPAに供給する電圧が若干下がりますが、この程度ならばアンプ性能に影響はありません。
30mVの電圧をそのまま計測するのは厳しいので、オペアンプで100倍に増幅します。
上に示したオペアンプ回路図と同じ構成ですが、R5,R6,R7,R8を10k から1M に変更します。
この抵抗は小型安価なカーボン抵抗を使いましたが、100倍増幅の精度が大きく違わないように選別しました。幸い 10k は≒9.85k程度の物を選択し、1M は 980~990k 程度の物を組み合わせました。

【計測結果】
HPA_v7_BAL_33.jpg

10の桁が偶数になる時に電流値を表示するようにしました。

HPA_v7_BAL_31.jpg

アイドル電流を10mAに調整すると電池電流が30mA程度と思っていたのですが、何と40mA程度流れます。
使いかけの電池電圧で1.35V程度から計測を始めたのですが、今は1.30Vまで下がってます。
でも、2000mAh容量のアルカリイオン、エネループならば約50時間程度の電池寿命が期待できます。

------- 2015/ 9/ 25 追記 -------
【アルカリ電池のライフ計測・中間状況】
 
HPA_v7_BAL_35.jpg

当初、新品電池電圧1.55Vから電池ライフ計測を開始しました。
現在 112,450 秒 = 約 31 時間経過し、電池電圧は 1.25V 程度あります。
アイドル電流も 5~7mA 程度ありますのでまだまだ行けますね。

---------- 2015/ 9/ 26 追記 -----------
アルカリ電池のライフ計測がやっと終わりました。

【電池ライフ (アルカリ)】
HPA_v7_BAL_36.jpg

少し線が交錯していて見難いのですが、50時間の電池ライフ予想値を超え、60時間以上です。
これは単純に電池容量推測値の 2000mAh を初期電流 40mA で割った値なので、電池電圧低下と共に低下する電流によって時間延長になっています。
テストは60時間強で切り上げましたが、この時の電池電圧が 1.18V で、アイドル電流は 5mA 程度あります。未だ十分な音感で鳴ってくれてます。
実測電流から電池容量を計算すると、この時点で 1800~1900mAhです。秋月で購入した ゴールデンパワー社という中国トップメーカーの電池です。20円/個の価格ですからコストパフォーマンス最高に良いです。

この後、エネループでテストをやってみようと思います。

【電池ライフ (エネループ)】 2015/ 09/ 29 追記
HPA_v7_BAL_40.jpg

このテストは、アルカリ電池でのアイドル電流設定をそのままにしてエネループに交換した結果です。

概略、アルカリ電池と同程度の電池ライフ 60時間超です。アイドル電流は 4mA程度あるので、普通のボリュームで聴くのでしたら十分なパフォーマンスです。

エネループの特徴として、初期電圧 1.35V (充電直後は1.45V) が短時間で 0.1V 程度低下します。それによって 35mA程度あった電流も 27~29mA 程度に下がります。エネループはこの 1.25V 近辺での放電時間が長いです。
流石に 40hr を超えると電圧が 1.2V を切ると低下が始まります。
まだまだ聴ける状態でしたがここで中断してます。

---------- 追記 ---------

【 Arduino ソフトウエア 】

備忘録として Arduino ソフトを載せておきます。

小生がこれまで使ってきた PIC マイコンと比較した、Arduino の良さを列挙します。

・Config という動作環境を定義する記述が全く不要です。PIC では機種ごとにこの記述方式が異なることがあって煩雑且つ間違いを起こす根源でした。
・様々な周辺機器を制御する関数系が標準で用意されています。サンプルも標準装備されています。
・ユーザーが多いので様々な使い方がNET情報に載っています。


//----- ここから
// 変数の定義
#include <SD.h>                 // microSDを使います
#include <SPI.h>                // microSDはSPIで駆動します
#include <Wire.h>              // I2C LCD を使います
#include "skI2CLCDlib.h" // I2C LCD のコントロール用です。詳細は参照ページを

unsigned const int analogInPin0 = A0;  // Analog input pin that the potentiometer is attached to
unsigned const int analogInPin1 = A1;  // Analog input pin that the potentiometer is attached to
unsigned const int analogInPin2 = A2;  // Analog input pin that the potentiometer is attached to
unsigned const int analogInPin3 = A3;  // Analog input pin that the potentiometer is attached to
unsigned int outputValue0 = 0;       
unsigned int sensorValue0 = 0;        // value read from the pot
unsigned int outputValue1 = 0;       
unsigned int sensorValue1 = 0;        // value read from the pot
unsigned int outputValue2 = 0;       
unsigned int sensorValue2 = 0;        // value read from the pot
unsigned int outputValue3 = 0;       
unsigned int sensorValue3 = 0;        // value read from the pot
unsigned long timeMS = 0;
unsigned long count = 0;
String datastring;
String stime;
String svolt;
String sampe;
double Voltage0 = 0;
double Voltage1 = 0;
double Ampare0  = 0;
double Ampare1  = 0;

skI2CLCDlib LCD(0x3E,16) ;              // LCDのアドレス、画面カラム数16文字

// 初期化
void setup(){
  // シリアルポートを9600 bps[ビット/秒]で初期 化
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  pinMode(10, OUTPUT);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
  }
 
  // LCDモジュールの初期化処理
  // ICON ON,コントラスト(0-63),VDD=3.3Vで使う
  LCD.Init(LCD_USE_ICON,45,LCD_VDD3V) ;       // 初期32でしたが、45位が丁度良いコントラスト

}

// 繰り返し処理
void loop(){
  char inputchar;
  char s[16];
  //アナログ電圧を読み取る
  sensorValue0 = analogRead(analogInPin0);     // +側電池電圧
  sensorValue1 = analogRead(analogInPin1);     // -側電池電圧
  sensorValue2 = analogRead(analogInPin2);     // +側電池電流
  sensorValue3 = analogRead(analogInPin3);     // -側電池電流
  //if (sensorValue > 0) {
    // map
    datastring = "";
    stime = "";
    svolt = "";
    sampe = "";
    outputValue0 = map(sensorValue0, 0, 1023, 0, 508);  // 508 は電源電圧実測値の 5.08Vを示す
    outputValue1 = map(sensorValue1, 0, 1023, 0, 508);
    outputValue2 = map(sensorValue2, 0, 1023, 0, 508);
    outputValue3 = map(sensorValue3, 0, 1023, 0, 508);
   
    Voltage0 = outputValue0 / 100.00 ;   // 電池電圧単位(V)に変換
    Voltage1 = outputValue1 / 100.00 ;
    Ampare0  = outputValue2 / 10.00 ;    // 電池電流単位(mA)に変換
    Ampare1  = outputValue3 / 10.00 ;
    stime.concat("time,");
    stime.concat(String(count,DEC));
    datastring.concat(stime);

    svolt.concat("Volt,");
    dtostrf(Voltage0, 4, 2, s);   // 電池電圧文字 #.## に変換
    svolt.concat(s);
    svolt.concat(",");
    dtostrf(Voltage1, 4, 2, s);
    svolt.concat(s);

    sampe.concat("Amp,");
    dtostrf(Ampare0, 4, 1, s);  // 電池電流文字 ##.# に変換
    sampe.concat(s);
    sampe.concat(",");
    dtostrf(Ampare1, 4, 1, s);
    sampe.concat(s);
   
    datastring.concat(",");        // ファイル書込み用文字列編集
    datastring.concat(svolt);
    datastring.concat(",");
    datastring.concat(sampe);
    datastring.concat(", OK");

    // LCD に表示
    LCD.Clear();
    LCD.SetCursor(0,0);
    char charArray1[16];
    stime.toCharArray(charArray1,16);
    LCD.Puts(charArray1);
   
    if(count % 20){    // 2桁目秒数が奇数の場合は電圧表示
      LCD.SetCursor(0,1);
      char charArray2[16];
      svolt.toCharArray(charArray2,16);   
      LCD.Puts(charArray2);
    }else{    // 偶数の場合は電流表示
      LCD.SetCursor(0,1);
      char charArray2[16];
      sampe.toCharArray(charArray2,14);
      LCD.Puts(charArray2);
    }
    // microSD に書き込みとserial に転送
    PrintToFile(datastring);
    delay(10000);           // 10 秒待って
    count = count + 10;  // カウントを10上げる
  //}
}

// Subroutine for writing data in SD card, SDカードへのデータ書き込みのためのサブルーチン
void PrintToFile(String dataIn){
  File dataFile = SD.open("datalog.csv", FILE_WRITE);  //  ファイル名を定義。
  if (dataFile) {                                      // SDカードの対象ファイルを開くことができれば
    dataFile.println(dataIn);                          // データの記入
    dataFile.close();                                  // ファイルを閉じる
    Serial.println(dataIn);                           // シリアルポートにも出力して確認。
  }else {                                              // ファイルが開けないときのエラーメッセージ
    Serial.println("error opening file");
  }
}
// ------- ここまで


さてと、完成基板を待たずに試作基板で電池寿命テストを始めますかね。






コメントの投稿

非公開コメント

プロフィール

haiga

Author:haiga
私のブログへようこそ!
電気オンチが始めた自作オーディオです
2010/3/17 電子工作をプラスしました。

自作オーディオの楽しみ共有のため、私が作ったパーツ提供をしてます。質問や要望を遠慮なくコメント欄に書き込んでください。

FC2カウンター
その日1回目にアクセスいただいた方の総カウントです
最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード