PIC12F675版 12V鉛電池・充放電コントローラー (2007/9/11〜9/16)

(Last update:09/04/13)


まずはブレッドボードと
評価基板で動作確認。
この後、うっかり過電圧を入力し、
PIC が昇天(爆)
ほぼ完成品
左半分は電圧表示部
基板裏
PIC 部
バッテリボックスへ組み込み
青 LED でチャージ状態をモニタリング
回路図
おまけ:
自己点滅 LED の消費電流調査の様子
(2.5Hz、デューティー比 1:1、定格2V の模様)
消灯時はほとんど電気を食わないことが
確認できたので採用

きっかけ

 ソーラーパネルで鉛電池を充電する際の過充電を防ぐため、これまで何種類かオペアンプを利用した過充電防止回路を作成したが、使い勝手がイマイチだったので、A/D 変換機能の勉強も兼ねて PIC で充放電コントローラーを作ってみることにした。


プログラミングのポイント

 まずはソフトウエアのコンセプト。せっかくマイコンを使うのだから、多少は複雑な処理を行いたいところ。とはいっても、A/D 変換で電池の電圧を読み取り、満充電電圧、過放電電圧と比較して処理を行うことに変わりは無い。本来、鉛電池の充電は定電圧、定電流が基本であり、電圧を監視しながら PWM 制御でもして電流をコントロールするのが本筋なのだが、管理人はまだそこまでスキルが無いのでこれは今後の課題として取っておくことにして(爆)、以下の仕様とする。

 (1) PIC が起動してから、満充電電圧に達するまで通常充電
 (2) 満充電電圧に達したら充電を停止。すると鉛電池電圧が降下。
 (3) そのまま再充電許可電圧に達するまでは充電停止を継続。
 (4) 再充電許可電圧を下回ったら充電再開。鉛電池電圧が再び上昇。
 (5) 再充電許可電圧を上回ったら充電再開。
 (6) 過放電電圧を下回ったら負荷を切り離す。以降、過放電電圧を上回った状態でリセットスイッチが押されるまで警告 LED を点滅。充電は上記充電動作を継続

 充電の結構動作が文章で書くと結構ややこしいのだが、要は電源が ON したら満充電に達するまで全力で充電(笑)し、その後はチビチビと満充電状態をキープする、と思えばよい。プログラムも若干複雑になるが、これぐらいやらないとオペアンプを使った単純なコントローラーと何ら変わらないので(汗)、頑張って実装してみる。

 なお、(6) に関しては、わざわざマニュアルでリセットスイッチを押すのは面倒、と思われるかもしれない。しかし単純に電池電圧だけを監視して放電を再開させると、負荷が重たい場合に極めて短時間に、過放電検出 → 負荷切り離し → 電圧回復 → 負荷接続再開 → 再び電圧低下 → 過放電検出 (以下繰り返し) となって発振様の動作を起こすので、これを防ぐためにわざとこうしてある。以前リレーとオペアンプを使った過放電保護回路を作成した時にこの症状が発生し、リレーが「カチカチカチカチカチ」と激しく音を立てておおいにビビった経験を踏まえた上での仕様である ^^;。また、運用者に過放電があったことを明示的に知らせる意図もある。

 もちろん、十分に電圧が上昇(例えば再充電許可電圧や満充電電圧)してからであれば、負荷の接続を自動復帰させても発振様動作は起こさないだろうから、全自動運用(例えば太陽電池も負荷も繋ぎっぱなしでサイクル運用)したい場合は適宜ソースを修正する方向で。

 なお、PIC12F675 は 10bit の A/D コンバータを内蔵しているが、今回は (1) 精度がそれほど必要ではない、(2) データ処理の容易さ、から上位 8bit で処理を行うことにする。また A/D 変換は、勉強も兼ねて SLEEP モードで A/D 変換という荒業 (?) を使ってみる。本来はノイズ対策に使うものらしいが、今回はむしろ省電力に貢献してくれるかも、という期待から採用。


回路設計


(1) PIC 部

 使用するポートは、

・電圧検出にアナログ 1 ポート (AN1)
・充電制御にデジタル 1 ポート (GP0)
・放電制御にデジタル 1 ポート (GP2)
・リセットスイッチ入力にデジタル 1 ポート (GP3)
・過放電検出時の警告表示にデジタル 1 ポート (GP4)

 と合計 5 ポート。内部発振モードを使えばポート数は余裕でクリアできるが、今回は消費電力を抑えたいので外部 RC 発振 (クロック 1KHz) とし、GP4 を使用可能な RCIO モードとした。

 電圧検出部分は充電ラインの電圧(=電池電圧)を 1/4 に分圧して AN1 ポートに与えることにする(最終的には 10K VR で電圧を調整)。

 また省電力のため、

 ・3端子レギュレーターは自己消費 10μA の CMOS 品を使用
 ・リレーは電気を喰い過ぎるので、制御にはパワー MOS FET を使う。

等も配慮した。もちろん電源電圧を下げるのも省電力に有効なのだが、今回は手持ちのパワー MOS FET のスレッショルド電圧の関係で電源電圧は 5V とした。もっとスレッショルド電圧が低い FET を使って 3.3V 程度で動かせればより電池に優しくなる・・・筈。

 また今回の回路では PIC 部を OFF にしても、(当然過充電防止機能は働かないが)充電自体は可能にしておく。FET を制御するトランジスタのベース電流に 常時 10数μA 流れるが、これは太陽電池からの出力で賄えるので無視してよいだろう。

 また過放電警告用の LED は、最初は通常の赤 LED をソフトウエアで点滅していたのだが、結局、秋月で売られているウォータークリア型自己点滅赤 LED を使用することにした。オシロで確認してみたところ、消灯時はほとんど電気を食わず、また 2.5mA も流せば十分な輝度が得られることから、点滅は LED 側に任せた方がソフトウエア側の手間も省け、キー応答も速くなるので便利 ^^;


(2) 電圧表示部

 基本は以前製作したものと同じ。レベルメーター用IC TA7612AP を使って電圧を 10 段階で表示する。回路はほとんどデータシート通りで、表示は、赤2ドット→至急充電必要、橙色2ドット→要充電、緑色5ドット→正常範囲、最後の緑1ドット→満充電、を示すよう分圧比を設定することに。

 VrefMax はシャントレギュレータ電圧 (2.54V) とする。また VrefMin 側の抵抗値は、電圧測定範囲 10〜15V にするなら 18KΩ、11V〜14V の範囲にするなら 33KΩ をつないで、最終的に 500K の VR で入力電圧が LED 表示と合うよう調整すればよい。


製作上の注意点:

 左記回路図の場合の最大入力電圧は 20V である点に注意。今回の回路は PIC の電源が入っていなくても太陽電池パネルが一定電圧以上を出力すると充電ラインの FET は ON になるよう設計してある。したがって鉛電池を接続せずに太陽電池だけを繋いだ場合、制御回路自体は電気をほとんど食わないために太陽電池電圧が降下せず、開放時電圧がほぼそのまま充電ラインに出ることになる。

 この場合の問題点は、

 (a) CMOS 3端子レギュレーター (XC6202P502TB) の絶対最大定格 20V を超える → 3端子レギュレーター破壊 → PIC 昇天や動作不良
 (b) PIC の AN1 ポートには充電ラインの1 /4 の電圧が加わる → ポートに電源電圧を超える電圧がかかる → (PIC の内部保護ダイオードによりある程度は耐えるものの)最悪の場合 PIC 昇天
 (c) VGSS = 20V だと場合によっては FET 破壊するか、保護ダイオード入りの場合は FET がラッチする
 (d) レベルメーター IC TA7612AP の電源絶対最大定格が 20V


 などが挙げられる。

 (a) に関しては最大定格が 30V の 78L05 に交換することで解決でき、(b) に関しては抵抗による分圧比を 1/5 にして(10Kの VR を絞り込めばおよそ 1/5 になる)、PIC プログラム中の定数を変更することで解決できる。また (c) に関しては FET のゲートとデジトラの C の間に 330KΩ〜500KΩ 程度の抵抗を追加することで解決できる。しかし (d) に関しては若干回路を工夫しなければならない。

 ハードウエアを変更しないで対処する方法としては、コントローラー基板に必ず先に鉛電池を接続し、その後にソーラーパネルを接続する方法が挙げられる(鉛電池に充電電流が流れることで太陽電池の出力電圧が降下し充電ラインが 20V 以上になることがないため)。鉛電池の容量に比べれば制御回路の消費電流は微々たるものなので、一度電池を繋いだら電源は入れ放しにしておくと良いだろう。もっとも、このような運用上の回避ではいずれヒューマンエラーが起きるだろうから、可能な限りハードウエア変更で対処しておくべきである。

 また FET の定格にも注意が必要。データシートで最大ドレイン電流 (太陽電池パネルの出力電流より十分に余裕があること)、ON抵抗、スレッショルド電圧(5Vで確実に ON 抵抗が下がること)に留意が必要。

 また大出力の太陽電池を繋ぐ場合は数Aの電流が流れることを想定し、充電ラインやグランドラインを十分太くしてインピーダンスを下げるとともに FET の ON抵抗から内部損失を見積もり、場合によっては FET に放熱板を付ける等の発熱対策を施す必要があろう。また SBD にしても高電流品への交換、電流量によっては発熱対策を考える必要もある。


実戦投入

 以前製作したバッテリーボックス ver2 のコントローラー部と入れ替えて使用。消費電流は通常時で 1.2mA、過放電警告 LED 点灯時でも 4mA 程度と圧倒的に消費電力が少なくなり、かなり安心して使用できるようになった。

 充電状態は高輝度のチップ LED (青)で表示しているが、満充電状態に達すると定期的に LED が点いたり消えたりして、光モノ好きとしては眺めているとなかなか楽しいものがある ^^;


今回の失敗、教訓など

 実験中、ついアナログ入力ポートに電源電圧以上の 8V を入れてしまい、PIC を1つ焼き殺してしまった(爆)。ヒューマンエラーは必ず起きるものと心得て、VDD より高い電圧がかかる可能性のあるポートにはクリッピングダイオードを入れておくべきであった。

 また PIC12F675 では A/D 変換以外にコンパレーター機能などもあって、思わぬところで設定が必要。例えば今回は GP0 ポートをデジタルポートで使用しているのだが、コンパレーター部の電源をちゃんと OFF にしておかないと GP3 や GP4 ポートの影響を受けて挙動不審になる場合が多々あり、原因に気づくまで若干手間取ってしまった ^^;

 ところで、今回プログラミングをしてみての PIC に対する感想。

・コンペア命令もないのかっ! (所詮は RISC ライク、といってしまえばそれまでだが)
・SUBLW の引数や引き算におけるキャリーフラグの挙動が他の CPU と逆だぞっ! @o@
・毎度ながら条件分岐が非常にわかりづらい(悲鳴)

 まぁ、いつもながらの感想ではあるが、CISC な 68000 の機械語に慣れていると戸惑うことしきり。今回のこんな簡単なプログラムでも条件分岐のロジックを間違えて1時間ほどデバッグを余儀なくされた。もっともこれらの PIC 特有の悪質なトラップ (?) に悩まされるのは先人達も同じのようで、こういうサイトこういうサイトがあるのがせめてもの救いか ^^; (作成者様に感謝)

 <今回の勉強の成果>

  ・RCIO のクロックモード
  ・A/D 変換
  ・ジュンフロン線による配線
  ・クリッピングダイオードの重要性 ^^;


改良のアイデア等

・負荷側の FET を N チャネルにしてデジトラを1つ省略。
・自己点滅 LED を GP2 にぶら下げてポートを節約し、LP モードでより省電力に
・上記で空いたポートで一定時間毎に電圧表示部の電源を ON/OFF させて電圧をモニタする
・過放電停止前の「予告」 LED (もしくは点滅処理ルーチン)追加
・過放電を検出したらスリープモードにしてキーが押されるまで徹底して省電力で待機
・PIC 部を OFF にしても(当然過放電検出はできないが)とりあえず負荷は接続できるようにしておく(=充電側と同じ回路にしておく)
・PWM 制御で充電する
・検出電圧の各定数を手持ちのバッテリに合わせて変更する
・よりピン数の多い PIC で LCD に電圧をリアルタイム表示
・インタラクティブに定数変更を可能に

 など様々な改良案が考えられる。


2007/10/18 追記: 一部パルス充電方式に改良してみる

 当初は満充電電圧と再充電許可電圧とで単純に充電 ON/OFF を行っていたのだが、実際に運用してみると満充電近くでは案外充電効率が悪い(?)ことがわかった。具体的には、

 250mA 程度で充電 → 満充電電圧 (14.5V) まで上昇(1秒) → 充電停止 → 電圧 14.2V まで降下(3秒) → に戻る

の「4秒サイクル」を繰り返している模様。もちろん過充電を防ぐという機能は立派に果たしているのだが、なるべくなら目一杯充電したくなるのが人情というもの。先にも書いたが、本来鉛電池は満充電近くではトリクル充電を行うのが定石。そのためには電圧を監視し、PWM 制御で適宜充電電流を調整するのがよいのだが、残念ながらまだ管理人はまだそこまのスキルを有していない(爆)。

 そこで今回は、満充電付近の電圧に達したらソフトウエア処理で一定時間固定幅のパルスを発生する、という仕様でお茶を濁すことにした。

 ちなみに巷では「鉛電池にパルス充電」というとサルフェーション除去(=バッテリ復活)方向で盛り上がっているようだが、当然そんなものは志向していないので悪しからず。パルス充電といっても周期は悠長で、あくまでも本格的な PWM 充電までの経過措置。(もっとも、この仕様でも正常電圧時デューティー比 100%、満充電付近デューティー比 50%、満充電時デューティー比 0% の立派な「3段階 PWM 制御」ではあるのだが ^^; )

 この改良により、動作仕様は以下の通りとなる。(赤字が変更部分)

 (1) PIC が起動してから、満充電電圧に達するまで通常充電
 (2) 満充電電圧に達したら充電を停止。すると鉛電池電圧が降下。
 (3) そのまま再充電許可電圧に達するまでは充電停止を継続。
 (4) 再充電許可電圧を下回ったら充電再開。鉛電池電圧が再び上昇。
 (5) 再充電許可電圧を上回ったらパルス充電で充電再開。
 (6) 過放電電圧を下回ったら負荷を切り離す。以降、過放電電圧を上回った状態でリセットスイッチが押されるまで警告 LED を点滅。充電は上記充電動作を継続

 なお、使用している鉛電池のデータシートによると、通常充電電圧 14.4V 〜 15V、フローティング充電電圧 13.5V 〜 13.8V とあるので、電圧に関する定数を若干見直してみた。まただいぶ機能を細分化してサブルーチン化を進めたので、案外ソースが膨らんでしまった。

プログラム Ver 1.7, 2009/04/13
ソースファイル HEXファイル
charge_controler.asm charge_controler.HEX


 2007/10/18 より運用を開始。ただ、いずれは本格的な PWM 制御に改良するつもりである。なお、「MAX723 使えよ」とか「太陽電池使うなら MPPT だろ」なんて突っ込みは無し方向でどうかひとつ。(MPPT については大変興味があるので、PWM とからめて攻略予定)

 それにしても自由にファームウエアを自由に書き換えられるって素晴らしいデスネ ^^;


2007/11/18 追記:

 公約 (?) どおり、MPPT 充放電コントローラーを製作。詳細はこちら


2008/01/13 追記:

 本プログラムを基に、充電専用コントローラーを製作。電源を太陽電池側から取るので、電池過放電の心配が無いのがウリ。詳細はこちら


2008/05/10 追記:

 オペアンプを使った充電コントローラーを製作。詳細はこちら


2009/01/14 追記:

 パルス充電対応バージョンのソースファイル、HEX ファイルのリンク先が間違っていたのを修正しました。

 どうやら 2008/11/20 に HP をアップデートした際にリンク先を間違えてしまったようです。2008/11/20 〜 2009/1/14 までにソースファイル、HEX ファイルをダウンロードしたのだがうまく動作しない、とお悩みのかたがいらっしゃいましたら、大変申し訳ありませんが上記より再度ダウンロードしてお試し下さい。

 また回路図中の不明瞭な部分を加筆・修正しました(回路自体の変更はありません)。


2009/01/15 追記:

 これと同じものを製作されている「明法高校・科学部」さんからリンク許可を頂きました。
 ホームページはこちらソーラーパネル関連のページで作品が紹介されています。


2009/03/26 追記:

 明法高校・科学部さんが製作に苦戦されているようなので、動作検証用に2号機を製作してみた。

 仕様を最大入力 25V、5A に拡張するため、以下の修正を行っている。

 (1) 鉛電池の 1/5 の電圧を PIC に入力するため、電圧検出部を、120K, 33K. 10K VR → 120K, 27K, 50K VR に変更
 (2) FET を Id = -11A の FDS4675 に変更
 (3) SBD を 35V 5A の HRF503A に変更
 (4) 3端子レギュレーターを 78L05 に変更
 (5) FET の G と C1815 の C の間に抵抗(390KΩ)追加

 2号機は FET の実装面積が小さいため、だいぶ小型に仕上がった。

基板表 FET x2、SBD、チップセラコン x 2 は
基板裏側に実装。
5A 流すことを考えて充電ラインは
ハンダを盛大に盛っている ^^;
25V対応版回路図



 [電子工作のページへ]