Programme avec arduino pour piloter le rechargement de batteries

Bonjour ! J’ai récemment eu l’idée de crée un chargeur de batterie avec un arduino pour le commander. Une fois la carte crée, il ne manquait plus que le code a faire. Ce que j’ai fais. Durant les phases test tout marché pour le mieux. Cependant une fois arriver a l’étape final et bien c’est la que j’ai commencé a rencontré des soucis. Mon programme est censé gérer la rechargement de 3 batteries qui sont initialement branché, borne + en commun et la leur masse branché a un transistor Nmos pour chaque une des batteries. Je souhaité commander la grille des Nmos avec digitalWrite pour pouvoir les recharger une a une chaque une son tour. J’ai utiliser des pins en plus pour meublé tout ça avec des leds qui s’allume en fonction de l’état de charge de chaque batteries, en charge et chargé. Le plus gros problème que j’ai rencontré c’est lorsque une batterie par exemple la batterie 0 a atteint les 14.70volts a savoir la tension de seuil de basculement de la pin ici D2 reste a l’état haut alors qu’elle devrait passer a l’état bas. J’ai pu constater ce soucis sur les 3 pins qui gère les Nmos. Les leds associés aux Nmos ici par exemple D4 associé a D2 s’éteint bien lorsque la tension de seuil est franchie. Voila je me remet donc a vous pour pouvoir m’aider a trouver quelle est le problème dans mon code. Je vous remercie en avance pour votre aide !

float Ah0,Ah00,b0; // Ah0 valeur image de la tension batterie 0
float Ah1,Ah11,b1; // Ah1 valeur image de la tension batterie 1
float Ah2,Ah22,b2; // Ah2 valeur image de la tension batterie 2
int b; // Variable qui permet d'arrêter la boucle
void setup()
{
pinMode(2,OUTPUT); // Initialisation sortie batterie 0
pinMode(3,OUTPUT); // batterie 0 , chargé
pinMode(4,OUTPUT); // batterie 0 , en chage
pinMode(5,OUTPUT); // Initialisation sortie batterie 1
pinMode(6,OUTPUT); // batterie 1 , chargé
pinMode(7,OUTPUT); // batterie 1 , en chage
pinMode(13,OUTPUT); // Initialisation sortie batterie 2
pinMode(8,OUTPUT); // batterie 2 , chargé
pinMode(9,OUTPUT); // batterie 2 , en chage
digitalWrite(2,HIGH); // Nmos batterie 0
digitalWrite(3,LOW);  // Led témoin batterie 0 chargé
digitalWrite(4,LOW);  // Led témoin batterie 0 en charge
digitalWrite(5,LOW);  // Nmos batterie 1
digitalWrite(6,LOW);  // Led témoin batterie 1 chargé
digitalWrite(7,LOW);  // Led témoin batterie 1 en charge
digitalWrite(13,LOW); // Nmos batterie 2
digitalWrite(8,LOW);  // Led témoin batterie 2 chargé
digitalWrite(9,LOW);  // Led témoin batterie 2 en charge
b=0; // Variable qui permet d'arrêter la boucle
b0=0; // Variable qui permet de dire que batterie0 est chargé
b1=0; // Variable qui permet de dire que batterie1 est chargé
b2=0; // Variable qui permet de dire que batterie2 est chargé
    do {  // Execute au moins une fois
      Ah0 = analogRead(A0); // Lecture du port A0
      Ah1 = analogRead(A1); // Lecture du port A1
      Ah2 = analogRead(A2); // Lecture du port A2
      Ah00 = (Ah0*26.35/1024.0); // Conversion en volts
      Ah11 = (Ah1*26.18/1024.0); // Conversion en volts
      Ah22 = (Ah2*26.10/1024.0); // Conversion en volts
      if (b0==1) {} // si batterie0 est chargé sauter cette etape
      else {        // sinon
      if ( (Ah00>6) && (Ah00<13.25) ) // si la tension batterie 0 > 6v et < 13.25v alors
         {
    do {       
       Ah0 = analogRead(A0);      // Lecture du port A0
       Ah00 = (Ah0*26.35/1024.0); // Conversion en volts
       digitalWrite(2,HIGH);      // Nmos ferme le circuit batterie 0
       digitalWrite(4,HIGH);      // Led batterie 0 en charge allumé
       digitalWrite(3,LOW);       // Led batterie 0 chargé éteinte 
       }
        while(Ah00<14.70);        // Tant que tension batterie 0 < 14.70v
       digitalWrite(2,LOW);       // Nmos ouvre le circuit batterie 0
       digitalWrite(4,LOW);       // Led batterie 0 en charge éteinte
       digitalWrite(3,HIGH);      // Led batterie 0 chargé allumé
       digitalWrite(5,HIGH);      // Permet la fermeture du circuit de la batterie 1
       b0=1;                      // Indication que la charge batterie 0 effectué
          }
   else {                         // Dans le cas ou b0=1
          digitalWrite(2,LOW);    // Laisse le Nmos a l'état bas de la batterie 0
          digitalWrite(5,HIGH);   // Ferme le circuit batterie 1
        }
            }
 if (b1==1) {}  // si batterie1 est chargé sauter cette etape
 else {         // sinon
 if ( (Ah11>6) && (Ah11<13.25) ) // si la tension batterie 1 > 6v et < 13.25v alors
    {
        do {
       Ah1 = analogRead(A1);        // Lecture du port A0
       Ah11 = (Ah1*26.18/1024.0);   // Conversion en volts
       digitalWrite(5,HIGH);        // Nmos ferme le circuit batterie 1
       digitalWrite(7,HIGH);        // Led batterie 1 en charge allumé
       digitalWrite(6,LOW);         // Led batterie 1 chargé éteinte
           }
        while(Ah11<14.70);          //  Tant que tension batterie 1 < 14.70v
       digitalWrite(5,LOW);         // Nmos ouvre le circuit batterie 1
       digitalWrite(7,LOW);         // Led batterie 1 en charge éteinte
       digitalWrite(6,HIGH);        // Led batterie 1 chargé allumé
       digitalWrite(13,HIGH);       // Permet la fermeture du circuit de la batterie 2
       b1=1;                        // Indication que la charge batterie 1 effectué
    }
        else {                      // Dans le cas ou b1=1
          digitalWrite(5,LOW);      // Laisse le Nmos a l'état bas de la batterie 1
          digitalWrite(13,HIGH);    // Ferme le circuit batterie 2
             }
       }
if (b2==1) {}                       // si batterie2 est chargé sauter cette etape
      else {                              // sinon
      if ( (Ah22>6) && (Ah22<13.25) ) // si la tension batterie 1 > 6v et < 13.25v alors
     {
        do {
       Ah22 = (Ah2*26.10/1024.0);     // Lecture du port A0
       Ah2 = analogRead(A2);          // Conversion en volts
       digitalWrite(13,HIGH);         // Nmos ferme le circuit batterie 2
       digitalWrite(9,HIGH);          // Led batterie 2 en charge allumé
       digitalWrite(8,LOW);           // Led batterie 2 chargé éteinte
           }
        while(Ah22<14.70);            //  Tant que tension batterie 2 < 14.70v
       digitalWrite(13,LOW);          // Nmos ouvre le circuit batterie 2
       digitalWrite(9,LOW);           // Led batterie 2 en charge éteinte
       digitalWrite(8,HIGH);          // Led batterie 2 chargé allumé
       digitalWrite(2,HIGH);          // Permet la fermeture du circuit de la batterie 0
       b2=1;                          // Indication que la charge batterie 2 effectué
     }
            }
        else {                        // Dans le cas ou b2=1
              digitalWrite(13,LOW);       // Laisse le Nmos a l'état bas de la batterie 2
             }
      if (2<b0+b1+b2)  {b=1;}               // si la somme de b0+b1+b2 est supérieur a 2 , alors b vaut 1
      }
      while(b!=1);                          // En sort de la boucle , sinon on répete la procédure
}
void loop()
{}

Bonsoir

Pour augmenter les chances de réponses , deux choses à faire :

1° Faire un schéma, eventuellement à main levée (avec les symboles des composants, pas leur 'look') ..?.. parce que décrire un montage avec un pavé de 12 lignes ce n'est pas l'idéal pour se faire comprendre !!
=>montrer par ce schéma le raccordement des batteries , des NMOS, des entrés /sorties numériques et analogiques (Comment sont lues les tensions supérieures à 5V ?, où sont les seuils ?....)
Quelle est la technologie des batteries ?

2° retoucher le message pour que le code soit publié entre les balises appropriées
comment faire ? : voir içi le message n°2 de hbachetti)

Merci pour ta réponse, al1fch ce sont des batteries au plomb de voiture.

OK

Les entrées analogiques verront toutes les trois 2,6 V quelque soit l'état de charge des batteries car les ponts diviseurs sont entre 15V et la masse.
constante.png

15 * R1 / (R1 + R2) = constante

constante.png

En faite lorsque l'on branche une batterie qui n'est pas chargé, il y a une chute de tension. La tension devient inférieur a la tension d'alimentation et remonte progressivement en fonction que la batterie se recharge. Je ne pense pas que c'est la cause primaire des problèmes auquel je fait face.

La tension devient inférieur a la tension d'alimentation et remonte progressivement en fonction que la batterie se recharge.

"la tension" , de quelle tension parles-tu ? sans doute de la tension aux bornes de la batterie au plomb en charge .
mais ce n'est pas cette tension que tu mesures mais la tension d'alimentation 15V commune aux 3 batteries (du moins une fraction de cette tension d'alimentation)
Tu ne mesures pas ce que tu crois mesurer

Donc si j’ai bien compris, il faut que je branche les résistances sur le drain des mos et non pas directement sur la masse ?

c'est déjà mieux parce que le pont diviseur serait bien aux bornes de chaque batterie ...

mais ça pose un gros problème parce que la tension 'image' de la tension de batterie ne sera plus référencée à la masse , ce qui est nécessaire pour les entres analogiques de la carte Arduino.

en fait ce que tu cherches à faire va plutôt dans le sens de transistors Mosfets PMOS entre le 15V et le + des batteries , le moins des batteries étant à la masse
Il est alors possible de mettre 3 ponts diviseurs entre + des batteries et masse et prélever ainsi une fraction référencée à la masse de la tension aux bornes de la batterie.

Reste alors à régler la question des tensions à appliquer sur les grilles des PMOS.....IL faut pouvoir mettre les grilles tantôt à +15V , tantôt à la masse

source : "Nos amis les Mosfets" Nos amis les MOSFET | Connect - Editions Diamond

J'ai pas de PMos , et si j'utiliser directement des npn qui commandes les relais ?

Bonjour,

Il faut supposer que ce qui est noté +15V sur le schéma c'est une alimentation limitée en courant, ce qui fait que la tension n'est pas de 15V et augmente lors de la charge.
Autrement je ne donne pas cher de la batterie.

L'alimentation est évidemment limité c'est une alim a découpage qui peut fournir au maximum 4A ce qui n'est pas dangereux pour le type de batterie que je recharge

Ok, mais avec 4A pour charger en parallèle trois batteries au plomb il faut s'attendre à une charge, très très, lente !

Non au faite le but de mon montage c'est de charger la première batterie jusqu'a 14,7 volts puis il la débranche et branche la seconde batterie la recharge... Pareille pour la troisième et dernière.

ça reste une charge lente pour des batteries de voiture (info donnée au message #2)
la plupart ont une capacité supérieure à 60 Ah

D'accord au moins je le sais maintenant, donc la solution a retenir c'est de mettre des npn avec des relais?

pourquoi pas ? c’est une façon de faire , une alternative aux PMOS (NPN+ relais ou NPN+PMOS)

Ok, je vais faire ça demain je vous tiens au courant alors

Pas concluant j’ai même un autre soucis qui est apparu, il connecte la batterie a chargé puis la débranche directement après qu’elle quand bien même sa tension est comprise entre les deux valeur que j’ai mis.