PICマイコンは電池で動かすことも多いのですが、電源電圧が低下したときに、誤動作が起きる前に警告できないかと思ってためしてみました。
使っていたのは12F1822、このデータシートを眺めても、VDD電圧を直接得る方法はなさそうなのですが、ADコンバーターの記述の中で内臓の基準電圧があることや、これを入力チャンネル選べることが分かりました。
これを使って、外付け部品は一切なしで、しかもIOピンも消費せずにVDDが測れそうな気がしたので実験してみました。
//100分の1V単位で電圧を返す。
//VDDを基準としてFVRの2.048VをAD変換する。
//2.048:VDD = AD値:1023 より、VDD = 2.048*1023/AD値
unsigned short VDD_get(void){
ADCON0bits.GO_nDONE=1;
while(ADCON0bits.GO_nDONE==0);
return 209510 / ADRES;
}
int main(int argc, char** argv) {
OSCCON = 0b01011010 ; // 内部クロックは1MHzとする
FVRCON = 0b10000010 ; // FVR 2.048V
ADCON0 = 0b01111101 ; // ADCのチャンネルをFVRに設定
ADCON1 = 0b10000000 ; // ADCの基準電圧をVDDに、データは右詰め
unsigned short v;
while(1){
v= VDD_get();
__delay_ms(500);
}
}
このようにしたところ、無事VDDが測定できました。0.1V単位でテスターの値とよく一致します。ただ、定期的に0.1V程度低い値を出力することがあったのですが、複数回測定して平均すれば問題ない範囲だと。