Batterilader 9.6v nimh

Batterilader projekt til opladning af 8 x 1.2v celler batteripakke styret af arduino

Diagram

 

Arduino kode

 int batsense = 0; //Indgang til batteri måling
 int powerout = 5; //lade regulering 0 fuld 5 off
 int lader = 4;  //indikator at der lades
 int ladeslut = 6; //indikator at ladning er slut
 int ladetimeout = 18000; // hvor mange sekunder må der max lades
 int tidgaaet = 0;  //hvor langtid har vi ladet
 int batvolt = 0; // Hvad er spændingen:
 int batvolt2 =0; //mellemregnings tal
 int batvoltlast = 0; // Hvad var spændingen sidst:
 int batvoltcount = 0; // hvor mange gange er den ikke steget:
 int maxbatvolt = 630; //maximal spænding på batterierne
 int minbatvolt = 328; //minimum spænding på batterierne
 int timeoutstop = 0; // flag for max tid for ladning
 int voltstop = 0; //Flag for max splænding tilladt
 int fuld = 0; // flag for normal opladning slut
 int tiddelay = 1000; // 1 sek
 int stabilbat = 10; //hvor mange sekunder skal batterispændinge være stabil eller faldende
 float batterivoltfaktor = 0.0233463035;
 int debugstate = 0;
 int deltaller = 0;
 int akkuvolt = 0;
 void setup() {
   // put your setup code here, to run once:
   pinMode(powerout, OUTPUT);
   pinMode(lader, OUTPUT);
   pinMode(ladeslut, OUTPUT);
   Serial.begin(9600);
   digitalWrite(powerout, HIGH);
   digitalWrite(lader, LOW);
   digitalWrite(ladeslut, LOW);
   analogReference(INTERNAL);
   delay(3000);
 }
 void loop() {
   batvolt = analogRead(batsense);
   if (debugstate == 1) {
     Serial.println(batvolt);
   }
 while (batvolt < 100) { //blink indtil der tilsluttes et batteri
     batvolt = analogRead(batsense);
     digitalWrite(lader, LOW);
     delay(1000);
     digitalWrite(ladeslut, HIGH);
     delay(2);
     digitalWrite(ladeslut, LOW);
     fuld = 0;
     timeoutstop = 0;
     voltstop = 0;
     tidgaaet = 0;
     batvoltcount = 0;
     if (debugstate == 1) {
       Serial.println(batvolt);
     }
   }
   if ((timeoutstop == 0) and (voltstop == 0) and (fuld == 0)) { // alt ok start ladning
     digitalWrite(powerout, LOW);
     digitalWrite(lader, HIGH);
     digitalWrite(ladeslut, LOW);
   }
   akkuvolt += batvolt;
   deltaller += 1;
 if (deltaller == 10) {
     batvolt2 = akkuvolt / 10;
     deltaller = 0;
     akkuvolt=0;
     Serial.println(batvolt2);
     Serial.println(batvoltcount+480);
 if (batvolt2 > batvoltlast) {   batvoltcount = 0; } else {   if (batvolt2 <= batvoltlast) {     batvoltcount += 1;   } } batvoltlast = batvolt2;
 }
   if (batvoltcount >= stabilbat) { // har spændinge være stabil eller faldende i 10 minutter, må vi være færdige
     fuld = 1;
     if (debugstate == 1) {
       Serial.println("Ladning er slut");
     }
     digitalWrite(powerout, HIGH);
     digitalWrite(lader, LOW);
     digitalWrite(ladeslut, HIGH);
     while (batvolt > minbatvolt) {
   batvolt = analogRead(batsense);   if (batvolt < minbatvolt)   {     fuld = 0;     batvoltcount = 0;     digitalWrite(ladeslut, LOW);   } }
 }
 if (batvolt >= maxbatvolt) { //maximal spænding på batterierne, sluk
     voltstop = 1;
     if (debugstate == 1) {
       Serial.println("Maxspaending");
     }
     digitalWrite(powerout, HIGH);
     while (batvolt > minbatvolt) { //blink indtil batterier bliver fjernet
       delay(1000);
       digitalWrite(lader, LOW);
       digitalWrite(ladeslut, HIGH);
       delay(1000);
       digitalWrite(lader, HIGH);
       digitalWrite(ladeslut, LOW);
       batvolt = analogRead(batsense);
       if (debugstate == 1) {
         Serial.print("Batteri spaending: ");
         Serial.println(batvolt * batterivoltfaktor);
       }
       if (batvolt < minbatvolt) {
         voltstop = 0;
       }
     }
 }
   if (tidgaaet > ladetimeout) {  // Nu har det taget for lang tid at lade batterierne, sluk
     timeoutstop = 1;
     if (debugstate == 1) {
       Serial.println("Timeout");
     }
     digitalWrite(powerout, HIGH);
     while (batvolt > minbatvolt) { //blink indtil batterier bliver fjernet
       delay(1000);
       digitalWrite(lader, LOW);
       delay(1000);
       digitalWrite(lader, HIGH);
       batvolt = analogRead(batsense);
       if (batvolt < minbatvolt) {
         timeoutstop = 0;
         tidgaaet = 0;
       }
     }
 }
   delay(tiddelay);
   tidgaaet += 1;
   if (debugstate == 1) {
     Serial.print("Ladetid: ");
     Serial.println(tidgaaet);
     Serial.print("Batteri spaending:");
     Serial.println(batvolt * batterivoltfaktor);
     Serial.println(batvoltcount);
     Serial.println(batvolt);
   }
 }