シャットダウン回路


LiPoの電源を監視して、自動的に電源を落とすもの。

可変抵抗で調節するので、2S~6S程度ならいけます。
(7V~24V)
プログラムを調節すれば、LiFe用にもなります。
そのままのプログラムでも電圧監視型なので、可変抵抗を調節すればLiFeも使えます。





やっていること。
  • まず3端子レギュレータ7805でマイコンの電源と基準電圧の確保
  • 電源電圧を分圧し、これをA/D変換する
  • 電源電圧が一定の電圧以下ならFETの動作を停止させる(モータの起動時を考えて、一定時間以上であれば停止するようにする)
  • 一定以上なら残りの電圧をLEDを使って表示



動作実験結果:
電源電圧12V~9V、2A
問題なく動作、3端子レギュレータの発熱が気になる程度


部品リスト

  • 基板(小さくてもよい)1枚
  • 配線(できれば太いものを)赤黒、任意
  • 3端子レギュレータ7805(ドロップ電圧が高くても問題なし)1個
  • 可変抵抗50kΩ(図面上では10kΩとなっているが、それくらいなら問題なし)1個
  • 電解コンデンサ 耐圧30V以上 容量220uF(なるべく大きいものを)1個
  • PIC12F675(A/D変換機能さえあればよい)1個
  • LED 1個
  • 抵抗1kΩ 2個
  • 抵抗10kΩ 2個
  • 2SK3163 1個
  • 2SC1815 1個

PICの開発には、PICkit2とmikroCを使用。

  • #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (shutdown.c)
  • #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (shutdown.hex)


プログラムにはコメントは入っていないので、ここで解説。

#define stop_count 100
//ここで停止時間の指定 大体1が20msくらい
 
 
#define LED GPIO.GPIO2
#define OUT GPIO.GPIO1

 
unsigned short voltage;
unsigned short count;
unsigned short time1;
unsigned short time2;
unsigned short flag;
unsigned short pres;
 
void interrupt(){
  if(INTCON.T0IF){
    INTCON.T0IF=0;
    flag|=0x01;
    if(!ADCON0.GO_DONE){
      ADCON0.GO_DONE=1;
    }
  }
  return;
}
//割り込み処理
//mikroCでは、interrupt関数が自動的にアドレス4番地に指定される
//A/D変換の開始と、時間計測を行っている
 
 
void init(){
  TRISIO=0x39;
  GPIO=0x00;
  ANSEL=0x61;
  ADCON0=0x01;
  OPTION_REG=0xD7;
  INTCON=0xE0;
  return;
}
//I/Oポートの初期設定
 
main(){
  init();
//まずは初期設定
  OUT=0;
  LED=1;
  count=0;
  pres=0;
  while(1){
    if(PIR1.ADIF){
//A/D変換の終了が確認できた場合
      PIR1.ADIF=0;
      voltage=ADRESH;
//一時データを格納
      if(voltage<=127){
//測定電圧が2.5Vを下回った場合
        time2=0;
        if(count>=stop_count){
          OUT=1;
          while(1);
//一定時間以上なら無限に終わりません
        }else{
          count++;
        }
      }else{
        count=0;
        time2=voltage-127;
      }
 
    }
 
    if(flag&0x01){
//フラグ確認
      pres++;
//プリスケーラ
      if(time2>=51){
//測定電圧が3.5V以上
        LED=1;
        time1=0;
//LED点灯
      }else if(time2==0){
//むしろ2.5V以下
        LED=0;
//LED消灯
      }else if(time1>=time2){
//点滅タイミング
        time1=0;
        LED=!LED;
      }else if(pres==0){
//点滅カウント
        time1++;
      }
    }
 
  }
}
 
 
 







ということで、後は実機に搭載して実験します。

名前:
コメント:
最終更新:2010年09月27日 10:19