ヨットは数週間行かない場合があるので、少ない電力でも少々気になる。
そこで、PIC-12F675のアナログでCDSと抵抗で分圧を読み取り昼間のみ
動作するようにした。
夜間は10mA以下 昼間は55mAとした。 昼間はソーラーチャージャーが動作するので
50mA程度なら問題ないと判断した。ちなみに、
曇りの日は動作しないように
微調整した。

#include <pic.h>
#include <htc.h> // delay用に必要

#define _XTAL_FREQ 4000000 // delay用に必要(クロック4MHzを指定)

// メモリを保護しない(UNPROTECT):外部リセット信号は使用せずにデジタル入力(GP3)ピンとする(MCLRDIS)
// 電源電圧降下常時監視機能ON(BOREN):電源ONから72ms後にプログラムを開始する(PWRTEN)
// ウオッチドックタイマ無し:内部クロック4MHz使用する(INTIO)
__CONFIG(UNPROTECT & MCLRDIS & BOREN & PWRTEN & WDTDIS & INTIO) ;


// アナログ値の入力処理
unsigned int adconv()
{
unsigned int temp;

GODONE = 1 ; // PICにアナログ値読取り開始を指示
while(GODONE) ; // PICが読取り完了するまで待つ
temp = ADRESH ; // PICは読取った値をADRESHとADRESLのレジスターにセットする
temp = ( temp << 8 ) | ADRESL ; // 10ビットの分解能力です

return temp ; //この値を戻す事になる。
}
// メインの処理
void main()
{
unsigned int num ; //符号なし整数で INTの倍数を扱える(10進数の0〜1023を扱うため)
CMCON = 0x07 ; // コンパレータは使用しない
ANSEL = 0b00011000 ; // アナログはAN3を使用し、残りをすべてデジタルI/Oに割当
TRISIO = 0b00010000 ; // AN3だけ入力その他のピンは出力に割当てる
GPIO = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
ADCON0 = 0b10001101 ; // アナログ変換情報設定0b1000 11 01 11はAN3 00は AN0
__delay_us(20) ; // アナログ変換情報が設定されるまでとりあえず待つ
while (1)
{
num = adconv() ; // 3番ピン(AN3)から電圧値を読み込む
GPIO0=0;
while(num>300) //何もしないループ
{
GPIO0=0;
num = adconv() ;
}
//asm("NOP"); //アッセンブラの命令の入れ方 参考
//asm("sleep"); //参考

while ( num<300) //パルス発生ループ
{
__delay_us(50); //SWの場合チャタリング防止 括弧内数値で出力時間を設定 変数不可
GPIO5=1;
__delay_us(10);
GPIO5=0;
num = adconv() ;//お休み時間に電圧を測る
GPIO0=1;

}
}
}



以下は参考まで MPLAB−IDE HI-TECH 9.8 C言語用



下のプログラムは適当に、とりあえず書いたモノであまり参考に成りませんが、動きます。
結局アナログ電圧測定は安定性が悪いので、デジタル L & H で判断し
夜は  sleep() にしました。 一台しか作らなかったので ソースはどっかへ消え失せました。
ごめんなさい。
 復帰はピン割り込みです

戻る

船用バッテリー延命機

バッテリ健康診断の方法