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.
La PWM : Qu’est-ce que c’est ?
La PWM : Qu’est-ce que c’est ? (4)
Monter en fréquence
.
Par :
DIFFICULTÉ :★★☆
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 :
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 :
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 :
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 :
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.
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 :
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.
[1] c’est à dire le temps nécessaire pour que le signal arrive à 63% de sa valeur maximum
[2] En tirant 20mA sur une broche établie à HIGH, la tension n’est pas de 5V mais reste inférieure à 4,4V