LOCODUINO

Forum de discussion
Dépôt GIT Locoduino
Flux RSS

jeudi 23 novembre 2017

17 visiteurs en ce moment

La PWM : Qu’est ce que c’est ? (4)

Monter en fréquence

. Par : Jean-Luc

Dans « La PWM : Qu’est-ce que c’est ? (2) », nous avons vu comment piloter un moteur en PWM   à l’aide d’un transistor MOS canal N, l’IRF540N, transistor nécessaire car, du fait d’un courant de sortie insuffisant l’Arduino ne peut pas directement piloter un moteur. Augmenter la fréquence de la PWM   comme vu dans « La PWM : Qu’est ce que c’est ? (3) » va nous amener à revoir le schéma de cette partie puissance.

En effet, dans le montage à base d’IRF540N, nous ne nous sommes pas occupé du temps de réponse du transistor, notamment la façon dont le signal sur sa grille évolue dans le temps. Ce signal doit changer le plus rapidement possible afin que le transistor MOS s’ouvre et se ferme le plus rapidement possible. De cette manière, le signal de la PWM   est reproduit le plus fidèlement possible aux bornes du moteur.

Le montage simple ne permet pas une fréquence élevée

Pour limiter le courant tiré de la broche de l’Arduino, nous avons mis une résistance de 270Ω. La grille du transistor MOS présente une capacité assez importante, un tour dans la datasheet   de l’IRF540N nous apprend que cette capacité est de 2nF. La constante de temps RC [1] est donc de 500ns. Il faut également prendre en compte le fait que l’Arduino, si il doit fournir un courant important sur une sortie, et 19 mA est un courant important pour un Arduino, ne pourra pas établir une tension de 5V aussi rapidement [2], ce qui conduit à un signal d’entrée qui monte, et qui descend, de manière plus paresseuse.

Or, dans cette phase de commutation, la résistance équivalente du MOSFET est importante et cela entraîne une dissipation thermique également plus importante. Le MOSFET chauffe. Et quand un MOSFET chauffe sa résistance augmente et fait chuter la tension aux bornes du moteur.

Avec la fréquence de PWM   de base de l’Arduino, 490Hz, voir « La PWM : Qu’est ce que c’est ? (3) », ce phénomène n’est pas visible car ramené à la période correspondante de 2ms, la phase de commutation représente une durée négligeable.

Avec une PWM à la fréquence la plus élevée, 31,373kHz, soit une période d’environ 32µs. La durée de la phase de commutation n’est plus du tout négligeable, les PWM de faible valeur ne conduisent plus à une commutation complète du MOSFET comme vous pouvez le voir dans la photo ci-dessous et il chauffe.

Atteindre une fréquence plus élevée

Nous allons revoir le schéma pour faire en sorte que le signal sur la grille monte et descende de manière plus vigoureuse. Pour cela, il nous faut un étage d’amplification entre l’Arduino et le MOSFET. Nous allons construire cet étage au moyen de transistors bipolaires. Le moyen classique d’amplifier, moyen que vous trouverez sur beaucoup de sites dédiés à l’Arduino, est d’utiliser un simple transistor bipolaire NPN en commutation. Le schéma est très simple :

Montage 1

Lorsque la PWM est à 0, T4 est bloqué et la grille du MOSFET T1 se charge via R3 et R5. Lorsque la PWM est à 5V, T4 est passant et la grille du MOSFET se décharge via T4. R5 limite le courant afin d’épargner T4 lors de la décharge.

Mais ce montage se révèle ici insuffisant. En effet, la résistance de tirage R3 à +5V doit être faible si on veut que la grille du transistor NMOS T5 se charge rapidement lorsque T4 est bloqué (PWM = 0), disons une trentaine d’Ohms. Lorsque T4 est passant, il va devoir tirer au moins 150mA pour que la tension sur la grille de T5 descende bien en dessous de 2V, tension de seuil minimum pour que T5 se bloque, autant que la locomotive. Le comportement est meilleur que la solution précédente mais n’est pas bon pour autant comme en atteste la mesure ci-dessous :

Il nous faut donc un montage plus efficace qui charge et décharge activement la grille du MOSFET. Pour cela il est nécessaire de remplacer la résistance R3 par un transistor. Cela donne le montage ci-dessous :

Montage 2

Considérons tout d’abord le cas où la PWM est à 0. Le transistor T4 est bloqué. La résistance R2 polarise le transistor T2 qui charge puis maintient la grille de T1 à 11,3V (12V moins le seuil de 0,7V du transistor T2) car T2 se bloque dès que VBE devient inférieure à 0,7V. La diode D1 est polarisée en inverse et n’a donc aucune influence. Le schéma équivalent est le suivant :

Montage 2
Charge de la grille du MOSFET

Notez que la grille de T1 est à 11,3V. Il est en effet préférable de ne pas utiliser le 5V pour rendre passant T1 car avec la perte de 0,7V on serait à 4,3V, ce qui est un peu juste par rapport à la tension requise de 4V.

Considérons maintenant le cas où la PWM est à 5V. Le transistor T4 est saturé. Par conséquent il tire la base de T2 à la masse et le bloque. Simultanément, il décharge la grille de T1 via D1 et R1. La tension finale sur la grille de T1 s’établit à 0,7V à cause du seuil de D1. Le schéma équivalent est le suivant :

Montage 2
Décharge de la grille du MOSFET

Vous avez peut être noté que T1 est passant, le moteur est alimenté, lorsque la PWM est à 0 et qu’il est bloqué, le moteur n’est pas alimenté, lorsque la PWM est à 5V. C’était d’ailleurs également le cas pour le montage précédent. C’est l’inverse de ce que nous avons considéré jusqu’à maintenant. Nous pourrions ajouter un transistor pour faire en sorte que la PWM soit comme on en a l’habitude mais ce n’est pas nécessaire car il est possible d’inverser la PWM de l’Arduino. Ceci est traité plus bas dans le paragraphe « Inverser la PWM ».

Notez enfin la résistance R4 qui, tant que la PWM n’est pas active sur la broche de l’Arduino, conduit au blocage de T1. Sans cette résistance, le moteur partirait à fond tant que l’Arduino n’a pas fini de s’initialiser, ce qui serait assez désagréable.

Les temps de commutation sont bien meilleurs comme en atteste la photo ci-dessous et le MOSFET reste froid.

Inverser la PWM

Inverser la PWM signifie qu’une PWM à 0 conduit à un signal à 5V et une PWM à 255 conduit à un signal à 0V. Une PWM à 64, par exemple, conduit elle à un signal à 0V pendant 1/4 de la période et à 5V pendant 3/4 de la période.

Deux bits d’un des registres de contrôle des timers permettent, par chaque sortie PWM, de spécifier si la PWM est inversée ou non. Ceci est décrit dans l’article « Les Timers (IV) ». Mais il y existe un petit problème, la fonction analogWrite(...) réserve un traitement spécial aux valeurs 0 et 255. Si on passe un 0 comme valeur de PWM à analogWrite, un digitalWrite(..., LOW) est effectué. Si on passe 255, un digitalWrite(..., HIGH) est effectué. Bien entendu si on veut inverser la PWM, il faudrait faire l’inverse. On ne peut donc pas utiliser analogWrite avec une PWM inversée. Je vous propose donc une version remaniée d’analogWrite que j’ai appelée pwmWrite et qui tient compte de l’inversion de la PWM.

Les deux fonctions setPWMPolarity et pwmWrite ont donc été ajoutées à la bibliothèque PWMFreq que vous pouvez télécharger ci-dessous.

Bibliothèque PWMFreq

Et sans inverser ?

Il est également possible de réaliser le même type de montage sans inverser la PWM en substituant un MOSFET canal P au MOSFET canal N. On économise même une résistance puisque T4 sera bloqué quand le signal de PWM flotte lors du démarrage de l’Arduino. Le schéma est le suivant :

Montage 3
Montage similaire avec un PMOS au lieu d’un NMOS

Dans un prochain article nous attaquerons le problème de la synchronisation des PWM entre les cantons qui pourront donc être commandés par des Arduino séparés.

[1c’est à dire le temps nécessaire pour que le signal arrive à 63% de sa valeur maximum

[2En tirant 20mA sur une broche établie à HIGH, la tension n’est pas de 5V mais reste inférieure à 4,4V

3 Messages

Réagissez à « La PWM : Qu’est ce que c’est ? (4) »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Projets »

Un chenillard de DEL

Enseigne de magasin

Feux tricolores

Multi-animations lumineuses

L’Arduino et le système de commande numérique DCC

Un décodeur d’accessoire DCC versatile basé sur Arduino

Un moniteur de signaux DCC

Une barrière infrarouge

Un capteur RFID

Un TCO xpressnet

Une animation sonore

L’Arduino au coeur des systèmes de pilotage analogiques ou numériques

Calcul de la vitesse d’un train miniature avec l’Arduino

La génèse d’un réseau 100% Arduino

Une horloge à échelle H0

Simulateur de soudure à arc

Un automatisme de Passage à Niveau

La rétro-signalisation sur Arduino

Décodeur pour aiguillage à solénoïdes sur Arduino

Un décodeur DCC pour les signaux à deux ou trois feux sur Arduino NANO/UNO

Etude d’un passage à niveau universel

Réalisation pratique d’un système de mesure de vitesse à l’échelle N

Une Passerelle entre le bus S88 et le bus CAN pour la rétro signalisation

Un décodeur DCC pour 16 feux tricolores

Block Automatique Lumineux avec la carte shield "Arduino 4 relays"

Réalisation d’un affichage de gare ARRIVEE DEPART

Ménage à trois (Ordinateur, Arduino, réseau)

Comment piloter trains et accessoires en DCC avec un Arduino (1)

Comment piloter trains et accessoires en DCC avec un Arduino (2)

Comment piloter trains et accessoires en DCC avec un Arduino (3)

Comment piloter trains et accessoires en DCC avec un Arduino (4)

SGDD : Système de Gestion DD (1)

SGDD : Système de Gestion DD (2)

SGDD : Système de Gestion DD (3)

Mise en oeuvre du Bus CAN entre modules Arduino (1)

Mise en oeuvre du Bus CAN entre modules Arduino (2)

Un gestionnaire en C++ pour votre réseau (1)

Un gestionnaire en C++ pour votre réseau (2)

Un gestionnaire en C++ pour votre réseau (3)

Un gestionnaire en C++ pour votre réseau (4)

Réalisation de centrales DCC avec le logiciel libre DCC++ (1)

Réalisation de centrales DCC avec le logiciel libre DCC++ (2)

Réalisation de centrales DCC avec le logiciel libre DCC++ (3)

Contrôleur à télécommande infrarouge pour centrale DCC++

Gestion d’une gare cachée (1)

Gestion d’une gare cachée (2)

Gestion d’une gare cachée (3)

Les derniers articles

Ménage à trois (Ordinateur, Arduino, réseau)


Christian

La PWM : Qu’est ce que c’est ? (4)


Jean-Luc

Block Automatique Lumineux avec la carte shield "Arduino 4 relays"


Christian

Réalisation d’un affichage de gare ARRIVEE DEPART


Gilbert

Contrôleur à télécommande infrarouge pour centrale DCC++


Daniel

La PWM : Qu’est ce que c’est ? (3)


Jean-Luc

Réalisation de centrales DCC avec le logiciel libre DCC++ (3)


bobyAndCo

Un gestionnaire en C++ pour votre réseau (4)


Pierre59

Un décodeur DCC pour 16 feux tricolores


Dominique, JPClaude, Thierry

Réalisation de centrales DCC avec le logiciel libre DCC++ (2)


bobyAndCo

Les articles les plus lus

La PWM : Qu’est-ce que c’est ? (1)

Réalisation d’un affichage de gare ARRIVEE DEPART

Comment piloter trains et accessoires en DCC avec un Arduino (1)

Mise en oeuvre du Bus CAN entre modules Arduino (2)

Feux tricolores

L’Arduino au coeur des systèmes de pilotage analogiques ou numériques

Ménage à trois (Ordinateur, Arduino, réseau)

Comment piloter trains et accessoires en DCC avec un Arduino (3)

Mise en oeuvre du Bus CAN entre modules Arduino (1)

Une barrière infrarouge