こんにちは、VIVIWARE社の新居です。
今回は開発していて発見した面白い現象をお話しします。ただし、以下の点にご注意ください。
今回紹介する方法が安全かどうか検証したわけではありません。実際に試す場合には各自でよく考えてすすめてください。
はじめに
さっそくですが最近は小さな機器でも充電できる電池を内蔵したデバイスが増えてきたと思います。 小さい機器は電池残量表示がないことが多いですが、充電がどのくらい残っているか気になりませんか?
私はあります。日々良く使うのに、充電残量がわからない機器があるのです。当社のVIVIWARE COREという製品です。 既に製品になっているので、中を改造せずに充電容量が取得できるといいなぁと思ってました。 このような機器は必ず充電端子がついています。そこにつなぐ機器でなんとかならないか考えてました。
先月突然やり方を思いついて、試してみたところできました。これです。
その機器の充電端子にこの写真の電池残量計測装置をつなぐだけで、内部のLipoの電池電圧を±20mVぐらいの精度で取得できました。また、その電圧から大雑把な電池の残量を表示することができます。
もちろん条件があります。
- 電圧を検出できるのは先につなぐ機器の回路がわかっている場合
- LipoかLi-ionの1セルタイプで充電回路がLow Drop Out (LDO)タイプであること
- 電池残量を%表示するためには内蔵電池の特性を取得済み
そのため何でも利用できるわけではありませんが、どうやって測定しているか気になりませんか?
背景
まずは一般的な1セルのLipo電池充電回路を説明します。
充電端子の直後に充電制御ICが入ってます。 この充電制御ICがLDO型の場合には電池を充電する為に電池電圧より高い入力電圧が必要になります。 充電終了電圧が4.2Vの場合には入力は必ず4.2V以上が必要です。しかし、充電途中、電圧が4.2Vを切っていた場合にはどうなるでしょうか?
いくつかのICを調べてみると電池の電圧よりちょっとでも高ければ充電が続くタイプが多いようです。また(当たり前ですが)電池より低い電圧を与えると流れ込む電流は0になります。 つまり充電端子の電圧を変化させる事によって内部の電池電圧が推定できるのです。 ちなみにLDOであれば100mVぐらいの電圧差があれば動作するタイプが多いので、大雑把には100mV程度の精度まで推定可能と言えます。
このことを実験で確認してから、実機でどうなるか確認してみてみました。 その結果、なんとこの予想(100mV程度)よりとても正確に!(20mV程度)推定できることがわかりました。100mVでは残量を大まかにぐらいしかわかりませんが、20mVなら有望です。 以下に詳細を説明します。
該当機器の分析
該当機器の充電制御ICにはTIのBQ24232が使われています。このICはLDOタイプですので、問題ありません。 充電制御ICのそばには電池や充電回路自体の異常状態を検出するためにPMICが入っています。 このICの電源端子(VCC)だけは内部電池(VBAT)、外部充電端子(VDCIN)のどちらかの電圧があれば動作するように設計されています。この図中水色で示した、ダイオードORがその機能を担っています。 このORのおかげで、入力電圧が正常値以下でも内部電池か外部充電端子の電圧の高い方から 電流がながれ、PMICだけは必ず動作するようになってます。
ここがミソです。
この回路は入力電圧が4.2V以下では通常充電は行われませんが、内部電池電圧より充電電圧が高い時のみ外部からPMICに電流が流れます。充電電圧が低いときには外部から電流が流れなくなります。この現象を利用すると内部電池電圧を推定できそうです。また、ダイオードは対称に入っているため、電圧誤差は殆ど無くなりそうです。
ここで、実際に充電電圧と充電端子から流れ込む電流を測定してみました。
このグラフは電池電圧が3.3Vの時に測定したデータです。 充電端子電圧が4.2V以上のところでは正常に150mA程の充電電流が流れます。電圧を落とし3.5V程度にすると充電電流が6mAととても小さくなりました。 また、3.3Vより低いところで電流が0になることがわかります。 ここでは電圧は3.3Vだけしか示しませんが、電池電圧を変化させると、流れる電流が0になる電圧も変化することを確認しました。 また、電圧の測定誤差も10mV程度ととても小さいことがわかりました。
この回路であれば推定するまでも無く、USB充電端子の電流が0になるところの電圧がそのまま内部電池電圧になります!
これなら電池残量を計測できそうです。早速実験回路を設計してみました。
設計
試作をする上では表示器をどうするかが重要です。今回は小さく作りたかったのでM5StickC Plusを使うことにします。 小さくて明るいカラー液晶があり測定値を表示でき、Lipo電池を内蔵して5V出力もあるので測定回路の電源にもなります。
次に、電池電圧を測定する回路ですが、ADC及びDAC両方内蔵した小さな8pinマイコンであるATTINY412を利用してみました。
また、折角なので電池電圧だけでなく、残り容量のパーセントを表示しようと思ったので、該当機器の電池をフル充電したところから定電流放電させていき、残り容量と電池電圧を測定して、ルックアップテーブルを作成しました。 表示時にはこのルックアップテーブルを参照して残り容量を10%単位で表示できるようにしました。
以下に回路、ATTINY412のファーム、M5StickCのソフトと3つに分けてお伝えします。
回路設計
該当機器では電圧を高くすると電流が単純に多く流れるだけなので、内部電池推定のためには 充電端子に定電流源を接続、その両端電圧を測定すれば問題無いです。なお出力電圧は5Vを超えないようにしておくことにします。
どのくらいの電流を流すか実験してみると、実験で求めた消費電流6mAの約半分程度を流した時に計測誤差が最も小さくなりました。 但し、内部の消費電流は刻々と変わるので定電流源を繋ぐと電圧が変動する場合があります。例えば次の図のような波形です。 しかし、この最低電圧は常に内部電池電圧に一致することがわかったので、ソフトウェア的に処理することにします。
以上の事を踏まえて、回路としては次のようになりました。 これをM5Stick C Plusにつなぎます。
ここで注意するのはATTINYが5V動作するのに対して、M5StickC Plus内蔵のESP32は3.3Vで動作してるのでレベル変換が必要なことです。 今回の回路ではATTINYのTXをM5StickCのG0につなぎます。G0端子にはM5内の3.3Vへのプルアップ抵抗が繋がっていたので、測定回路側ではダイオードD1を直列に繋ぎ、 オープンドレインとすることで3.3V以上の電圧が入らないようにしました。
ATTINY412ファームウェア
以下の機能を実装しました。
定電流源の基準電圧をDACで出力
USB端子にかかる電位差を測定
VCCの正確な電圧を測定
M5stickCとの間のUART通信
M5stick側ソフト
以下の機能を実装しました。
ATTINY412と通信し、USB端子にかかっている電圧、電流を取得
画面にデータを表示
強制充電モード
実験したサンプルソースファイルはこちらに置きます。 GitHub - hnii2006/BatteryMonitor: Battery monitor for charge port
実験
まず、動作してる様子はこちらです。 残量計を接続すると、該当機器の充電表示ランプが点灯します。と、同時に残量計にパーセントが表示されます。
また、この容量表示がどの程度正しいのか、ちょっと実験してみました。
機器の出力端子に、手元にあった定電流負荷装置を繋ぎ、充電端子にはこの電池残量計を繋ぎます。
経過時間と残量表示の関係を示すと以下の様になりました。
このグラフの見方ですが、グラフの線は、残量表示の値(100%とか)が初めて現れてから最後に消えた瞬間までの時間を分で表しています。実際には最初の表示が100%なので、0分目から線が出て、表示が90%と100%の間をぱたぱた切り替わっています。 その後90%に表示が安定して2度と100%表示がなくなると100%の線が終わる、ということになります。 このグラフから、容量残量は10%の誤差が発生しますが、大体の容量を確認できました。
まとめ
今回の実験では、特定の機器の充電の様子を調べ、内部の電池電圧を測定する方法を検討し、電池の充放電カーブから大まかな残量を測定することができました。
ここで紹介した測定法は充電端子だけを利用して内部電池電圧がわかってしまう現象を利用しているのが特徴です。
今回は特定の一機種で実験を行いましたが、同様の回路構成であれば他の機器でも使うことができるはずです。 残念ながら測定時に流す電流値や電池の特性は異なるので、各自で調べて調整する必要があるはずですが、色々応用可能だと思います。
是非いろいろな機器で調べてみると面白いかと思います。