LCD 表示付 MPPT 充放電コントローラーの製作 (2009/03/16〜04/19)

(Last update:09/04/20)


まずは基本となる A/D 変換→ LCD 表示
の実装を通じて LCD 表示ライブラリを整備
いよいよ実機をブレッドボード上に組んでみる。
横一列ピン配置の LCD は扱い易くて GOOD
開発の様子
LCD 表示。右端の3文字は、充電モード、
負荷接続状況、鉛電池状態(本文表参照)
基板表面。
LCD の下側には部品なし
基板裏面。
SBDx2, FETx2, コンデンサx6
ハンディ・オシロを投入し、フィールドで
スイッチング特性を確認
おまけ
Ver.1 に装備されていたデバッグモード。
MPP追従をリアルタイム表示するもので、6文字目には
MPP 追従状況 ^(DUTY UP), =(DUTY 一致),
v(DUY DOWN) が表示される。
Ver.1 回路図
Ver.2 基板表面。
新たにスイッチが2つ追加される
Ver.2 LCD を取ったところ。
だいぶごちゃごちゃしてしまった・・・
Ver.2 基板裏面
Ver.2 回路図

初めに

 世の中何かと「エコブーム」のようで、2009年初頭、とうとう秋月に太陽電池充電コントローラーが並ぶようになった @o@。さすがに MPPT ではないようだが、オプションの LCD で各種ステータスがモニタできたり、最大1年分のデータロギングが可能とあって、なかなかに侮りがたい存在(お値段はちと高いけど)。

 どのみち PIC 使いなら LCD 表示は避けて通れない、と覚悟していたところでもあり、この機会に LCD 表示にチャレンジすることにした。


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

 PIC による LCD 表示はいわば「鉄板ネタ」ゆえ、ネットをちょいと検索すると山ほど情報を得ることができる。その中から、こちらのコードを参考に一部ルーチンを書き足し、16F88用の汎用 LCD 表示ライブラリを作成。LCD 表示は、ユーザーメモリー上に表示用バッファを用意し、ここに表示データを書き込んでおいて一気に LCD に転送することにした。

 また今回は A/D 変換値を 10進文字列に変換したりする場合にある程度の数値演算が必要になる。しかも、鉛電池電圧だと小数点1位ぐらいは表示しないと実用的ではないため、普通に考えるなら浮動(or固定)小数点計算が必要となる。しかし PIC での小数点計算は何かと面倒なので、例えば下2桁まで表示する場合は値を100倍して整数演算して対応している。なお、四則演算にあたってはこちらのライブラリを使用させていただいた(多謝)。

 また A/D 変換は、10bit モードで行うが、面倒なのが電流センサーからの値の処理。電流センサーは 0A 時 2.5V を基準とし、±185mV/A のリニア出力。およそ 1.5V で -5A、3.5V で +5A だから、基準電圧を 3.98V にすれば -5A時 約300カウント、0A時 約600カウント、+5A時約900カウントとなり、60カウント/Aで計算が非常に楽になる。またゲタぶんの300カウントを引いた (A/D値 -300) は最大でも 600 だから、前述のような内部100倍処理を行っても 16bit に収まるので好都合である。


仕様

 太陽電池出力を監視し、MPPT 制御を行いつつ、鉛電池電圧(小数点1桁)、充電電流(小数点2桁)、充電モード、負荷接続状況、電池状態を以下のように LCD に表示する。

充電ステータス表示
L 太陽電池出力不足 (Low) で充電停止
S 通常制御で充電中 (Simple)
M MPPT 制御で充電中 (MPPT)
P パルス(トリクル)充電中 (Pulse)
(空白) 充電停止
C クーリングのため充電停止 (Cooling)
E MPP値異常で充電停止 (Error)


電流表示
+ 鉛電池への電流量(=充電電流)
- 鉛電池から電流量(=放電電流)


負荷接続状況
- 負荷接続中
x 負荷切り離し(過放電時)


鉛電池状態
E 過放電 (Empty)
L 容量 50% 以下。要充電 (Low)
N 使用可 (Normal)
G ほぼ満充電 (Good)
F 満充電 (Full)


 これらのデータの取得〜表示は TMR0 割り込み処理で一定時間ごとに行う。

 また、鉛電池と太陽電池の公称最大出力電圧が近い場合は MPPT 制御を行うとかえって充電効率が低下する。そこで MPPT 制御を行わない単純な充電制御(鉛電池の電圧を監視するだけ)もできるようジャンパピンで動作を変更できるようにしておく。

ジャンパピン設定 充電の挙動、負荷制御 備考
<過放電電圧 (11.5V) <充電量 50% (12.5V) <再充電許可電圧 (13.5V) <満充電電圧 (13.8V)
MPPT Enable
(Open)
・MPPT

・負荷切り離し
・MPPT
・全力充電に戻す
・MPPT (1) 一度も満充電に達していなければ満充電に達するまで MPPT
(2) 満充電→通常電圧に落ちるまでは充電停止(クーリング)。
(3) それ以降はパルス(トリクル)充電

・負荷再接続
「鉛電池電圧 > 開放時太陽電池電圧」(=太陽電池出力不足)の場合は左記動作は行なわず、充電停止
MPPT Disable
(Short)
・通常充電

・負荷切り離し
・全力充電に戻す 通常充電 (1) 一度も満充電に達していなければ満充電に達するまで通常充電
(2) 満充電→通常電圧に落ちるまでは充電停止(クーリング)。
(3) それ以降はパルス(トリクル)充電

・負荷再接続


 ここらへんの動作は非常に複雑だが、要はコントローラーが動作を開始してから初めて満充電に達するまでは全力で充電し、満充電に達したら電圧がある程度落ちるまで充電停止(クーリング)する。以降は満充電付近でパルス充電(トリクル充電)を繰り返す。で、50%充電電圧を下回ったら再び満充電まで全力で充電するように再設定する、と。

 なお、スペースの都合上 LCD が実装できなくてもコントローラーの挙動を最低限把握できるよう、充電中、満充電、過放電は LED でモニタできるようにしておく。(=LCDがなくても動作可)


回路設計


 ハードウエアの仕様は、前回製作したものを流用しつつ、最大 24V, 4A まで拡張。PWM 周波数は 20KHz とし、PWM 制御用 FET は前回同様 FX20ASJ とする。FX20ASJ は既に廃品種だし、ON 抵抗が大きめ(0.13Ω)なのだが、オシロで実測する限り手持ちの FET の中では圧倒的に ton, toff が速いため今回も採用となった。もっと入手容易で低ON抵抗のもので代替できれば良いのだが、低ON抵抗品はどうしても Ciss が大きめとなってしまい、それなりに気合の入ったゲートドライブ回路を組まないといけないようなので断念。

 また今回は最大 25V まで対応するため、ゲートをトランジスタで直接 GND に落とすと FX20ASJ のソース・ゲート電圧(VGS, ±20V)を超えてしまう。そこでプルアップ抵抗(3.9K)とゲート抵抗(1K)の比を調整して VGS を超えないようにしておく。

 また今回は電流センサー ACS712 を投入。こいつのメリットは、(1) 電流ラインのどこにでも入れられる(GND を浮かせずに済む)、(2) 電流の方向がわかる、(3) 出力がリニアでオペアンプ感覚で使える、の3点。Digikey でチップ単体で購入すれば \300 とコストパフォーマンスも悪くない。

 今回使用した LCD は秋月で売っている S-10551D を採用。表示文字数は 16文字 x 1 行と少ないが、そのぶん \300 とお値打ち価格。ただし16文字は連続してマッピングされておらず、プログラム上 8文字 x 2 行扱いになるのがちと厄介。なお、信号線さえ合わせれば最もポピュラーな SC1602BSLB シリーズも繋げられるが、その場合は前述の理由により表示が 8文字 x 2行に分断されてしまうので悪しからず ^^; (液晶表示ライブラリのソース中をごく一部変更すれば対応可能)


製作中のトラブル等

 開発初期では、全ての処理を割り込みを使わずに走らせるとうまく動くが、割り込み処理中でデータサンプリング〜 LCD 表示をするとうまく動かない、という症状に見舞われ、2日間ばかり開発が停滞 ^^;

 結局、MPLAB IDE でシミュレートして、スタックの深さが直接の原因であることが判明 ^^; 管理人はコードを極力サブルーチン化するよう習慣付けているため、想定外にスタックを使い切っていたのだ。ソースを参照してもらうとわかるが、スタック数制限回避のため、時間待ちルーチンを 24bit 変数を使って同一階層でループさせたり、サブルーチン化できる処理をわざわざベタ書きしてある個所が数箇所ある。

 もっともこの「開発停滞期間」の間に、(今回の直接の原因ではなかったものの)、まだ気づいていなかった割り込み処理中の鉄則を勉強することができた。例えば、割り込み処理にはどのバンク状態で飛んでくるかわからないので、W レジスタやステータスレジスタは全バンク共通アドレスにマップされているファイルレジスタに退避するか、あるいはメインルーチン側でピンポイントで割り込みを禁止しておくとか。

 いずれにしてもメインルーチンと割り込みとの処理の切り分けには十分注意が必要。今回の場合、鉛電池電圧と電流値は割り込み処理で、太陽電池電圧はメインルーチンで取得するよう切り分けている。切り分けを徹底しておけば、割り込み処理中で退避する変数も少なくて済むし、バンク切り替えのタイミングも把握しやすくなる。

 また、正しい 10bit A/D 変換値が取得できずに小一時間ほど悩まされた。これは

(A/D変換実行後)

BANKSEL ADRESL     ; Bank 1 にして
MOVF    ADRESL,W   ; A/D 変換値下位8bit取得
MOVWF   AD_L       ; ファイルレジスタに保存(※)

BANKSEL ADRESH     ; Bank 0 に戻す
MOVF    ADRESH,W   ; A/D 変換値上位8bit取得
MOVWF   AD_H       ; ファイルレジスタに保存

 と書いていたため。(もう原因はわかりマスネ ^^; ※の前にバンク 0 に戻していないので、バンク1側のファイルレジスタ領域に値がストアされていた)

 また電流センサーだが、案外誤差が大きい。例えば 0A 時、無調整で 2.5V 出力のはずだが、実測値は 2.532V。これは数10mAの誤差に相当する。データシートによれば、ある程度は温度による誤差が出るようだが、いずれにしてもキャリブレーションは必要だろう。また電流を流さない状態で値が ±100mA 程度はフラつくので、これらの誤差はソフト側で対処した。(この結果を鑑みるに、電流値表示は小数点1桁表示の方が良いかもしれない)


Ver.2 への改良

 上記で実際に作ってみると、電流センサーの消費電流が 10mA と結構電気喰いなこともあって、全体の消費電流が 20mA 程度にまで膨らんでしまった。過放電検出後もそんなに電気を喰うようでは電池保護の点からむしろ逆効果になることも懸念される。

 まぁ、通常なら SLEEP で PIC を眠らしてはどうか、と考えるところ。しかし PIC を眠らしても 5V は供給しておく必要があり、特に今回は 20V オーバーの入力に対応するため 3端子レギュレーターがバイポーラー品となっている。この場合、3端子レギュレーター自体の消費電流も 2〜3mA あるし、鉛電池電圧検出用の抵抗分圧ラインにも常に電流が流れるわけで、ここも無視できないところ。そこでアタマを一捻りしてみた結果が Ver.2 回路図。

 要するに PIC の電源を FET を介して供給し、鉛電池が一定電圧(シャットダウン電圧)を下回ったら PIC が自らその FET を OFF して自己の電源供給を絶つ、といういわば「自殺電源」システム。これで過放電の心配はほぼゼロになるであろう^^

 ちなみに太陽電池電圧検出系にも FET のスイッチを入れておき、アナログポートからの回り込みで PIC が勝手に動作しないようにしてある。

 早速 Ver.1 基板を改造。後付回路のため、ジャンパ線がかなり飛んで見苦しくなってしまった ^^;。Ver.2 も LCD 無しでも動くが、ポート不足のため満充電 LED が撤去されたためやや挙動はわかり辛くなる。


今回の勉強の成果

 ・LCD ドライブ全般
 ・割り込み処理中のお作法
 ・バンク操作 ( BANKSEL 擬似命令の落とし穴)
 ・EEPROM 操作
 ・MPASM 各種擬似命令


今回の感想

 ・スタック数制限は予備知識として知ってはいたものの、実戦では気づくまで結構時間がかかってしまった・・・ orz。ってかスタック数少なすぎ。デバッガがなかったら永遠に気づかなかったかも(爆)

 ・電流センサーは挿入個所に制限が無く、電流方向も検出できるため、負荷接続時の放電電流も把握できて非常に便利。ただし誤差には閉口。

 ・今回もアセンブラで書いたため、LCD 表示への ASCII 変換等、いろいろと細かい処理を記述せねばならず、ソースが爆発 @o@。もっともアセンブルしてしまうとページ 0 の半分ほどしか使っていないところがアセンブラの面目躍如といったところか。


改良のアイデア等

 (1) データのロギング機能装備
 (2) PC とシリアル通信してデータを送る
 (3) 太陽電池側にも電流センサーを設けてリアルタイムで効率表示
 (4) インタラクティブなインタフェースを装備して設定電圧を変更可能に
 (5) 2行表示液晶を使って、電流や鉛電池電圧をレベルメーター風に表示
 (6) 電流センサーのキャリブレーションをスイッチ操作一発で行えるようにする。(キャリブレーション値は EEPROM に保存)

 など、いくらでも考えられる。秋月のコントローラーを対抗馬とするなら (1), (2) はいずれ手がけねばなるまい・・・ あぁ、また色々と勉強せねば・・・ orz


プログラム

 一部データを EEPROM に焼くため、EEPROM へデータを焼けるライタが必要。当方は Writer509 で焼いています。

プログラム(商用利用厳禁)Ver 2.0, 2009/04/20
MPPT4.zip


参考ホームページ、文献等 (管理者、著作者様に多謝)

MPPT の製作 今回のベースとした、プロトタイプ
花夢電科雑多猫 こちらの 16F628用 LCD 制御ライブラリを 16F88 用に修正、拡張して利用させていただきました。
趣味のホームページ 各種PIC用ライブラリが充実。
PIC を始めよう 液晶ディスプレイ(LCD)で文字を表示」にて LCD 制御方法がアセンブラで詳細に解説されています。
ELECTRONICS SHELVES こちらの「PIC マイコンの使い方とサブルーチン集 8 ビット、16ビット四則演算ルーチン」を参考にさせていただきました。
PIC マイコンでサーボを制御する PWM の動作実験が参考になります。
CCP の PWM モードでの使い方 細かいレジスタ設定などを参考にさせていただきました。
PWM をマスターする PWM 関連レジスタの設定値計算式がとても便利。
電子回路で遊ぼう こちらの「トランジスタ回路入門」と「DC-DC コンバーター設計入門」は、これほど判りやすい記事は市販本を含めて見たことがありません。回路設計初心者必読。トランジスタや FET の高速スイッチング技術がわかりやすく書かれています。
トランジスタ技術 2005年9月号 特集「太陽電池応用製作への誘い」 MPPT 電圧追従法、コントローラー回路を参考にしました。

 [電子工作のページへ]