Table des matières

Convertisseur DC-DC pour arduino

1. Introduction

À partir d'une source d'énergie délivrant une tension constante, on souhaite alimenter une charge à courant moyen (de l'ordre de l'Ampère) en lui appliquant une tension constante contrôlée par l'arduino.

Ce document montre comment réaliser un convertisseur à découpage avec un hacheur abaisseur à 2 quadrants, associé à un filtre de lissage LC. Le hacheur est réalisé avec la moitié d'un pont en H à transistor MOSFET.

On verra comment utiliser le convertisseur pour étudier la caractéristique courant-tension d'un moteur DC et d'une ampoule à LED.

2. Hacheur abaisseur

2.a. Principe

On suppose que la source d'énergie est assimilable à une source de tension Vs (s pour source). Le hacheur procède à un découpage de cette tension au moyen de deux interrupteurs fermés en alternance. Au cours d'une période T, l'interrupteur I1 est fermé pendant une durée rT alors que l'interrupteur I4 est ouvert. Pendant la durée (1-r)T, I1 est ouvert et I4 est fermé. La tension découpée présente un rapport cyclique r. Un filtre passe-bas LC permet de récupérer en sortie la composante continue de cette tension, c'est-à-dire sa valeur moyenne rVs. On suppose dans un premier temps que la charge est résistive, mais on prévoit d'utiliser aussi des charges en partie inductives.

hacheurAbaisseur.svgFigure pleine page

L'interrupteur I1 est réalisé par un transistor. L'interrupteur I4 peut être une simple diode, mais dans ce cas le courant dans la charge ne circule que dans un sens. Lorsque la charge est un moteur DC, il peut être intéressant de permettre une inversion du courant afin d'obtenir le freinage électromagnétique du moteur lorsque I1 est ouvert. On utilisera donc un transistor pour I4. Il s'agit dans ce cas d'un hacheur à deux quadrants (inversion du courant mais pas de la tension).

2.b. Filtre LC

Le filtre LC doit être conçu en fonction de la fréquence de découpage et de la résistance de la charge, pour que les ondulations de la tension aux bornes de celle-ci soient négligeables.

Pour le calcul de la réponse fréquentielle du filtre, il est important de tenir compte de la résistance interne r de la bobine car elle a une grande influence sur la résonance. On ajoute aussi une inductance Lc pour la charge. Voici la fonction de transfert :

H(ω)=11+(jLω+r)(1R+jLcω+jCω)(1)

Voici une fonction python pour tracer sa réponse fréquentielle :

import numpy
from matplotlib.pyplot import *


def bodeFiltreLC(L,r,C,R,Lc):
    def H(f):
        w=2*numpy.pi*f
        return 1.0/(1+(1j*L*w+r)*(1.0/(R+1j*Lc*w)+1j*C*w))
    freq = numpy.logspace(start=0,stop=5,num=1000)
    h = H(freq)
    GdB = 20*numpy.log10(abs(h))
    plot(freq,GdB,label="R = %f"%R)
    
                     

On souhaite alimenter une charge résistive dont la résistance est comprise entre 1 et 100 Ohms.

Nous disposons d'une bobine sur tore en ferrite de 3.9 mH et de résistance r=0,036 Ω pouvant supporter jusqu'à 5 A. Nous choisissons une capacité assez grande, qui permettra de faire face à une charge dont l'inductance est importante.

L=3.9e-3
r=0.036
C=2200e-6
Lc=0
figure()
bodeFiltreLC(L,r,C,1,Lc)
bodeFiltreLC(L,r,C,10,Lc)
bodeFiltreLC(L,r,C,100,Lc)
xscale('log')
xlabel('f (Hz)')
ylabel('GdB')
title("L = %f, C = %f"%(L,C))
legend(loc='lower left')
grid()

                     
figAfigA.pdf

Si la fréquence de découpage est supérieure à 10 kHz, les ondulations sont en dessous de -80 dB par rapport à la tension continue.

On trace aussi la réponse en présence d'une charge dont l'inductance est importante (par exemple un moteur) :

Lc=10e-3
figure()
bodeFiltreLC(L,r,C,1,Lc)
bodeFiltreLC(L,r,C,10,Lc)
bodeFiltreLC(L,r,C,100,Lc)
xscale('log')
xlabel('f (Hz)')
ylabel('GdB')
title("L = %f, C = %f"%(L,C))
legend(loc='lower left')
grid()

                     
figBfigB.pdf

2.c. Simulation Spice

On réalise aussi une simulation Spice (LTSpice) pour voir la réponse transitoire. La simulation suivante se fait avec un pont en H comportant 4 interrupteurs, mais on utilise ici seulement la moitié du pont (les deux interrupteurs S1 et S4). La tension de commande V1 délivre le signal carré avec un rapport cyclique r=0.5. L'interrupteur S1 est commandé par ce signal alors que S4 est commandé par son complémentaire, obtenu avec la porte inverseuse.

pontH-filtreLC.svgFigure pleine page

Voici la tension aux bornes de la charge :

data = numpy.loadtxt("pontH-filtreLC.txt2",skiprows=1,unpack=True)
t=data[0]
Vc = data[1]
figure()
plot(t,Vc)
xlabel("t (s)")
ylabel("Vc (V)")
grid()
                       
figCfigC.pdf

Le régime transitoire dure 40 ms, avec une surtension au début. On pouvait aussi le prévoir à partir de la résonance dans le diagramme de Bode. Si l'on souhaite réduire cette surtension, il faut réduire C.

2.d. Réalisation du convertisseur

On utilise un pont en H à transistors MOSFET (ST microelectronics L6203), qui peut délivrer jusqu'à 4 A et à une fréquence de découpage jusqu'à 100 kHz. On utilise seulement la sortie OUT1 du pont. Le signal de commande IN1 est délivré par la sortie D11 de l'arduino.

L6203-demiPont-DCDC.svgFigure pleine page

Nous avons soudé le circuit L6203 avec la porte inverseuse sur un circuit imprimé. L'alimentation de puissance et les sorties OUT1 et OUT2 sont reliées par deux borniers doubles. Un autre bornier double permet d'alimenter le circuit logique (l'inverseur) à partir de l'Arduino. Un bornier double permet d'accéder à l'entrée de la porte inverseuse et à l'entrée ENABLE du pont. Il y a aussi un bornier comportant la masse et la borne SENSE, qui permet d'accéder à la tension aux bornes de la résistance située à la base du pont.

Ce circuit peut être testé avec un GBF délivrant un signal carré de rapport cyclique variable, mais il faut alors penser à alimenter le circuit logique et à mettre l'entrée ENABLE au niveau haut (avec une petite alimentation 5 V).

3. Programme arduino

Voici le programme arduino qui génère le signal PWM sur la sortie D11 pour un arduino MEGA, sur la sortie D9 pour un arduino UNO ou YUN. Il consiste à utiliser le Timer 1 pour générer le signal PWM sur la sortie OC1A. La valeur maximale du compteur, associée au diviseur d'horloge, permet de fixer la période.

generateurPWM-fixe.ino
#include "Arduino.h"
uint32_t icr;
uint16_t diviseur[6] = {0,1,8,64,256,1024};

void init_pwm_timer1_fixe(uint32_t period, float ratio) { // rapport cyclique fixe
      char clockBits;
    TCCR1A = 0;
    TCCR1A |= (1 << COM1A1); //Clear OCnA/OCnB/OCnC on compare match, set OCnA/OCnB/OCnC at BOTTOM (non-inverting mode)
    TCCR1A |= (1 << COM1B1);
#if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega32U4__)
    TCCR1A |= (1 << COM1C1);
#endif
    TCCR1B = 1 << WGM13; // phase and frequency correct pwm mode, top = ICR1
    int d = 1;
    icr = (F_CPU/1000000*period/2);
    while ((icr>0xFFFF)&&(d<6)) { // choix du diviseur d'horloge
        d++;
        icr = (F_CPU/1000000*period/2/diviseur[d]);
   } 
   clockBits = d;
   ICR1 = icr; // valeur maximale du compteur
   OCR1A = ratio*icr;
   TCNT1 = 0; // mise à zéro du compteur
   TCCR1B |= clockBits; // déclenchement du compteur
}

void setup() {
  pinMode(10,OUTPUT); 
  digitalWrite(10,HIGH); # commande ENABLE
#if defined(__AVR_ATmega2560__)
    pinMode(11,OUTPUT);
    pinMode(12,OUTPUT);
    pinMode(13,OUTPUT);
#elif defined(__AVR_ATmega32U4__)
    pinMode(9,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(11,OUTPUT);
#else
    pinMode(9,OUTPUT);
    pinMode(10,OUTPUT);
#endif
    uint32_t period_pwm = 20; // période de découpage en microsecondes
    floar r = 0.5; // rapport cyclique
    init_pwm_timer1_fixe(period_pwm,r);
}
        
void loop() {
    
    
}

             

4. Charge résistive

On commence par des tests avec une charge purement résistive. La fréquence de découpage est de 50 kHz. Pour une charge R=15 Ω, voici la tension U à l'entrée du filtre LC (en rouge) et la tension en sortie du filtre (en bleu), c'est-à-dire aux bornes de la charge, pour un rapport cyclique r=0,5.

signaux

La tension aux bornes de la charge est bien constante, un peu inférieure à rVs. Dans le cas d'une charge résistive, la tension donne directement le courant qui la traverse. Il est ici d'environ 300 mA.

Voici le résultat avec la même résistance et un rapport cyclique de 0,75 :

signaux

Pour obtenir un courant plus grand, on diminue la résistance de charge. Voici le résultat avec R=6,8 Ω pour un rapport cyclique de 0,75 :

signaux

Le courant est ici de 1,2 A. On observe une réduction de la tension en sortie et un phénomème oscillatoire juste après la fermeture du transistor du haut, dont voici un détail :

signaux

5. Moteur DC

L'alimentation d'un moteur à courant continu est une application du convertisseur DC-DC. Le pont MOSFET L6203 est d'ailleurs prévu pout alimenter des moteurs DC ou pas-à-pas. Le moteur est une charge dont l'inductance est importante. De plus, il développe une force contre-électromotrice lors de sa rotation. Une manière simple d'alimenter un moteur est de le brancher directement en sortie du hacheur, sans utiliser de filtre LC, en comptant sur l'effet de lissage de son inductance propre associée à sa résistance interne. Pour mesurer le courant dans le moteur, on ajoute une résistance de 1 Ω en série. Cela revient à augmenter légèrement la résistance du bobinage du moteur, qui est de 5 Ω.

hacheurMoteur.svgFigure pleine page

Les mesures suivantes sont faites avec une petit moteur prévu pour des applications robotiques. Voici la tension Vc (en rouge) et le courant i (en bleu) pour une fréquence de découpage de 1 kHz.

moteur

Le moteur tourne bien (sa vitesse est contrôlée par la valeur moyenne de la tension) mais les variations du courant sont très grandes. Le courant devient même négatif lorsque la tension est nulle. Cette situation n'est pas optimale pour le couple moteur (qui est proportionnel au courant). Il faut donc augmenter la fréquence de découpage. Voici le résultat pour un découpage à 10 kHz :

moteur

Les variations du courant sont nettement moins grandes. On remarque aussi des oscillations au moment de la commutation, qui étaient aussi présentes à 1 kHz bien que non visibles sur l'oscillographe. On voit aussi des ondulations à plus long terme qui ont sans doute une cause mécanique car leur fréquence augmente lorsqu'on augmente la vitesse du moteur (en augmentant le rapport cyclique). Le moteur est muni d'un réducteur, il s'agit donc vraisemblablement de variations du couple lors de la rotation du pignon d'entrée du réducteur.

Pour réduire encore les variations du courant, on peut essayer d'augmenter encore la fréquence de découpage. Voici le résultat à 50 kHz :

moteur

Les pics de courant au moment de la commutation deviennent prépondérants à cette fréquence.

Pour obtenir un courant vraiment lissé, il faut utiliser le filtrage LC à la sortie du hacheur :

hacheurMoteurLC.svgFigure pleine page

Voici la tension aux bornes du moteur et le courant pour le filtre LC déjà utilisé plus haut et une fréquence de découpage de 50 kHz, avec un rapport cyclique de 0,5 :

moteur

À l'échelle de temps du découpage, la tension et le courant sont parfaitement constants. Voyons à une échelle de temps 100 fois plus grande :

moteur

On voit à présent des variations périodiques du courant (et donc du couple) déjà observées sans le filtrage LC, et que nous attribuons à une cause mécanique. Pour le confirmer, voyons le résultat avec un rapport cyclique de 0,9 :

moteur

Comme prévu, la tension aux bornes du moteur est plus grande et le moteur tourne plus vite. Les oscillations du courant sont bien proportionnelles à la vitesse, ce qui prouve leur origine mécanique. Pour cette tension proche du maximum, la vitesse du moteur est proche de 85 tours par secondes, soit 12 ms par tour. Les variations du couple ont une période d'environ 2 ms. Elle sont probablement causées par les variations de l'effort sur les dents de l'engrenage de sortie du moteur.

Pour voir l'influence du couple sur le courant, on ajoute une roue en sortie du réducteur, et on applique un couple de frottement sur le bord de la roue. Voici l'enregistrement pour un rapport cyclique de 0,5 :

moteur

L'augmentation du couple se traduit bien par une augmentation du courant moyen. Le courant varie entre 230 mA et 420 mA.

En conclusion, le filtrage LC en sortie du hacheur permet d'obtenir un bon lissage du courant dans le moteur. Il est bien sûr indispensable pour étudier les caractéristiques électriques du moteur, en relation avec des mesures mécaniques de couple et de vitesse.

6. Ampoule à LED

On utilise le hacheur avec le filtre LC pour alimenter une ampoule à LED, vendue dans le commerce pour l'éclairage domestique. L'ampoule contient 6 LED de puissance. Elle est prévue pour un usage en basse tension. La caractéristique marquée sur l'ampoule est 5,5 W pour 12 V DC. Les deux bornes ne sont pas polarisées, ce qui laisse deviner la présence d'une électronique de contrôle intégrée. Elle peut d'ailleurs fonctionner en 12 V AC.

hacheurLampeLC.svgFigure pleine page

Il y a une tension minimale à appliquer pour déclencher l'éclairage. Pour une alimentation de 12 V, le rapport cyclique minimale est r=0,37. Voici la tension Vc (en bleu) et le courant (en rouge) pour ce rapport :

led

La tension est 4 V. Le courant n'est pas constant mais présente des pics d'environ 100 mA espacés d'environ 5 ms.

Voici le courant et la tension pour un rapport cyclique de 0,45 :

led

Il y a des oscillations qui ressemblent à des oscillations de relaxation.

Voici le résultat pour un rapport cyclique de 0,5 :

led

Il n'y a plus d'oscillations, ou du moins leur amplitude est très faible. La tensions est Vc=5 V et le courant i=0,8 A. La puissance reçue par la lampe est donc 4,2*0,8=3,4 W.

Pour un rapport cyclique de 0,7 :

led

La tension est Vc=7,5 V et le courant i=1,15 A, soit une puissance 7,3 W.

Lorsqu'on fait varier la tension entre 4 V et 8 V, on voit une augmentation de la puissance lumineuse, liée bien sûr à l'augmentation du courant. Il faudra quantifier cette variation avec une photodiode.

Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.