バッテリー充電アラームを再三作り直す 2017年8月更新

バッテリーの充電状態チェックを、従来のV+から自前で発生する3.3vの検出に変更した

従来はバッテリー電圧を直接チェック

 これまで、バッテリー自体の電圧V+を1/2に分圧してADポートで計測していた。これだと、V+の電圧降下が進んで計測の基準電圧でもあるVccが降下し始めると計測値は信用できない。加速度センサーの電圧依存性を利用して、一応プログラムで対策したが、モヤモヤしていた。
 ところで、我がROBOZAKはBluetooth通信素子に供給するDC3.3vがあり、これを利用すればVccの電圧降下を検出でき、V+の分圧回路も不要になると気付いた。

DC 3.3vをどう利用するか

 充電アラームは、Vccが動作下限まで低下する直前に発報するのが本来である。
Vccを基準電圧にしてV+を監視していては、上記のジレンマがついて回るので、3.3vでVccの降下を監視する。
  1. 3.3vをADポートで監視するとVcc降下が判る
     基準電圧のVccが低下を始めても3.3vは暫く維持される(→A)
    この時、ADポートの計測値は、基準電圧の降下により、見かけ上3.3vより上昇するのでVccの電圧降下を判定できる。なお、3.3vの電圧降下が起きる頃にはCPUボードが動作しない電圧までVccが低下している。
    1. Vccと33vの電圧差は1.7vある。
      3.3v用に使った低損失三端子レギュレータのTA48M33Fはドロップアウト電圧0.65vなので、電圧降下の余裕は1v以上ある。 
  1. 手持ちのバッテリー5個で試してみる
    拙作のソフトizakRemoconV1.4でデータ取りした結果が表1で、定常時はAD値167か168で安定している。
    CPUのATmega128のA/D変換は線形10bitの分解能で、RoboBASICは上位8ビットを使っているようだ。そうすると、定常状態で

      3.3v:5.0v ≒ 168:256 

    となり、データとほぼ整合している。
    上記の等式に当てはめて、Vcc=4.5vに相当する187迄OKとすることにした。
  2. いざ実装の段で、3.3v電源を直接ADポートに接続するのが何となく気が引けてしまい、無線化(その1)で使用したTC4049の空き入力ピンをGND接続処理してあったので、その反転出力を使った。自作基板には出力端子を追加する余裕なく、ロボのフロントカウル内に収めるサイズ的な制約もあるので、基板の真ん中からリード線を引き出した。
    また、電源コネクタを付替えてAD(1)から5v電源を貰い3.3vを返す構成に。
 
表1
 No.  AD(1)
定常値
 AD(1)
最終値
 AD(1)
上昇期間
 1  167 250   173秒
 2  167 250  1841秒 
 3  205 250  4440秒
 4  168 253  1108秒
 5 167  248  3493秒 

定常値200超のバッテリーNo.3は寿命と思われる。因みに、この時のVcc実測値は4.1vだった。
 

プログラムを書く
バッテリーチェックは、ロボ起動から停止まで数秒おきに常時実行させる。

ロボ動作によりバッテリーが消費されVcc電圧が低下すると、4.5vまでは警告音とLED警告表示をしつつロボの動作継続、4.5vを切ると警告音とLED警告表示後、ロボ動作停止する。

変数の説明
変数NLOOPは、バッテリーチェックを数秒おきに実行するよう、メインループの繰り返し回数をカウントする。
変数i とi2 はサブルーチン等で一時的に利用する局所変数的な用途専用。

処理の説明
メインループの先頭でループ繰り返し回数をカウントし、25回に1回だけBATTERY_CHECKサブルーチンを呼び出す。(25は適当に決めてよい)

サブルーチンのBATTERY_CHECKは、
3.3v電圧をAD(1)から取得し、閾値AD_BAT_OKより大きいと、ラベルBAT_LOWにジャンプしてアラーム処理をする。
閾値以下の場合、BAT_CHK_RTNにジャンプする。

アラーム処理(BAT_LOW)は、先ほど取得したAD(1)値が閾値AD_BAT_LOWより大きいと、LED10回点滅と並行して警告音を発する。そしてプログラムを終了しする。
閾値AD_BAT_LOW以下の場合は、LED1回点滅と警告音を発した後、呼び出し元(メインループ)に復帰する。


【2017年8月追記】
当初は

 CONST AD_BAT_OK = 168

としていたが、充分に放電しないうちに充電アラームしていたらしく、バッテリーのメモリー効果と思われる現象が多発したので、現在は

 CONST AD_BAT_OK = 170

としており、今のところ好感触である。
'変数定義
DIM i AS BYTE 'use as local variable
DIM i2 AS BYTE 'use as local variable

DIM NLOOP AS BYTE 'LOOP counter
CONST AD_BAT_LOW = 187 'Vcc=4.5v
CONST AD_BAT_OK = 168 'Vcc=5.0v
 '初期処理〜メインループ

NLOOP = 0

MAIN: 'メインループの先頭
 NLOOP = NLOOP + 1
 IF NLOOP = 25 THEN
  GOSUB BATTERY_CHECK
  NLOOP = 0
 ENDIF

REMGET:
'リモコン等から操作入力を取込む処理
(省略)

action_proc:
 '操作キーに応じてアクション分岐 
 (省略)

GOTO MAIN 'メインループの末端

'-----サブルーチン群----
BATTERY_CHECK: 'Battery check

 i2 = AD(1) '3.3v voltage
 IF i2 <= AD_BAT_OK THEN GOTO          BAT_CHK_RTN

BAT_LOW:
 IF i2 > AD_BAT_LOW THEN
 'バッテリー交換アラーム後に動作停止
  FOR i = 1 TO 10
   OUT 52, 1 'LED off
   MUSIC "CA"
   DELAY 100
   OUT 52, 0 'LED on
   DELAY 100
  NEXT i

  END 'ロボ動作停止
 ENDIF

'Vcc電圧降下中, 警告音+警告表示
 OUT 52, 1 'LED off
 MUSIC "AC"
 DELAY 50
 OUT 52, 0 'LED on

BAT_CHK_RTN:
 RETURN

蛇足
今回見つかった問題外のバッテリーNo.3だが、捨てるかといえばそうでもない。寿命を迎えたバッテリーのサンプルとして実験で重宝しそうだ。

※この記事が何かのお役にたつことを願っていますが、記事内容についてのいかなる保証もしません