Piloter les moteurs

Objectif

Créer les fonctions pour piloter les moteurs à différentes vitesses.

Pré-requis

Avant de commencer, vous devez :

  • savoir programmer votre microcontrôleur ;
  • avoir testé le bon fonctionnement des moteurs.

Se référer à la mise en route du PAMI pour plus de détails

Le module PWM

Lorsque vous avez testé le bon fonctionnement des moteurs, vous vous êtes assuré qu'avec une tension de 3,3V sur la broche « vitesse » (ou « Enable »), le moteur tourne à pleine vitesse. Avec 0V, il s’arrête.

Mais pour le faire tourner à la moitié de sa vitesse, envoyer une tension de 1,5V ne fera pas l’affaire. Il faut voir le L293 comme un composant tout ou rien. Le moyen de piloter une vitesse intermédiaire avec ce type de composant est d’alterner, sur de très courtes périodes, des commandes à plein régime et des commandes à 0. Si les périodes sont assez courtes, le moteur lisse ces commandes. Pour réaliser ceci, le type de signal employé est un signal à modulation de largeur d'impulsion (appelé PWM en anglais).

Voici un exemple de signal envoyant une commande de 10% au moteur.

Voici un autre exemple de signal envoyant une commande de 90% au moteur.

Les microcontrôleurs proposent des modules pour générer ce type de signaux. Deux paramètres sont importants :

  • La fréquence : trop faible, le moteur s’arrête et redémarre. Moins visibles, les forts appels de courants liés à ces redémarrages peuvent créer des perturbations. Trop élevée, elle crée un grand nombre de commutations qui font chauffer le composant.
  • Le rapport cyclique : défini comme le rapport entre le temps où le signal est à l’état haut et la période du signal. C’est ce paramètre qui impacte directement et relativement linéairement la vitesse du moteur.

Le fonctionnement exact du module PWM va dépendre de votre microcontrôleur. Nous vous conseillons fortement de lire le chapitre associé dans la fiche technique de votre microcontrôleur (ici celle du RP2040) et le SDK en C (ici celui du RP2040). Lisez bien les documents dans cet ordre !

Initialisation des moteurs

Initialisez les broches de sens en sortie, configurez la broche « Enable » en PWM.

Idéalement nous aimerions configurer notre fonction PWM à une fréquence comprise entre 20 kHz et 40 kHz, ce qui limite les sifflements du moteur. Seulement, notre pont en H est un peu vieux et le fabriquant conseille de ne pas dépasser 5 kHz. Configurez alors la fonction PWM à une fréquence de 5 kHz. Pour cela, vous avez en général deux paramètres sur lesquels jouer :

  • Un diviseur de fréquence en entrée du bloc PWM
  • La valeur de rebouclage du module PWM

Commencez par déterminer la valeur de rebouclage du PWM avec la formule suivante : Rebouclage=FmicrocontrôleurFdésirée Si votre valeur de rebouclage est plus grande que celle admise par votre microcontrôleur, alors vous devrez diviser votre fréquence en entrée du PWM.

Dans notre cas, F_microcontrôleur = 125 MHz, F_désirée = 5 kHz. Nous trouvons une valeur de rebouclage à 25 000. cette valeur est admissible par le module PWM qui est sur 16 bits (max 65 535).

Commande en vitesse

Le module PWM du RP2040 fonctionne sur 16 bits. 16 bits permet de coder des nombres de 0 à 65535. Tel que nous avons initialisé le module PWM, nous profitons que d’une partie de la plage des 16 bits.

Vitesse souhaitée Commande
0 % 0
10 % 2500
50 % 12500
90 % 22500
100 % 25000

Voici qui est vrai pour le module PWM, mais pour notre fonction qui gère la commande de la vitesse du moteur, nous souhaitons gérer une subtilité supplémentaire : le sens du moteur.

Structure du code

Nous aurons donc deux fonctions publiques.

La fonction d’initialisation, qui configure les broches de sens et les modules PWM.

La fonction pour envoyer une commande de vitesse. Cette fonction comporte plusieurs subtilités :

  • L’argument vitesse, est un entier de 32 bits signé et nous envoyons au module PWM un entier de 16bits non signé. Le signe doit commande le sens de rotation de moteurs. La valeur absolue de la vitesse doit être saturée à la valeur maximale acceptable par le module PWM avant de lui être envoyé.
  • Nous voulons que cette fonction prenne en argument le moteur à piloter. Ceci afin de simplifier le code qui utilisera cette fonction.

Dans le fichier .h, définissez une constante MOTEUR_COMMANDE_MAX, qui vous servira à la fois dans votre code d’initialisation et de pilotage des moteurs et dans votre code de démonstration.

Module PWM et Raspberry Pi Pico

Attention, pour utiliser le module PWM, vous devez éditer votre fichier CMakeLists.txt pour ajouter hardware_pwm dans « target_ling_libraries », comme ceci :

target_link_libraries(PAMI_Cours_Moteurs
    ...
    hardware_pwm 
    ...
)

Code de test

Dans la partie initialisation, initialiser les moteurs avec :

Moteur_init();

Et juste après, commandez-les à 90% :

Moteur_set_commande(MOTEUR_A, 58982) ;
Moteur_set_commande(MOTEUR_B, 58982) ;

Débogage

Si les moteurs ne tournent pas :

  • vérifiez (avec Teleplot ou un simple printf) la valeur envoyée au PWM. Mesurez les tensions comme indiqué dans « Mise en route d’un PAMI ».
  • Assurez-vous de bien avoir initialisé les modules PWM.
  • Assurez-vous d’avoir correctement fait le lien entre :
Module PWM/Voie <=> broche du microcontrôleur <=> broche de la carte

Les moteurs ont une plage morte proche de 0 V. En fonction de la qualité des moteurs, cette plage morte peut aller assez haut. Ne soyez pas surpris si à 0,1V, vos moteurs ne tournent pas.

Si les moteurs tournent, c’est le moment de régler vos fonctions sens_moteurs(). Ajustez vos fonctions pour qu’avec une vitesse positive, les 2 moteurs fassent avancer le robot.

Code de démonstration

Dans la boucle principale insérez ce bout de code :

float t = Temps_get_temps_ms() / 3000. ;
Moteur_set_commande(MOTEUR_A, sin(t)) ;
Moteur_set_commande(MOTEUR_B, sin(t)) ;

Avec ce bout de code, votre robot avance et recule comme s’il accélérait progressivement.

Voir la branche « Moteur » du dépot

Aller, courage ! Encore une étape et nous pourrons entrer dans le vif du sujet.