「回路系技術資料/シャットダウン回路」の編集履歴(バックアップ)一覧はこちら
回路系技術資料/シャットダウン回路 - (2010/09/27 (月) 10:19:17) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
*シャットダウン回路
LiPoの電源を監視して、自動的に電源を落とすもの。
可変抵抗で調節するので、2S~6S程度ならいけます。
(7V~24V)
プログラムを調節すれば、LiFe用にもなります。
そのままのプログラムでも電圧監視型なので、可変抵抗を調節すればLiFeも使えます。
#image(P1030088_2.jpg,width=500,title=シャットダウン回路外観)
#image(shutdown.jpg,width=500,title=回路図)
やっていること。
-まず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(shutdown.c){Cソース}
-&ref(shutdown.hex){HEXファイル}
ということで、後は実機に搭載して実験します。
*シャットダウン回路
LiPoの電源を監視して、自動的に電源を落とすもの。
可変抵抗で調節するので、2S~6S程度ならいけます。
(7V~24V)
プログラムを調節すれば、LiFe用にもなります。
そのままのプログラムでも電圧監視型なので、可変抵抗を調節すればLiFeも使えます。
#image(P1030088_2.jpg,width=500,title=シャットダウン回路外観)
#image(shutdown.jpg,width=500,title=回路図)
やっていること。
-まず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(shutdown.c){Cソース}
-&ref(shutdown.hex){HEXファイル}
プログラムにはコメントは入っていないので、ここで解説。
#highlight(){{
#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++;
}
}
}
}
}}
ということで、後は実機に搭載して実験します。
----
#comment