Un chargeur de batterie contrôlé par Arduino

Un chargeur est toujours bien utile pour le radio-amateur… En voici un réalisé avec un Arduino pour parfaitement contrôler le courant de charge.

L’idée de départ

Notre adhérent Marc a apporté récemment un ancien chargeur conçu pour recharger les batteries des caddies de golf. L’équipement de fabrication anglaise était en panne, nous avons immédiatement mis en cause le transistor de puissance MOS en sortie du chargeur, mais celui-ci était toujours en bon état. Le montage de la commande du transistor MOS nous a semblé assez complexe pour un simple chargeur : 4 amplificateurs opérationnels, 5 transistors, 4 diodes Zener, etc…

Après les tentatives pour retrouver le schéma électrique sur internet et quelques efforts pour suivre les pistes du circuit, il nous est venu à l’idée de changer tout le circuit de commande.

Le principe de choisir une solution à découpage est venu pour offrir une plus grande gamme de puissance sans nécessiter pour autant de prévoir l’emploi d’un plus gros radiateur.

Le montage initial utilisant un transformateur 220V / 12V, la tension disponible après le pont de redressement à diodes et filtrage était de 16V. Pour charger à 10A une batterie de 100Ah, il aurait fallu prévoir de dissiper 40 à 60 W dans le radiateur de transistor travaillant en mode linéaire.

La solution retenue

Lire aussi le document PDF : Chargeur de batterie

L’approche de l’alimentation à découpage de type Buck va permettre d’abaisser la tension de 16V à 12V. Pour commander le découpage l’idée fut de rechercher une solution numérique à base d’Arduino.

Nous avons choisi d’utiliser un transistor MOS canal N (le plus performant et le plus fiable). Un composant de type P75NF75 fut récupéré sur un vieux circuit d’alimentation d’une trottinette électrique. Un MOSFET plus courant de type IRF 540 aurait aussi pu convenir.

Les performances de ce transistor sont intéressantes :

  • Intensité max = 70A à 100°C
  • RDSon = 0.01Ohm (résistance Drain / Source en conduction pour un VGS de 10V)
  • Tension max = 75V
  • Seuil de VGSth à 3V

La diode D est une diode Schottky 1N5820 qui a été récupérée sur une carte d’alimentation de PC en panne. Il importe de choisir une diode Schottky adaptée à la tension, au courant moyen et la grande rapidité de retournement entre conduction et blocage (10V en 1 ns). Le courant moyen de cette diode est de 3A, mais en mode de découpage PWM avec un rapport cycle « delta = 3/4» nous pouvons monter jusqu’à 3.5A. Une diode plus performante en courant devra être utilisée pour monter à des courants de charge de 5A voire 10A.

Explication du montage

Le principe du convertisseur à découpage Buck est bien expliqué dans Wikipedia https://fr.wikipedia.org/wiki/Convertisseur_Buck

Le transistor MOS joue le rôle du commutateur S.

Un tore bobiné, récupéré sur un filtre de gradateur 220V, joue le rôle de la self L (2mH). Cette valeur d’inductance est élevée, mais ne semble pas saturer pour des courant de l’ordre de 3A. (660W pour un gradateur).

A l’état passant le transistor MOS fait monter le courant dans la self L, à l’état bloqué le MOS ouvre le circuit et la diode se met en conduction et prend le relais pour que la self L charge le condensateur C et alimente la charge R. Les évolutions du courant dans la self  en régime permanent et en régime transitoire sont représentés dans les oscillogrammes suivants :

 

La tension de sortie Vo dépend de la tension d’entrée Ve suivant le rapport entre la durée de conduction et la durée de blocage du transistor MOS. On parle d’un principe d’une modulation de largeur d’impulsion. (en anglais Pulse Width Modulation  = PWM).

Pour commander le découpage, un Arduino Nano est utilisé. Ce microcontrôleur offre un système intégré de commande PWM disponible sur plusieurs broches de sortie. Cette solution est la seule prévue pour effectuer des sorties analogiques (pas de fonction de conversion numérique analogique DAC intégrée).

La fréquence de la PWM est prédéterminée sur l’Arduino. Il est possible de la changer comme nous le verrons plus loin. La fréquence n’est pas la même selon les broches. Sur le Nano, la fréquence est de 490Hz sur les broches 3, 9, 10 et 11 et de 980Hz sur les broches 5 et 6. Cette fréquence est très faible, pour réaliser un convertisseur Buck, on recherche souvent des fréquences de l’ordre de 20kHz qui ont le mérite de ne pas être audibles et de facilité la construction de petites selfs ne saturant pas trop vite.

En effet, si la fréquence est trop basse, la durée de conduction est élevée par exemple de l’ordre de la milliseconde.  Le courant monte dans une self suivant la  loi U = L di/dt  ce qui donne  I = U x T /L

Application numérique : pour une tension de 10V appliqué sur une self de 0.1 mH pendant une durée de 1 ms (fréquence = 1 kHz) on atteint un courant de 100A ! Pendant une durée de 50 µs (fréquence = 20 kHz), dans la même self, on limite la montée du courant à 5 A et on évite la saturation du circuit magnétique (tore).

Il est possible de faire travaille l’Arduino sur un modulation PWM à 20 kHz en utilisant une librairie particulière : pwm.h, celle-ci autorise sur la seule broche D9 de sortir le signal PWM à haute fréquence. (note : un timer interne à l’Arduino est mobilisé pour cela et bloque d’autres fonctions de l’Arduino ).

La commande du transistor MOSFET

Le problème principal est la commande d’un MOS canal N à partir de l’Arduino.

En effet l’Arduino a sa sortie PWM qui fonctionne entre 0 et 5V alors que le MOS attend une tension de source VS flottant entre 0 et Ve Un montage astucieux permet de translater la commande PWM de l’Arduino pour commander la tension VGS du MOS. Nous allons mettre en oeuvre un couplage optoélectronique grâce à un composant de type MOC5008. Ce composant va permettre d’isoler électriquement la commande de l’Arduino par rapport au transistor MOS. Le photocoupleur MOC5008 offre aussi l’avantage d’être assez rapide pour transmettre la commande à 20kHz. La sortie du MOP5008 est à collecteur  ouvert, une résistance de tirage R2 de 470Ω est nécessaire. La résistance R1 limite le courant dans la diode d’entrée de l’optocoupleur et dans la sortie de l’Arduino.

Pour ce faire, lors du découpage de la tension d’entrée Ve, une diode va charger une capacité C1. La tension au borne de la capacité C1 va alimenter le coupleur optoélectronique. Cette tension flotte avec la tension de source du MOS.

Un condensateur Ce est placé sur l’entrée Ve pour éviter les transitoires sur l’alimentation et répondre aux appels rapides de courant par le MOS. Le condensateur Cs est placé sur la sortie Vs pour filtrer la tension de sortie et maintenir la tension constante suite aux charges de courant provenant de la self L. Une charge résistive Rs de 56Ω assure un courant minimum pour que le système démarre. La résistance R5 est utile pour alimenter le coupleur optoélectronique pendant le reset de l’Arduino à la mise sous tension ou pendant la programmation. Elle permet de forcer un VGS à 0V.

Un pont diviseur 1/3 est monté à la sortie Vs pour permettre à l’Arduino de mesurer la tension de sortie Vs et ainsi pouvoir adapter la tension de charge Vs au type de batterie. Cette tension est mesurée sur l’entrée analogique A1 de l’Arduino.

Pour réguler le courant de charge de la batterie, un capteur de courant a été conçu en utilisant un petit tore magnétique coupé pour y placer un capteur magnétique à effet Hall.

La courbe de droite donne une idée de la linéarité de la conversion courant tension relevé sur le composant SS49E associé au tore bobiné. ( seule la partie positive du courant va servir )

Le bobinage de 10 tours de fil téléphonique 8/10  mm est traversé par le courant de charge de la batterie et provoque un flux magnétique dans l’entrefer du tore.

(note : l’inductance de cette bobine est faible = 6 µH). Le capteur Hall analogique traduit ce flux en tension entre 1.5V et 3.5V directement mesurable par l’Arduino. Un composant SS49E a été choisi pour sa faible taille (de la taille d’un petit transistor). Celui-ci a été collé à la cyanolite dans la fente effectuée dans le tore grâce un outil rotatif de type DREMEL.

L’usage d’un régulateur 7805 permet d’alimenter directement l’Arduino en 5V à partir de Ve (16V).

Un potentiomètre de 10kΩ est alimenté sur la tension Vcc de l’Arduino pour piloter le rapport cyclique PWM. La tension présentée sur l’entrée analogique A2 est réglable entre 0 et 5V et produit dans l’Arduino des données numériques entre 0 et 1023. Ces données sont traduites en des données numériques de rapport cyclique entre 255 et 0.

Le réglage par ce potentiomètre va déterminer la tension de sortie Vs de la batterie et aussi le courant de charge. Après avoir atteint la tension de la batterie, il suffira de monter encore le rapport cyclique pour régler le courant de charge compatible avec la batterie. (en général 1/10 de la capacité en A/h ).

Réalisation

Note :

Le même montage fonctionnera aussi bien à partir d’une tension de 16V pour constituer un chargeur de batterie 12V qu’à partir d’une tension de 5.2 V pour constituer un chargeur de batterie au lithium de 3.6V.

Nous avons associé au chargeur un afficheur numérique à encastrer VAM10010 assurant la mesure de la tension et du courant ( < 10 € chez Amazon ou Conrad ).

Le code Arduino pourra avantageusement être complété par une fonction coupant le courant à partir d’une certaine tension de charge ( par exemple 14.3V) et au bout d’une certaine durée de charge ( par exemple 12 h).

Code Arduino

// Développement par Alain Bertout Club scientifique F6KFA

#include <PWM.h>
int32_t frequency = 20000; // frequence en Hertz
int pwmratio;

void setup() {
Serial.begin(9600);
   InitTimersSafe();
  bool success = SetPinFrequencySafe(9, frequency);

    if (success) {
    pinMode (13, OUTPUT);
    digitalWrite(13, HIGH);
    Serial.println (" ok ") ;}
}
}
void loop() {
  // Lire la valeur du potentiomètre

  float Hall = analogRead(A0);
  float Pot = analogRead(A1);
  float volt= Hall *5/1023; // echelle ADC 0 à 5V
  float sortie = analogRead(A2);
  float ampere = (volt-2.5)*5/(3.53-2.5); // echelle capteur Hall 5A pour ecart entre 2.5v et 3.53v
  pwmratio= map ( Pot, 0,1023, 255,0);
  Serial.print  ( "  mA= ");
  Serial.print ( 1000*ampere,0);
  Serial.print  ( "  Tension= ");
  Serial.print  ( sortie*5/1023*30/10); //mesure de tension de sortie ( pont diviseur 10k/20k)
  Serial.print  ( "  pwmratio= ");
  Serial.println ( pwmratio);
pwmWrite (9, pwmratio); // port D9 seul port à 20 kHz
delay (500);

}