Cas d'un hacheur avec moteur à courant continu
Les pins utilisables pour des sorties pseudo-analogique PWM
Afin de commander le rapport cyclique d'un sortie pseudo-analogique PWM pour moduler par exemple la vitesse de rotation d'un moteur, cette dernière doit être branchée sur un des pins repérés par le symbole \(\sim \)(pins 3, 5, 6, 9, 10 et 11) qui peuvent être configurés comme sortie pseudo-analogique PWM (voir image ci-contre).
La tension PWM (de forme rectangulaire et de fréquence élevée) est créée sur ce pin, via une commande codée sur 8 bits, c'est à dire sur une plage allant de 0 à 255 (28-1 = 255). Le rapport cyclique vaut commande/255, c'est-à-dire si commande=255 alors +5V est commandé en continu sur le pin.
Exemple du câblage d'un moteur avec son hacheur
En général, la carte Arduino ne peut délivrer la puissance nécessaire à l'alimentation d'un moteur. Par contre, elle peut commander un préactionneur : la carte de puissance (hacheur), qui modulera la puissance provenant du bloc secteur.
Ici, la carte de puissance PmodHB5 (hacheur), commandée par un signal PWM, en provenance de la carte Arduino, fonctionne alors comme un interrupteur à haute fréquence.
Le moteur à courant continu plus lent (temps de réponse de l'ordre de la milliseconde), ne perçoit que la tension moyenne du signal PWM en sortie du hacheur...
Remarque : dans le montage ci-dessous, le moteur possède également un codeur incrémental afin de mesurer la position et la vitesse réelles de son axe rotor. Ce codeur est utile uniquement si l'on souhaite réaliser un asservissement de position ou de vitesse... Il n'est donc pas utile de câbler les voies A et B du codeur ci-dessous, si ce besoin n'est pas exprimé.
Au lieu d'utiliser une carte de puissance PmodHB5, il est possible d'utiliser un circuit intégré L293D, qui peut entrainer 2 moteurs si besoin :
NB : Les grounds GND de la carte Arduino, du circuit intégré L293D, et de l'alimentation en puissance (bloc secteur ou pile) devront être reliés.
La différence entre la carte de puissance PmodHB5 et le circuit intégré L293D se fait juste dans la commande du sens.
En effet, le circuit intégré L293D possède 2 pins sens pour 1 moteur.
Ainsi pour faire tourner le moteur dans un sens avec le circuit intégré L293D, il faut commander 1 sur le pin sens 1 et commander 0 sur le pin sens 2, alors qu'avec la carte de puissance PmodHB5, il fallait juste commander 1 sur le pin sens.
Et pour faire tourner le moteur dans l'autre sens avec le circuit intégré L293D, il faut commander 0 sur le pin sens 1 et commander 1 sur le pin sens 2, alors qu'avec la carte de puissance PmodHB5, il fallait juste commander 0 sur le pin sens.
Structure du code
• dans l'entête déclarative : déclarer les variables associées au numéro du pin où est branchée une sortie pseudo-analogique PWM telle que la vitesse du rotor d'un moteur (Vitpin) ainsi qu'à la valeur commandée (Vitvaleur) sur ce pin sortie pseudo-analogique PWM ;
Attention à la casse des noms de variable : « Vitpin » est différent de « vitpin » !
• dans la fonction void setup() : définir le pin utilisé, comme une sortie, à l'aide de la fonction « pinMode »
• dans la fonction void loop() : commander (ou écrire) la valeur du rapport cyclique de la sortie pseudo-analogique PWM (image de la vitesse du rotor) à l'aide de la fonction « analoglWrite ».
La commande doit être un entier compris entre 0 et 255 : si commande=255 alors +5V est commandé en continu sur le pin.
Code pour commander la vitesse du rotor d'un moteur
int Vitpin = 11 ; // déclare la variable Vitpin comme un entier de valeur 11 (repère du pin utilisé par la sortie vitesse)
int Vitvaleur ; // déclare la variable Vitvaleur comme un entier (valeur qui sera commandée sur le pin de la sortie vitesse)
void setup() {
pinMode(Vitpin,OUTPUT); // définit le pin Vitpin (ici 11) comme une sortie
}
void loop() {
Vitvaleur = round(Potvaleur*255./1023); // exemple d'une expression de Vitvaleur si la vitesse doit être proportionnelle à la position d'un potentiomètre. Cette expression change l'échelle de la variable Potvaleur allant de 0 à 1023 en 0 à 225. C'est un calcul en croix, afin que la variable Vitvaleur aille de 0 à 255 compatible avec les sorties PWM. La fonction round renvoie l'entier le plus proche.
analogWrite(Vitpin, Vitvaleur); // commande (ou écrit) le rapport cyclique de la sortie pseudo-analogique PWM Vitpin. Ce rapport cyclique vaut Vitvaleur/255, c'est-à-dire si Vitvaleur=255 alors +5V est commandé en continu sur le pin.
}
Si besoin : Code pour commander le sens (attention ce dernier est une sortie numérique et non pas une sortie pseudo-analogique PWM)
int Senspin = 9 ; // déclare la variable Senspin comme un entier de valeur 9 (repère du pin utilisé par le sens)
boolean Sensetat ; // déclare la variable Sensetat comme un booléen (valeur qui sera commandée sur le pin du sens)
void setup() {
pinMode(Senspin,OUTPUT); // définit le pin Senspin (ici 9) comme une sortie
}
void loop() {
Sensetat=.... ; // expression à déterminer selon le cahier des charges
digitalWrite(Senspin,Sensetat); // commande (ou écrit) l'état de la sortie numérique Senspin (car la valeur booléenne Sensetat sera immédiatement convertie en tension : 0V si Sensetat=0, ou 5V si Sensetat=1)
}