少し前まで秋月電子で販売されていたHHR-P104の過放電防止を行いたく、手持ちのマイコンでどうにかできないかと調べていたところ、CH32V003にPVDという機能が搭載されていることに気付いた。今回使用してみた知見をまとめておく。
※正確な情報はデータシートやリファレンスマニュアルを参照してください。
PVDとは?
PVDとはProgrammable Voltage Detector(プログラマブル電圧検出器)の略で、VDDを設定した閾値と比較する機能である。この機能により、電圧が閾値を下回ったり上回ったりした際に割り込みを発生させることができる。また、Standbyモードからこの割り込みで復帰することも可能である。
PLS[2:0] | 立ち上がりエッジ | 立ち下がりエッジ |
---|---|---|
000 | 2.85V | 2.7V |
001 | 3.05V | 2.9V |
010 | 3.3V | 3.15V |
011 | 3.5V | 3.3V |
100 | 3.7V | 3.5V |
101 | 3.9V | 3.7V |
110 | 4.1V | 3.9V |
111 | 4.4V | 4.2V |
データシートから抜粋してまとめると、上記のパターンが設定可能である。
HHR-P104は3セルのNi-MH電池であり、1セルの終止電圧を0.9Vとすると、2.7V未満を過放電状態と定義できる。つまり、PLS=000の立ち下がりエッジを検出すればよい。また、過放電からの復帰は同じ設定のままだと2.85Vとなるが、設定を変更すれば他の値も使用可能である。
今回は2.7Vを下回ったら負荷を切り離し、その後3.3Vを上回ったら復旧するようプログラムを組んだ。なお、初回起動時はPLS=000に設定するため、2.85V以上あれば負荷と接続される。この辺りはプログラムの組み方次第である。
PVDはStandbyモードで動作可能なため、通常はStandbyモードにしておき、閾値の電圧変化を検出したら通常モードに切り替えてGPIO制御(P-MOSFETで負荷の接続・切り離し)を行い、すぐにStandbyモードに戻るという流れにした。これにより消費電力を最小限に抑えられる。
動作確認
負荷への接続・切り離しを担うP-MOSFETにはAO3415Aを使用した。
XHコネクタを用いて、左側をバッテリー入力、右側を負荷への出力とした。

なお、ソースコードはこちら:
https://gist.github.com/tako0910/e46a67abd995a109d0668c0d83bd6a38
HHR-P104の代わりにALIENTEKの安定化電源DP100を用いて、入力電圧を変化させて動作確認を行った。
カットオフ電圧

2.68Vでカットオフされた。想定は2.7V以下なので、ほぼ正確と言える。
復旧電圧

カットオフ後、電圧を徐々に上昇させると3.28Vで復旧した。想定は3.3Vなので、こちらもほぼ正確である。
前述の通り、初回起動時やリセット時には2.85V以上あれば負荷に電力供給される。初回起動時の動作は測定し忘れてしまったので、気が向いたら追記する。
動作電流

Standbyモード時の電流を計測したところ、0.011mA(11μA)となった。CH32V003のStandby消費電力が9μA、P-MOSFETへのリーク電流が1μA、PVD動作電流が1μAとすれば妥当な数値と思われる。
注意点
負荷としてLEDを用いた検証では問題なく動作したが、DCファンを用いたところ、バッテリーに十分な充電がされていても起動しなくなってしまった。これはDCファンの突入電流により電圧が一瞬下がることが原因と思われ、適当なコンデンサを入力側に追加したところ改善できた。
まとめ
CH32V003のPVD機能を使った過放電防止回路を実装してみた結果、低コスト・低消費電力で柔軟な電圧設定が可能な電圧監視システムを構築できることが分かった。