主なパーツ
PIC10F322
Pch MOSFET IRLML2246TRPbF
NPN Transistor 2SC3325
回路図
参考にしたサイトはここ。
D1は動作確認用のお決まりのLチカだ。
D2は電源が入っていることを示す。
R1は参考にした回路より大きめ、R2は小さめの値にした。
正直、良く分かってない。
SWはモメンタリのタクトスイッチだ。
回路の動作は、
タクトスイッチを押すと、MOSFETがONになり電源が入る。
PICが起動してRA2をHighに設定することで、電源ONの状態を保つ。
PICのADCで、内部FVRと比較して電源電圧をチェックする。
既定の電圧を下回ったら、RA2をLowにする。
電源がOFFになる。
ざっとこんな感じだ。
とりあえず書いたメインの部分のプログラムは、たったこれだけだった。
LチカとADCの部分を除けば、たった5行だけ。
1 2 3 4 5 6 7 8 9 10 11 12 |
RA2 = 1; while(1){ unsigned char i; RA1 = 1; __delay_ms(200); RA1 = 0; __delay_ms(200); i = doad(); if(i>174){ RA2 = 0; } } |
今回も、世間的には地味な、でも自分的には目から鱗の発見があったので書く。
PIC16F1827とかのFVRは、AD変換時の基準電圧(Vref)として使うことが出来る。
ちゃんとやるなら、外にシャントレギュレータでも置いて、Vrefに入力して基準としなければならない。
ある程度の精度の基準をPICが内蔵していれば、それを入力電圧と比較して、そこそこ正確な電圧値を得ることが出来るわけだ。
電源の電圧が多少変動しても、設定したFVR値を下回らない限りは基準電圧が一定に保たれ、AD変換に支障は無い。
以上が今までの理解。
PIC10F322でも同じつもりで、よく確認もせずに、電源を半分に分圧して、アナログ入力端子に接続した。
これで、電源電圧をFVRと比較してくれているものだと、てっきり思い込んでいた。
電源電圧を少しずつ下げていっても、AD変換の値には変化が無い。
予定の電圧を下回っても電源はOFFにならない。
PICの駆動可能電圧の下限を下回るあたりから、測定値が乱れはじめて、その後PICが止まる。
PICが止まってRA2がLowになるのでやっと電源が切れる。
毎度のことながら、すぐには間違いに気づかないので、データシートを見たり、配線をチェックしたりの無駄な時間がしばらく過ぎる。
で、ようやく、データシートの以下の部分に目が留まる。
しばらく理解できずに固まる。
外部から基準電圧はつなげません。
基準電圧として使えるのはVDDだけです。
FVRはADCの入力として使えるだけで、基準電圧としては使えません。
上に書いた、PIC16F1827での感覚しかないので、「だめじゃん、使えないじゃん。」と途方に暮れる。
で、目から鱗は、そのままFVRを測定すればいい、ということ。
VDDが変化すると、基準電圧が変化することになる。
一定の電圧であるFVRの測定値も、それに引きずられて変化するわけだ。
つまり、外からの電圧変化を正確に測るのには使えないが、電源電圧の変化はとらえることが出来る。
もともと、そういう使い道なのかねえ。
今日の段階では、他に用途を思いつかない。
いずれにしても、今回の使用目的には問題なく使えるということだ。
しかも、FVRはAD変換のチャンネルに内部で接続されるので、ピンが1本節約できる。
そういうわけで、プログラムの条件文も、こんな書き方になる。
if(i>174)
電圧は下がるのに、測定値がある値を超えたら終了という風に、大小が逆になる。
FVRを2.048Vに設定し、電源電圧(=Vref)が3Vを切ったらという条件で計算すると174という値が出てくる。
2.048 ÷ 3 × 256 = 174.8
初めが3.6Vだとすると146なので、それから徐々に数字が増えていき、174を超えたらストップだ。
「PIC10F322過放電防止回路 + 18650 + ESP8266」へ続く。
ごく普通のLIR2032駆動のLEDライトに組み込んだ。
「『久しぶりにプリント基板を2枚作った。』の続き。」