電子工作47 – 複数個1.2V単3ニッケル水素電池用充電器の製作
概要
今回は1.2Vの単3ニッケル水素電池1−4個の充電器を製作してみることにした。
製作時に考えていたことなど;
1) 1−4本の1.2Vのニッケル水素電池を短時間で充電したい。例えば、2000mAhの電池1本を1時間弱位で、したがって4本で4時間。
2) 全体のコントロールにピン数が少し多く、メモリの大きい16F688を使う。勿論、プログラムはPICBasic Proで作成する。
3) 一定時間が経過したら強制的にプログラムを終了させる安全タイマを備える。
4) 充電中の電池が異常過熱したら強制的にプログラムを終了させる温度センサを備える。
5) トリクル充電モードは搭載しない。
6) ACアダプタからの5V電源を電池の充電と2個のPICの駆動の両方に使う。
NOTE: 下記の回路図の充電器のソフトは逐次改良されこのHPの最後に記載されているものが最新版である。
回路
下に回路図を示す。最大4本のニッケル水素電池を充電するので電源に秋葉原のジャンクショップで見つけた5V、5AのACアダプタを使った。 PICにはI/Oピンの数が多い16F688を導入し、安全タイマ用に12F675を使った。電池への電流供給をON/OFFする目的には10Aの大きいパワートタンジスタ2SC5198を用いた。その冷却のためヒートシンクと冷却ファン(夏場用)を取り付けた。電流量はトランジスタのベースに流す電流でコントロールされる。VR=500Wを調整することによって最大で3A近くまで流せることが分かった。また、逆流防止のダイオードの容量も3Aと大きくした。トランジスタがONの充電時(4本並列負荷時)には16F688の電源ピンの電圧Vddが5.24Vより4.6−4.8Vに低下したが0.67mFのコンデンサの働きで(?)誤動作は出なかった。4個のリレーの駆動にはトランジスタアレーを用いて配線をすっきりさせた。4個のLEDでどのリレーがONになっているか分かる。温度センサは各電池ケースの下に組み込んであり、その上に乗せた電池が過熱するとその温度を検知して予め設定した温度(40°C for 夏季以外の季節)以上で充電を強制終了させる。安全タイマ12F675のピン5(GP2)は16F688のリセットピン4に接続されていて、設定時間がくるとGP2が“L”のなりリセットをかけ16F688の動作は停止する。この時点滅型LEDが点灯する。タイマは2、5、10時間のいずれかに3つのLEDを見ながらVRtのスクリューを回して設定できる。他に電源ON中、トタンジスタが通電中、充電終了時にそれぞれLEDが点灯する。16F688には未使用のI/Oピンが2本残っている。電池電圧の測定時、テスタを使った場合と使わなかった場合でリレーの動作に不都合が起こる(後者の場合、充電時に電池の入っていないケースのリレーまでONになる
)ことが分かったので、1.8MWの抵抗を入れて問題を解決した(追記:2010.10.12)。
左: 充電器と電源 ― 充電器上部に組み込んであるのは簡易放電器である。豆電球(1.5V 0.3A)とセメント抵抗(1W 5W)で構成されている。
フル充電のeneloop電池(2000mAh)を1時間位で放電できる(豆電球点灯停止で終了とする)。
右: リレーが順番に導通状態になるので各電池の電圧変化をテスタでモニタできる。テスタの写真は電池3本に1.454Vで2.52Aの電流が流れていることを示している。
充電のプロセス
1) 充電モード選択SWでモードを選ぶ。L – all at onceモード (後述の再改良版プログラムでは L – all at once+one by one)では1本から4本を同時に充電し全部がフル充電電圧に達するまで充電する。複数本を充電する場合1本に流れる電流が小さくなり電池に優しい。一方H – one by oneモードでは1本毎にフル充電電圧まで充電して行くので1本に流れる電流が大きく電池には厳しいかもしれない。充電する複数本のニッケル水素電池の電圧が互いに大きく違う場合や長期使用されていない電池の場合は最初に放電器で放電させた方が良い。なぜならL – all at onceモード場合、電圧が不揃いの電池複数本を同時に充電すると、電圧の高い電池が過充電になる可能性があるからである。そのような場合H – one by oneモードを選ぶと良い(ただし、後述の再改良版プログラムAANiMHChargerT3bT5Cm.bas (2010.10.10)でこの問題は解決した)。
2) 電池を電池ケースにセットする際は電池の側面が確実に底部の温度センサに密着するように注意を払う。
3) 安全タイマの時間を3つのLEDと電源スイッチ、それにVRtを使って設定する。フル放電の電池の数が2本の場合2時間、4本なら5時間を選択する。
4) 電源スイッチを入れる。電源ONを示す小さいLED(R)が点灯し、次いで充電中を示すLED(R)が点灯する。
5) プログラム中では繰り返し充電サイクル中に電池電圧が設定値1.49V(290)を超えたらフル充電に達したと見なす(ただし、この値も後述の改良版プログラム(2010.10.6)のAllatOnceでは過充電を避けるため1.46V(285)と少し下げた)。したがって、充電電圧がこの設定値1.49V(実験的に決めたもの)に達しうる充電池(Ni-Cd電池も含め)は全て充電可能と思われる。
6) また、電池ケースに電池が入っていない場合、また入っていても電池電圧が0.9V(176)以下の場合も電池なしと見なしスキップする。
7) 充電中のすべての電池電圧が1.49V(290)を超えると充電プロセスは終了し16F688のピン2に接続したLED(G)が点灯する。また過充電や他の理由で電池が異常過熱した場合もこのLED(G)が点灯し終了する。安全タイマが設定時間を超えた場合は点滅LED(R)が点灯し16F688の動作を強制停止させる。
8) トランジスタを通じて流れる電流の一部は熱として放散され残りが電池に充電される。この電流の設定はVR=500Wで行う。すなわち、フューズを外しテスタの端子を直列に入れ(10A)、充電中にVR=500Wのスクリューをドライバーで回して調整する。
結果など
1) 電池1本から4本まで自動的に充電できる。
2) 2つの充電モードが選択で、例えば、H – one by oneモード(超急速充電モードと言える)では電池の電圧やプランドが違う電池を混在させて充電できる。このモードで充電するとL – all at onceモードの場合に比べ電池に蓄えられるフル充電量が少ないようである(しかし、後述の再改良版プログラム(2010.10.10)のL – all at once + one by oneモードでは問題が解決された)。
3) 高容量のACアダプタ(5V, 5A、中古¥315)とトランジスタを導入したので充電電流を3A近くまで上げることが出来るようになった。
4) トランジスタのベースに流れる電流はVR=500Wで調整する。電源OFFの状態で差換えピンを抜き、テスタでBとCの間の抵抗をVR=500Wのスクリューを回して、例えば5Wに調整する。1本の電池を低電流でゆっくり充電したい場合などは下表のデータを参考にVRを適当に調整してやる。高い値のVR、例えば1KWと交換が必要かも。
5) 簡易放電器は必須アイテムかも知れない。メモリ効果を除くのに効果的と言われいる。実際、古い電池の性能が充放電を2−3回繰り返すとかなり回復することが分かった。
6) 充電中に流れる電流はフューズを外しテスタの端子を直列に入れて測定できる(一部熱となる)。また、各電池の電圧はボード上に設けた2本のピン(RA0とGND)の間の電圧をテスタで測れば分かる。刻々変化する様子がハッキリ読み取れて大変役立つ。
7) 古いNi−Cd電池も充電できた。どんなものでも出来るかどうかは不明。充電していって1.49V(後述の改良版プログラム(2010.10.6)では1.46V)に達っせずに発熱の激しいものは充電が出来ない。温度センサが働いて充電が停止することになる。
8) L – all at onceモードで、例えば4本充電の場合、フル充電された電池は充電プロセスから1個1個外れ過充電が起こらないようなアルゴリズムを考え出す必要あり(後述の改良版プログラム(2010.10.6)で実現した)。
9) 基板を含めた材料費の合計は2千円くらい。
関連する実験結果
1) 右の様な回路を使って、抵抗値Rによってどのように流れる電流値Iが変わるか測定してみた。
R |
5W |
10W |
22W |
47W |
100W |
220W |
560W |
1KW |
4.7KW |
I |
2..7A |
2.64A |
2.41A |
2.06A |
1.52A |
0.95A |
0.45A |
0.27A |
0.06A |
実験には放電済みのNiMH電池(GP Recyko+ 1.178V)を1本使用した.。
# 5W以下はテストしなかったが3Aの電流は流れそうである。
# 例えば、トリクル電流(20mA/battery)を作り出そうとすると4.7KW以上の抵抗が必要になる。
2)
電池の本数と流れる電流
|
R=5W |
R=10W |
R=22W |
1 NiMH
battery |
2.6A |
2.6A |
2.35A |
2 NiMH
batteries |
3.02A |
2.8A |
2.64A |
3 NiMH
batteries |
3.10A |
2.99A |
2.75A |
4 NiMH
batteries |
3.24A |
3.12A |
2.75A |
実験には放電済みのNiMH電池(GP Recyko+ 1.178V前後)を4本使用した.。
# 上記より明らかなように電池の本数が増すと流れる電流が増加する。
3) 流れる電流、電池電圧、電池温度の関係
上記と同じ回路で、放電済みのNiMH電池(GP Recyko+ 1.16V前後)を1本使用し、電流、電池電圧、電池温度の経時変化を60分間にわたって記録した。電流は図の電流計(テスタ)、電池電圧はその都度電源を切って測定、更に電池温度はプラスチック電池ケースの側面に温度計の超薄型サーミスタプローブを挟んで測定した。以下に、データだけを記述する。
時間 (min) |
0 |
5 |
10 |
15 |
21 |
26 |
32 |
38 |
44 |
47 |
48 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
電流 A |
2.20 |
2.59 |
2.56 |
2.55 |
2.63 |
2.58 |
2.60 |
2.59 |
2.52 |
2.53 |
2.56 |
2.55 |
2.54 |
2.53 |
2.54 |
2.54 |
2.52 |
2.53 |
2.53 |
2.54 |
2.52 |
2.52 |
電池電圧 V |
1.163 |
1.385 |
1.401 |
1.404 |
1.409 |
1.413 |
1.420 |
1.432 |
1.455 |
1.478 |
1.489 |
1.501 |
1.506 |
1.506 |
1.504 |
1.493 |
1.491 |
1.481 |
1.480 |
1.479 |
1.475 |
1.471 |
電池温度 °C |
27.3 |
32.9 |
38 |
40.6 |
43.7 |
45.3 |
46.8 |
47.7 |
48.8 |
49.8 |
50.5 |
53.1 |
55.0 |
57.7 |
60.4 |
64.3 |
66.3 |
68.1 |
69.5 |
71.0 |
71.5 |
72.0 |
備考 |
|
|
|
|
|
|
|
|
|
|
|
|
|
%1 |
%2 |
%3 |
|
|
%4 |
|
|
|
%1:頭部から液が出始める, %2:ガスも噴出し始める、 %3:ガスや液の噴出続く、%4:指で触れぬくらい熱くなる
# 電流の大きさはほぼ一定なので定電流充電と言える。
# 電池電圧は時間とともに上昇し52分前後でピークに達し、以後少しずつ下降する。これはメーカーから公表されている傾向と一致する。
# 電池温度は電池電圧がピークに達する直前から急に上昇し始め、70°Cに達する57分後あたりからものすごく熱くなり、膨張により電池の外装被膜の破損などが起こった。
# ピーク電圧に達するあたりから液が電池頭部の穴から噴出し始め、ガスもシューシューと出始めた。電池に恒久的なダメージを与えたと思われる。
# 電池がフルに充電されると、その後は流入する電流は熱になって放出されるような感じである。つまり温度が充電の程度を知る目安になるということである。
プログラム
今回のプログラムの特徴は以下のようである。
以下に示すように、充放電コントロール用16F688と外付け安全タイマ用12F675のプログラムがそれぞれ必要になる。
1)
16F688用のプログラム(充放電コントロール)
このプログラムでは充電モード選択SWで2つのモード(プログラム中の AllatOnceとOnebyOne)が選べる。
AllatOnce: このプログラムは4本の電池(電池ケースが空の場合を含めて)全てに電流を供給して充電し、その後各電池の電圧を測定する。このプロセスを全電池の電圧が設定電圧1.49Vに達するまで繰り返して実行して終了するものである。
OnebyOne: このプログラムは4本の電池(電池ケースが空の場合を含めて)1本毎に電流を供給して充電し、その後その電池の電圧を測定し、設定電圧1.49Vに達していなければまた戻って充電と電圧測定を設定電圧に達するまで繰り返す。設定電圧に達したら2本目の電池を同じように処理し、以後3本目、4本目と進んでプログラムは終了する。
'********* プログラム ************
'AANiMHChargerT3T5C.bas - 2010.10.2 Charging-mode selectable program
'Combined prog. of AANiMHChargerT3.bas and AANiMHChargerT5.bas
'16F688 with internal clock 4MHz (default)
'Software timer function installed: short 6 and long 12 hrs
'Comments: Works! No. of batteries to be charged - 1, 2, 3 or 4
'******** ピン接続 ************
'Pin 1: Vdd (5V)
'Pin 14: Vss (GND)
'Pin 2: PORTA.5: output - driving ProgramEnd LED (G)
'Pin 3: Not used
'Pin 4: PORTA.3: input - /MCLR connected to H via 10K
'Pin 5: PORTC.5: input - from Temp sensor
'Pin 6: Not used
'Pin 7: PORTC.3: output - driving Relay4
'Pin 8: PORTC.2: output - driving Relay3
'Pin 9: PORTC.1: output - driving Relay2
'Pin 10: PORTC.0: output - driving Relay1
'Pin 11: PORTA.2: output - driving Transistor
'Pin 12: PORTA.1: input - charging mode select SW H(+5V) or L(0V)
'Pin 13: PORTA.0: input (analog) - reading NiMH battery voltage
'********* プログラム本体 ************
Define ADC_BITS 10 '10-bit ADC used ‘ADCなどの初期設定
Define ADC_CLOCK 3 'Internal clock used ?
Define ADC_SAMPLEUS 50 'Sample timing
ADCON0=%10000011
'=131 (decimal) 'bit7=1(right justified),bit6=0(volt refer-Vdd),
'bit5-4=0(unimplemented),bit3-2=00(channel0-An0),
'bit1=1(starts right away),bit0=1(on operation)
'ADCON1=%00010000 'sets Fosc/8 (A/D Conversion Select bits) これ関係ないようだ
ANSEL=%00000001 'sets PORTA.0 as AN0 input (Analog input) 必須
TRISA=%00001011
TRISC=%00100000
CMCON0=7 'turns off comparator function 必須
Vin var word 'Vin - battery voltage storage (16 bits) 以下5行は10-bitのADCから読込まれる 16 bitsの記憶先の宣言
Vinb1 var word 'Vinb1 - Vin from Battery1
Vinb2 var word 'Vinb2 - Vin from Battery2
Vinb3 var word 'Vinb3 - Vin from Battery3
Vinb4 var word 'Vinb4 - Vin from Battery4
BatteryVolt var PORTA.0 ‘I/Oポートの割り付けと記憶先の宣言
ChargeModeSelect var PORTA.1
TransistorSW var PORTA.2
TempSensor var PORTC.5
RelaySW1 var PORTC.0
RelaySW2 var PORTC.1
RelaySW3 var PORTC.2
RelaySW4 var PORTC.3
ProgramEndLED var PORTA.5
RL1 var byte 'meaning Relay1
RL2 var byte
RL3 var byte
RL4 var byte
Rtotal var byte
If ChargeModeSelect=0 then AllatOnce 'Select charging mode here ここで充電モード選択SWから H or L を読込んで2つのプログラムAllatOnceとOnebyOneに分岐する
Goto OnebyOne
AllatOnce: 'Charging all 4 batteries at once AllatOnceプログラムの開始(全電池を同時に充電)
ProgramEndLED=0
High RelaySW1 '4 relays' function test 4個のリレーの動作テストを実行
Pause 1000
Low RelaySW1
High RelaySW2
Pause 1000
Low RelaySW2
High RelaySW3
Pause 1000
Low RelaySW3
High RelaySW4
Pause 1000
Low RelaySW4
Loop:
RL1=0 ‘いろんな変数の初期化
RL2=0
RL3=0
RL4=0
Rtotal=0
RelaySW1=0
RelaySW2=0
RelaySW3=0
RelaySW4=0
Pause 1000 '1 sec
If TempSensor=1 then Overheat 'Temp sesnsor check 電池が過熱しているかどうかチェック、過熱していればOverheatに飛ぶ
High RelaySW1 'Starting all 4 batteries charging 全4個のリレーをONにする
High RelaySW2
High RelaySW3
High RelaySW4
High TransistorSW ‘トランジスタをONにし、すべての電池を60秒間充電する
Pause 60000 '60 sec - charging time
Low TransistorSW ‘トランジスタをOFFにし、RelaySW1だけONに保ち他のリレーはOFFにする
Low RelaySW2 'RelaySW1 is already ON
Low RelaySW3
Low RelaySW4
Pause 10000 'Wait 10 sec for battery's voltage stabilization 電圧落ち着くまで10秒間待つ
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1024) 電池1の電圧取込み
Pause 5
Vinb1=Vin 'Store Battery1's voltage in Vinb1 取込んだ電圧をVinb1とする
If (Vinb1>290) or (Vinb1<176) then FullyCharged1 '290-1.485V, 176-0.9V for no battery 電圧Vinb1が1.49V以上か0.9V以下(電池がない場合も含む)か調べ2つのラベルに分岐
Jump1: ‘ここから電池2の電圧チェックをする
Low RelaySW1
High RelaySW2 'This is ON RelaySW2をONにする
Low RelaySW3
Low RelaySW4
Pause 2000 ‘2秒間待つ
Adcin 0, Vin ‘電池2の電圧取込み
Pause 5
Vinb2=Vin ‘取込んだ電圧をVinb2とする
If (Vinb2>290) or (Vinb2<176) then FullyCharged2 ‘電圧Vinb2が1.49V以上か0.9V以下か調べ2つのラベルに分岐
Jump2: ‘ここから電池3の電圧チェックをする
Low RelaySW1
Low RelaySW2
High RelaySW3 'This is ON
Low RelaySW4
Pause 2000
Adcin 0, Vin
Pause 5
Vinb3=Vin ‘取込んだ電圧をVinb3とする
If (Vinb3>290) or (Vinb3<176) then FullyCharged3 ‘電圧Vinb3が1.49V以上か0.9V以下か調べ2つのラベルに分岐
Jump3: ‘ここから電池4の電圧チェックをする
Low RelaySW1
Low RelaySW2
Low RelaySW3
High RelaySW4
Pause 2000
Adcin 0, Vin
Pause 5
Vinb4=Vin ‘取込んだ電圧をVinb4とする
If (Vinb4>290) or (Vinb4<176) then FullyCharged4 ‘電圧Vinb4が1.49V以上か0.9V以下か調べ2つのラベルに分岐Goto Loop
FullyCharged1: 'Battery1 fully charged or no battery existing 電池1の電圧が1.49V以上または0.9V以下(電池がない)の場合ここに飛んでくる
RL1=1 'set 1 in RL1 RL1に1をセットする。これは充電終了のためのマーカーに使う
Goto Jump1 'return to Battery2 Jump1に飛ぶ
FullyCharged2: 'Battery2 fully charged or no battery existing 電池2の電圧が1.49V以上または0.9V以下(電池がない)の場合ここに飛んでくる
RL2=1 ‘RL2に1をセットする
Goto Jump2 'return to Battery3
FullyCharged3: 'Battery2 fully charged or no battery existing 電池3の電圧が1.49V以上または0.9V以下(電池がない)の場合ここに飛んでくる
RL3=1 ‘RL3に1をセットする
Goto Jump3 'return to Battery4
FullyCharged4: 'Battery2 fully charged or no battery existing 電池4の電圧が1.49V以上または0.9V以下(電池がない)の場合ここに飛んでくる
RL4=1 ‘RL4に1をセットする
Low RelaySW4 'RelaySW4 -> OFF
Goto Total
Total:
Rtotal=RL1+RL2+RL3+RL4 'Totalizing the above 4 values RL1、RL2、RL3とRL4の合計を計算する
If Rtotal=4 then FullyCharged 'If all FullyCharged1-4 is 1, move to FullyCharged もし合計が4ならすべての電池の充電が終わったとしてFullyChargedに飛んで終了。そうでなければLoopに戻る
Goto Loop
Overheat:
ProgramEndLED=1
Low RelaySW1
Low TransistorSW
FullyCharged:
Low RelaySW1
ProgramEndLED=1
End
OnebyOne: 'Charging one battery by one battery ‘OnebyOneプログラムの開始(電池を1本づつ充電)
ProgramEndLED=0
High RelaySW1 '4 relays' function test 4個のリレーの動作テストを実行
Pause 1000
Low RelaySW1
High RelaySW2
Pause 1000
Low RelaySW2
High RelaySW3
Pause 1000
Low RelaySW3
High RelaySW4
Pause 1000
Low RelaySW4
Vinb1=200 ‘以下4行の200はダミー値、290と176の間の適当な値。例えばIf (Vinb1>290) or (Vinb1<176) then Jump11 の最初のVinb1として使用、ここをパスすると真のVinb1が取り込まれる
Vinb2=200 ‘このダミー値の設定がキーポイントだった
Vinb3=200
Vinb4=200
Loop1:
RelaySW1=0
RelaySW2=0
RelaySW3=0
RelaySW4=0
Pause 1000 '1 sec
If TempSensor=1 then Overheat1 'Temp sesnsor check 電池が過熱しているかどうかチェック
If (Vinb1>290) or (Vinb1<176) then Jump11 ‘Vinb1にダミーの200が入るので、直ぐ下の行に飛ぶことが出来る(重要!)
High RelaySW1 'Starting Battery1 charging RelaySW1だけONにし、トランジスタもONにする
High TransistorSW
Pause 30000 '30 sec - charging time 電池1を30秒間充電
Low TransistorSW
Pause 5000 'Wait 5 sec 5秒間待つ
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1024) 電池1の電圧取込み
Pause 5
Vinb1=Vin 'Store Battery1's voltage in Vinb1 取込んだ電圧をVinb1とする
Low RelaySW1 ‘RelaySW1をOFFにして0.3秒間待つ。この待ち時間を入れないと誤動作する
Pause 300
If (Vinb1>290) or (Vinb1<176) then Jump11 ‘実測した電池電圧Vinb1が1.49V以上か0.9V以下(電池なしを含む)か調べ、YesならJump11(電池2)にNoならLoop1に戻り、Yes(フル充電)になるまで繰り返す
Goto Loop1
Jump11:
If (Vinb2>290) or (Vinb2<176) then Jump21 ‘ここでも先ずVinb2にダミーの200が入るので、直ぐ下の行に飛ぶ
High RelaySW2 'Starting Battery2 charging RelaySW2だけONにし、トランジスタもONにする
High TransistorSW
Pause 30000 '30 sec - charging time電池2を30秒間充電
Low TransistorSW ‘トランジスタをOFFにして5秒間待つ
Pause 5000 'Wait 5 sec
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1024) ‘電池2の電圧取込み
Pause 5
Vinb2=Vin 'Store Battery1's voltage in Vinb2 取込んだ電圧をVinb2とする
Low RelaySW2
Pause 300
If (Vinb2>290) or (Vinb2<176) then Jump21 ‘実測した電池電圧Vinb2が1.49V以上か0.9V以下か調べ、YesならJump21(電池3)にNoならLoop1に戻り、Yesになるまで繰り返す
Goto Loop1
Jump21:
If (Vinb3>290) or (Vinb3<176) then Jump31 ‘ここでも先ずVinb3にダミーの200が入るので、直ぐ下の行に飛ぶ
High RelaySW3 'Starting Battery3 charging
High TransistorSW
Pause 30000 '30 sec - charging time
Low TransistorSW
Pause 5000 'Wait 5 sec
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1024)
Pause 5
Vinb3=Vin 'Store Battery1's voltage in Vinb3
Low RelaySW3
Pause 300
If (Vinb3>290) or (Vinb3<176) then Jump31 ‘実測した電池電圧Vinb3が1.49V以上か0.9V以下か調べ、YesならJump31(電池4)にNoならLoop1に戻り、Yesになるまで繰り返す
Goto Loop1
Jump31:
If (Vinb4>290) or (Vinb4<176) then FullyChargeds ‘ここでも先ずVinb4にダミーの200が入るので、直ぐ下の行に飛ぶ
High RelaySW4 'Starting Battery4 charging
High TransistorSW
Pause 30000 '30 sec - charging time
Low TransistorSW
Pause 5000 'Wait 5 sec
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1024)
Pause 5
Vinb4=Vin 'Store Battery1's voltage in Vinb4
Low RelaySW4
Pause 300
If (Vinb4>290) or (Vinb4<176) then FullyChargeds ‘実測した電池電圧Vinb4が1.49V以上か0.9V以下か調べ、YesならFullyChargedsに飛んで終了、NoならLoop1に戻り、Yesになるまで繰り返す
Goto Loop1
Overheat1: ‘ここに飛んでくると充電終了LED(G)が点灯しプログラムが終了する
ProgramEndLED=1
Low RelaySW1
Low TransistorSW
FullyChargeds: ‘4本目の電池がフル充電(または電池なし)でここに飛んでくると充電終了LED(G)が点灯しプログラムが終了する
Low RelaySW1
ProgramEndLED=1 ‘充電終了LED(G)をONにする
End
'******** プログラムの終了 ********
'Note:
'melabs U2 Programmer's
configurations 16F688
'FOSC – INTOSCIO; WDTE - Enable; Power-up Timer - Disable
'MCLRpin – Reset ; BODEN - Enable; Internal External Switch Over – Enable, Fail-Safe Clock Monitor – Enable, CD - Disable;Dtata EPPROM - Disable.
2)
12F675用のプログラム (外付け安全タイマ)
電源SWとON/OFFし、VRt=10Kを調節して 2,5、10時間に設定出来る。
'********* プログラム ************
'AANiMHCahrger675Timer.bas (based on 06P9VCahrger675Timer1Tr.bas) - 2010.9.23
'12F675 with internal clock 4MHz
'Safety Timer (2, 5 and 10 hours) for AANiMHCahrger
'******** ピン接続 ************
'Pin 1: Vdd (5V)
'Pin 8: Vss (GND)
'Pin 5: GPIO.2: input - grounding of Pin 4 (RA3) of 16F688 & blinking LED
'Pin 7: GPIO.0: input - from Divider for Timer adjustment
'Pin 6: GPIO.1: input - LED1 (Setup time indicator)
'Pin 4: GPIO.3: input - to 5V via 10k
'Pin 3: GPIO.4: input - LED2 (Setup time indicator)
'Pin 2: GPIO.5: input - LED3 (Setup time indicator)
'********* プログラム本体 ************
Define ADC_BITS 10 '10-bit ADC used
Define ADC_CLOCK 3 'Internal clock used ?
Define ADC_SAMPLEUS 50 'Sample timing
ADCON0=%10000011
'=131 (decimal) 'bit7=1(right justified),bit6=0(volt refer-Vdd),
'bit5-4=0(unimplemented),bit3-2=00(channel0-An0),
'bit1=1(starts right away),bit0=1(on operation)
ANSEL=%00010001 'sets Fosc/8 and GPIO.0 as ANS0 input
'bit7=0(unimplemented),bit6-4=001 (Fosc/8),
'bit3-2-1=0(Digtal I/O pins),bit0=1(Analog input)
TRISIO=%111111
CMCON=7
Vin var word 'ADC storage
TimerOut var GPIO.2 ‘16F688にリセットをかけ動作を停止させるI/Oポートの宣言
TwoHour var GPIO.1
FiveHour var GPIO.4
TenHour var GPIO.5
n var byte 'counter
TwoHour=1
FiveHour=1
TenHour=1
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1024) Vinput=0-2.5V 時間設定: VRt=10Kを調整して0−2.5VをGP0(ピン7)より入力する
Pause 5
'3 selectable timers
If Vin=<200 then Hour2 ‘200-1.02V, 300-1.54V at Vdd=5.24V GP0より読込んだVin値が200(1.02V)以下ならHour2へ飛ぶ
If (Vin>200) and (Vin=<300) then Hour5 ‘Vin値が200(1.02V)より大きく300(1.54V)以下ならHour5へ飛ぶ
If Vin>300 then Hour10 ‘Vin値が300(1.54V)以上ならHour10へ飛ぶ
Hour2: ‘2時間タイマ
Low TwoHour
High TimerOut
For n=1 to 136
Pause 60000 '60 sec
Next n
Low TimerOut ‘これが実行されると16F688にリセットをかけ動作を停止させる。同時に点滅LED(R)が点灯する
Goto Timeout
Hour5: ‘5時間タイマ
Low FiveHour
High TimerOut
For n=1 to 340
Pause 60000 '60 sec
Next n
Low TimerOut
Goto Timeout
Hour10: ‘10時間タイマ
Low TenHour
High TimerOut
For n=1 to 673
Pause 60000 '60 sec
Next n
Low TimerOut
Goto Timeout
Timeout:
End
'******** プログラムの終了 ********
'Note:
''melabs U2 Programmer's configurations - 12F675:
'FOSC - INTOSC; WDTE - Enabled; PWRTE – Disabled
'MCLR - Reset ; BODEN – Enabled; CP – Not Protected; CPD - Not Protected
改良版プログラム(2010.10.6)
16F688用のプログラム(充放電コントロールAANiMHChargerT3T5C.bas)の中には2つの分岐プログラム AllatOnceとOnebyOneが存在する。この内のAllatOnceの内容のみを変えた。具体的には;
1) 複数本の充電時に、そのうちの何本かに起こりうる過充電が防げるアルゴリズムにした。
2) フル充電設定電圧1.49V(290)を若干下げて1.46V(285)とした。実験してみて過充電になるような傾向が見られた為である。
OnebyOneの部分とタイマプログラム'AANiMHCahrger675Timer.basには変更はない。
結果など
1) 前のプログラムAANiMHChargerT3T5C.basより良い。例えば、電池4本の場合、最初は4本全部の充電から始まって、次第しだいに充電本数が減っていき、最後の1本がフル充電になると終了。つまり、フル充電に達した電池から切り離して行くので、一部の電池が過充電になることはなく電池電圧は均一になる。
2) 違ったブランドの互いに異なる電圧を持つ電池を同時に充電できる。NiMHとNi−Cd電池を混在させた同時充電も問題ないようだ。
3) Eneloop (2000mAh)1本を放電器で完全に放電した後AllatOnceモードでフル充電するのに42分かかった。同様にGP ReCyko(2050mAh)4本をフル充電するのに230分かかった。
4) 4本から充電が始まって(勿論何本からでもOK)、フル充電に達しない電池の本数が減ってきた場合当然流れる電流は増す。充電電流を2.5Aから1.0Aなどに下げてやるには、例えばトランジスタを高容量のPhotoMosリレーに代えPBPのPWMコマンドと使うとうまく行くかも知れない。ただ、3A位のPhotoMosリレーは高価で千円近くするようだ。
5) このアルゴリスムを考え出すの1週間以上かかった。ジジイには結構大変だった!
6) 使用したメカリレーの接点寿命は20万回とメーカのData Sheetに出ていた。空の電池をフル充電させるのに必要なON/OFF回数は100回以下である。
'********* プログラム ************
'AANiMHChargerT3bT5C.bas - 2010.10.6 Charging-mode selectable program
'Combined prog. of AANiMHChargerT3b.bas and AANiMHChargerT5.bas
'16F688 with internal clock 4MHz (default)
'Software timer using 12F675 installed: 2, 5 and 10 hrs
'Comments: Works! No. of batteries to be charged - 1, 2, 3 or 4
'******** ピン接続 ************
'Pin 1: Vdd (5V)
'Pin 14: Vss (GND)
'Pin 2: PORTA.5: output - driving ProgramEnd LED (G)
'Pin 3: Not used
'Pin 4: PORTA.3: input - /MCLR connected to H via 10K
'Pin 5: PORTC.5: input - from Temp sensor
'Pin 6: Not used
'Pin 7: PORTC.3: output - driving Relay4
'Pin 8: PORTC.2: output - driving Relay3
'Pin 9: PORTC.1: output - driving Relay2
'Pin 10: PORTC.0: output - driving Relay1
'Pin 11: PORTA.2: output - driving Transistor
'Pin 12: PORTA.1: input - charging mode select SW H(+5V) or L(0V)
'Pin 13: PORTA.0: input (analog) - reading NiMH battery voltage
‘********* プログラム本体 ************
Define ADC_BITS 10 '10-bit ADC used
Define ADC_CLOCK 3 'Internal clock used ?
Define ADC_SAMPLEUS 50 'Sample timing
ADCON0=%10000011
'=131 (decimal) 'bit7=1(right justified),bit6=0(volt refer-Vdd),
'bit5-4=0(unimplemented),bit3-2=00(channel0-An0),
'bit1=1(starts right away),bit0=1(on operation)
'ADCON1=%00010000 'sets Fosc/8 (A/D Conversion Select bits)
ANSEL=%00000001 'sets PORTA.0 as AN0 input (Analog input)
TRISA=%00001011
TRISC=%00100000
CMCON0=7 'turns off comparator function
Vin var word 'Vin - battery voltage storage (16 bits)
Vinb1 var word 'Vinb1 - Vin from Battery1
Vinb2 var word 'Vinb2 - Vin from Battery2
Vinb3 var word 'Vinb3 - Vin from Battery3
Vinb4 var word 'Vinb4 - Vin from Battery4
BatteryVolt var PORTA.0
ChargeModeSelect var PORTA.1
TransistorSW var PORTA.2
TempSensor var PORTC.5
RelaySW1 var PORTC.0
RelaySW2 var PORTC.1
RelaySW3 var PORTC.2
RelaySW4 var PORTC.3
ProgramEndLED var PORTA.5
if ChargeModeSelect=0 then AllatOnce 'Select charging mode here ここで充電モード選択SWから H or L を読込んで2つのプログラムAllatOnceとOnebyOneに分岐する
Goto OnebyOne
AllatOnce: 'Charging all 4 batteries at once AllatOnceプログラムの開始(全電池を同時に充電)ProgramEndLED=0
ProgramEndLED=0
High RelaySW1 '4 relays' function test 4個のリレーの動作テストを実行Pause 1000
Low RelaySW1
High RelaySW2
Pause 1000
Low RelaySW2
High RelaySW3
Pause 1000
Low RelaySW3
High RelaySW4
Pause 1000
Low RelaySW4
Vin=0 ‘以下5行の設定重要
Vinb1=0
Vinb2=0
Vinb3=0
Vinb4=0
Loop:
RelaySW1=0
RelaySW2=0
RelaySW3=0
RelaySW4=0
Pause 1000 '1 sec
if TempSensor=1 then Overheat 'Temp sesnsor check 電池が過熱しているかどうかチェック
'VoltCheckB1 電池1の電圧チェック
High RelaySW1 'This is ON
Low RelaySW2
Low RelaySW3
Low RelaySW4
Pause 3000 'Wait 3 sec for battery's voltage
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1024)
Pause 5
Vinb1=Vin 'Store Battery1's voltage in Vinb1 電池電圧をVinb1とする
Pause 200 'Wait for stabilization
'VoltCheckB2 電池1の電圧チェック
Low RelaySW1
High RelaySW2 'This is ON
Low RelaySW3
Low RelaySW4
Pause 2000
Adcin 0, Vin
Pause 5
Vinb2=Vin ‘電池電圧をVinb2とする
Pause 200
'VoltCheckB3
Low RelaySW1
Low RelaySW2
High RelaySW3
Low RelaySW4
Pause 2000
Adcin 0, Vin
Pause 5
Vinb3=Vin
Pause 200
'VoltCheckB4
Low RelaySW1
Low RelaySW2
Low RelaySW3
High RelaySW4
Pause 2000
Adcin 0, Vin
Pause 5
Vinb4=Vin
Pause 200
If (Vinb1>285) or (Vinb1<176) then SkipR1 'If this condition met, keep RelaySW1 OFF 条件がYesならRelaySW1をOFFでに保ち、NoならRelaySW1をONにする
High RelaySW1 'Starting all 4 batteries charging
SkipR1:
Pause 500 'wait for relay stabilization
If (Vinb2>285) or (Vinb2<176) then SkipR2
High RelaySW2
SkipR2:
Pause 500
If (Vinb3>285) or (Vinb3<176) then SkipR3
High RelaySW3
SkipR3:
Pause 500
If (Vinb4>285) or (Vinb4<176) then SkipR4
High RelaySW4
Goto Jump1 ‘以下4行はRelaySW4をOFFにするための記述―重要
SkipR4:
Low RelaySW4 'Necessary
Jump1:
Pause 500
'If the condition below met, Goto "FullyCharged", otherwise the charging continues. 以下の部分が最重要で、すべての電池電圧が設定値285以上か176以下(電池なし)でパス出来て終了に飛ぶ
If ((Vinb1>285) or (Vinb1<176)) and ((Vinb2>285) or (Vinb2<176)) and ((Vinb3>285)or (Vinb3<176)) and ((Vinb4>285) or (Vinb4<176)) then FullyCharged
High TransistorSW ‘以下3行で充電を30秒間行う
Pause 30000 '30 sec - charging time
Low TransistorSW
Goto Loop
Overheat:
ProgramEndLED=1
Low RelaySW1
Low TransistorSW
FullyCharged:
Low RelaySW1
ProgramEndLED=1
End
OnebyOne: 'Charging one battery by one battery OnebyOneプログラムの開始(電池を1本づつ充電) 以下の部分は既述のプログラム中のそれと同じである(参照)
ProgramEndLED=0
High RelaySW1 '4 relays' function test
Pause 1000
Low RelaySW1
High RelaySW2
Pause 1000
Low RelaySW2
High RelaySW3
Pause 1000
Low RelaySW3
High RelaySW4
Pause 1000
Low RelaySW4
Vinb1=200
Vinb2=200
Vinb3=200
Vinb4=200
Loop1:
RelaySW1=0
RelaySW2=0
RelaySW3=0
RelaySW4=0
Pause 1000 '1 sec
if TempSensor=1 then Overheat1 'Temp sesnsor check
If (Vinb1>290) or (Vinb1<176) then Jump11
High RelaySW1 'Starting Battery1 charging
High TransistorSW
Pause 30000 '30 sec - charging time
Low TransistorSW
Pause 5000 'Wait 5 sec
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1023)
Pause 5
Vinb1=Vin 'Store Battery1's voltage in Vinb1
Low RelaySW1
Pause 300
If (Vinb1>290) or (Vinb1<176) then Jump11
Goto Loop1
Jump11:
if (Vinb2>290) or (Vinb2<176) then Jump21
High RelaySW2 'Starting Battery2 charging
High TransistorSW
Pause 30000 '30 sec - charging time
Low TransistorSW
Pause 5000 'Wait 5 sec
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1023)
Pause 5
Vinb2=Vin 'Store Battery1's voltage in Vinb2
Low RelaySW2
Pause 300
If (Vinb2>290) or (Vinb2<176) then Jump21
Goto Loop1
Jump21:
if (Vinb3>290) or (Vinb3<176) then Jump31
High RelaySW3 'Starting Battery3 charging
High TransistorSW
Pause 30000 '30 sec - charging time
Low TransistorSW
Pause 5000 'Wait 5 sec
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1023)
Pause 5
Vinb3=Vin 'Store Battery1's voltage in Vinb3
Low RelaySW3
Pause 300
If (Vinb3>290) or (Vinb3<176) then Jump31
Goto Loop1
Jump31:
if (Vinb4>290) or (Vinb4<176) then FullyChargeds
High RelaySW4 'Starting Battery4 charging
High TransistorSW
Pause 30000 '30 sec - charging time
Low TransistorSW
Pause 5000 'Wait 5 sec
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1023)
Pause 5
Vinb4=Vin 'Store Battery1's voltage in Vinb4
Low RelaySW4
Pause 300
If (Vinb4>290) or (Vinb4<176) then FullyChargeds '290-1.485V, 176-0.9V for no battery
Goto Loop1
Overheat1:
ProgramEndLED=1
Low RelaySW1
Low TransistorSW
FullyChargeds:
Low RelaySW1
ProgramEndLED=1
End
'******** プログラムの終了 ********
'Note:
'melabs U2 Programmer's configurations 16F688
'FOSC – INTOSCIO; WDTE - Enable; Power-up Timer - Disable
'MCLRpin – Reset ; BODEN - Enable; Internal External Switch Over – Enable, Fail-Safe Clock Monitor – Enable, CD - Disable;Dtata EPPROM - Disable
再改良版プログラム(2010.10.10)
同じブランドの完全放電済み電池4本をAllatOnceモードで充電すると時々フル充電後の電池間電圧に時折多少の差が生ずることが分かった。そこでプログラムをAllatOnceモードで充電後に更にOnebyOneモードでも充電させるように変えた(同時に回路図の充電モード選択SWの部分も変えた)。結果は良好で充電後の電池間の電圧差は小さくなった。AllatOnceモードでの充電でほぼフル充電されているのでOnebyOneモードでの充電時間は3−5分で十分である。タイマプログラム'AANiMHCahrger675Timer.basには変更はない。
このプログラムでは、以下の部分を前の改良版プログラム(2010.10.6) AANiMHChargerT3bT5C.bas に加えただけである。
FullyCharged: ‘AllatOnceモードでの充電が終わったらここに飛んでくる
n=0
For n=1 to 10 'flashing to indicate the change of mode モードの変わり目をGreen LED点滅させて知らせる
High ProgramEndLED
Pause 250 '0.25 sec
Low ProgramEndLED
Pause 250 '0.25 sec
Next n
'********* プログラム ************
'AANiMHChargerT3bT5Cm.bas - 2010.10.10 Charging-mode selectable program
'Combined prog. of AANiMHChargerT3b.bas and AANiMHChargerT5.bas
'16F688 with internal clock 4MHz (default)
'Software timer using 12F675 installed: 2, 5 and 10 hrs
'Comments: Works! No. of batteries to be charged - 1, 2, 3 or 4
'******** ピン接続 ************
'Pin 1: Vdd (5V)
'Pin 14: Vss (GND)
'Pin 2: PORTA.5: output - driving ProgramEnd LED (G)
'Pin 3: Not used
'Pin 4: PORTA.3: input - /MCLR connected to H via 10K
'Pin 5: PORTC.5: input - from Temp sensor
'Pin 6: Not used
'Pin 7: PORTC.3: output - driving Relay4
'Pin 8: PORTC.2: output - driving Relay3
'Pin 9: PORTC.1: output - driving Relay2
'Pin 10: PORTC.0: output - driving Relay1
'Pin 11: PORTA.2: output - driving Transistor
'Pin 12: PORTA.1: input - charging mode select SW H(+5V) or L(0V)
'Pin 13: PORTA.0: input (analog) - reading NiMH battery voltage
‘********* プログラム本体 ************
Define ADC_BITS 10 '10-bit ADC used
Define ADC_CLOCK 3 'Internal clock used ?
Define ADC_SAMPLEUS 50 'Sample timing
ADCON0=%10000011
'=131 (decimal) 'bit7=1(right justified),bit6=0(volt refer-Vdd),
'bit5-4=0(unimplemented),bit3-2=00(channel0-An0),
'bit1=1(starts right away),bit0=1(on operation)
'ADCON1=%00010000 'sets Fosc/8 (A/D Conversion Select bits)
ANSEL=%00000001 'sets PORTA.0 as AN0 input (Analog input)
TRISA=%00001011
TRISC=%00100000
CMCON0=7 'turns off comparator function
Vin var word 'Vin - battery voltage storage (16 bits)
Vinb1 var word 'Vinb1 - Vin from Battery1
Vinb2 var word 'Vinb2 - Vin from Battery2
Vinb3 var word 'Vinb3 - Vin from Battery3
Vinb4 var word 'Vinb4 - Vin from Battery4
BatteryVolt var PORTA.0
ChargeModeSelect var PORTA.1
TransistorSW var PORTA.2
TempSensor var PORTC.5
RelaySW1 var PORTC.0
RelaySW2 var PORTC.1
RelaySW3 var PORTC.2
RelaySW4 var PORTC.3
ProgramEndLED var PORTA.5
if ChargeModeSelect=0 then AllatOnce 'Select charging mode here ここで充電モード選択SWから H or L を読込んで2つのプログラムAllatOnceとOnebyOneに分岐する
Goto OnebyOne
AllatOnce: 'Charging all 4 batteries at once AllatOnceプログラムの開始(全電池を同時に充電)ProgramEndLED=0
ProgramEndLED=0
High RelaySW1 '4 relays' function test 4個のリレーの動作テストを実行Pause 1000
Low RelaySW1
High RelaySW2
Pause 1000
Low RelaySW2
High RelaySW3
Pause 1000
Low RelaySW3
High RelaySW4
Pause 1000
Low RelaySW4
Vin=0 ‘以下5行の設定重要
Vinb1=0
Vinb2=0
Vinb3=0
Vinb4=0
Loop:
RelaySW1=0
RelaySW2=0
RelaySW3=0
RelaySW4=0
Pause 1000 '1 sec
if TempSensor=1 then Overheat 'Temp sesnsor check 電池が過熱しているかどうかチェック
'VoltCheckB1 電池1の電圧チェック
High RelaySW1 'This is ON
Low RelaySW2
Low RelaySW3
Low RelaySW4
Pause 3000 'Wait 3 sec for battery's voltage
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1024)
Pause 5
Vinb1=Vin 'Store Battery1's voltage in Vinb1 電池電圧をVinb1とする
Pause 200 'Wait for stabilization
'VoltCheckB2 電池1の電圧チェック
Low RelaySW1
High RelaySW2 'This is ON
Low RelaySW3
Low RelaySW4
Pause 2000
Adcin 0, Vin
Pause 5
Vinb2=Vin ‘電池電圧をVinb2とする
Pause 200
'VoltCheckB3
Low RelaySW1
Low RelaySW2
High RelaySW3
Low RelaySW4
Pause 2000
Adcin 0, Vin
Pause 5
Vinb3=Vin
Pause 200
'VoltCheckB4
Low RelaySW1
Low RelaySW2
Low RelaySW3
High RelaySW4
Pause 2000
Adcin 0, Vin
Pause 5
Vinb4=Vin
Pause 200
If (Vinb1>285) or (Vinb1<176) then SkipR1 'If this condition met, keep RelaySW1 OFF 条件がYesならRelaySW1をOFFでに保ち、NoならRelaySW1をONにする
High RelaySW1 'Starting all 4 batteries charging
SkipR1:
Pause 500 'wait for relay stabilization
If (Vinb2>285) or (Vinb2<176) then SkipR2
High RelaySW2
SkipR2:
Pause 500
If (Vinb3>285) or (Vinb3<176) then SkipR3
High RelaySW3
SkipR3:
Pause 500
If (Vinb4>285) or (Vinb4<176) then SkipR4
High RelaySW4
Goto Jump1 ‘以下4行はRelaySW4をOFFにするための記述―重要
SkipR4:
Low RelaySW4 'Necessary
Jump1:
Pause 500
'If the condition below met, Goto "FullyCharged", otherwise the charging continues. 以下の部分が最重要で、すべての電池電圧が設定値285以上か176以下(電池なし)でパス出来て終了に飛ぶ
If ((Vinb1>285) or (Vinb1<176)) and ((Vinb2>285) or (Vinb2<176)) and ((Vinb3>285)or (Vinb3<176)) and ((Vinb4>285) or (Vinb4<176)) then FullyCharged
High TransistorSW ‘以下3行で充電を30秒間行う
Pause 30000 '30 sec - charging time
Low TransistorSW
Goto Loop
Overheat:
ProgramEndLED=1
Low RelaySW1
Low TransistorSW
Low RelaySW1
ProgramEndLED=1
End
‘Move to OnebyOne charging mode to perfect charging ‘以下は上のAllatOnceモードで充電した後電池間の充電むらを除くためOnebyOneモードで仕上げ充電を行う
FullyCharged: ‘AllatOnceモードでの充電が終わったらここに飛んでくる
n=0
For n=1 to 10 'flashing to indicate the change of mode モードの変わり目をGreen LED点滅させて知らせる
High ProgramEndLED
Pause 250 '0.25 sec
Low ProgramEndLED
Pause 250 '0.25 sec
Next n
OnebyOne: 'Charging one battery by one battery OnebyOneプログラムの開始(電池を1本づつ充電) 以下の部分は既述のプログラム中のそれと同じである(参照)
ProgramEndLED=0
High RelaySW1 '4 relays' function test
Pause 1000
Low RelaySW1
High RelaySW2
Pause 1000
Low RelaySW2
High RelaySW3
Pause 1000
Low RelaySW3
High RelaySW4
Pause 1000
Low RelaySW4
Vinb1=200
Vinb2=200
Vinb3=200
Vinb4=200
Loop1:
RelaySW1=0
RelaySW2=0
RelaySW3=0
RelaySW4=0
Pause 1000 '1 sec
if TempSensor=1 then Overheat1 'Temp sesnsor check
If (Vinb1>290) or (Vinb1<176) then Jump11
High RelaySW1 'Starting Battery1 charging
High TransistorSW
Pause 30000 '30 sec - charging time
Low TransistorSW
Pause 5000 'Wait 5 sec
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1023)
Pause 5
Vinb1=Vin 'Store Battery1's voltage in Vinb1
Low RelaySW1
Pause 300
If (Vinb1>290) or (Vinb1<176) then Jump11
Goto Loop1
Jump11:
if (Vinb2>290) or (Vinb2<176) then Jump21
High RelaySW2 'Starting Battery2 charging
High TransistorSW
Pause 30000 '30 sec - charging time
Low TransistorSW
Pause 5000 'Wait 5 sec
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1023)
Pause 5
Vinb2=Vin 'Store Battery1's voltage in Vinb2
Low RelaySW2
Pause 300
If (Vinb2>290) or (Vinb2<176) then Jump21
Goto Loop1
Jump21:
if (Vinb3>290) or (Vinb3<176) then Jump31
High RelaySW3 'Starting Battery3 charging
High TransistorSW
Pause 30000 '30 sec - charging time
Low TransistorSW
Pause 5000 'Wait 5 sec
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1023)
Pause 5
Vinb3=Vin 'Store Battery1's voltage in Vinb3
Low RelaySW3
Pause 300
If (Vinb3>290) or (Vinb3<176) then Jump31
Goto Loop1
Jump31:
if (Vinb4>290) or (Vinb4<176) then FullyChargeds
High RelaySW4 'Starting Battery4 charging
High TransistorSW
Pause 30000 '30 sec - charging time
Low TransistorSW
Pause 5000 'Wait 5 sec
Adcin 0, Vin 'Read ADC ch-0 and save in Vin (range 0-1023)
Pause 5
Vinb4=Vin 'Store Battery1's voltage in Vinb4
Low RelaySW4
Pause 300
If (Vinb4>290) or (Vinb4<176) then FullyChargeds '290-1.485V, 176-0.9V for no battery
Goto Loop1
Overheat1:
ProgramEndLED=1
Low RelaySW1
Low TransistorSW
FullyChargeds:
Low RelaySW1
ProgramEndLED=1
End
'******** プログラムの終了 ********
'Note:
'melabs U2 Programmer's
configurations 16F688
'FOSC – INTOSCIO; WDTE - Enable; Power-up Timer - Disable
'MCLRpin – Reset ; BODEN - Enable; Internal External Switch Over – Enable, Fail-Safe Clock Monitor – Enable, CD - Disable;Dtata EPPROM - Disable