Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
|
fr:informatics:faire_tourner_les_moteurs [25/08/2024 13:01] Keuronde créée |
— (Version actuelle) | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== Faire tourner 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' | ||
| - | |||
| - | 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, | ||
| - | |||
| - | #IMG PWM 10 % | ||
| - | |||
| - | #IMG PWM 90 % | ||
| - | |||
| - | Les microcontrôleurs proposent des modules pour générer ce type de signaux. Deux paramètres sont importants : | ||
| - | * **La fréquence : | ||
| - | * **Le rapport cyclique : | ||
| - | 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 ==== | ||
| - | |||
| - | Voici le code d’initialisation des moteurs. Les broches de sens en sortie, la broche « Enable » en PWM configurée à une fréquence de XX kHz. | ||
| - | ==== 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 de toute la plage des 16bits. | ||
| - | |||
| - | ^ Vitesse souhaitée ^ Commande ^ | ||
| - | | 0 % | 0 | | ||
| - | | 10 % | 6554 | | ||
| - | | 50 % | 32768 | | ||
| - | | 90 % | 58982 | | ||
| - | | 100 % | 65536 | | ||
| - | 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 : | ||
| - | ===== Structure du code ===== | ||
| - | |||
| - | Nous aurons donc deux fonctions publiques. | ||
| - | |||
| - | La fonction d’initialisation, | ||
| - | |||
| - | 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. | ||
| - | ===== Code de test ===== | ||
| - | Dans la partie initialisation, | ||
| - | Moteur_init(); | ||
| - | Et juste après, commandez-les à 90% : | ||
| - | Moteur_set_commande(58982, | ||
| - | Moteur_set_commande(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 = get_temps_ms() / 3000. ; | ||
| - | Moteur_set_commande(sin(t), | ||
| - | Moteur_set_commande(sin(t), | ||
| - | |||
| - | Avec ce bout de code, votre robot avance et recule comme s’il accélérait progressivement. | ||
| - | |||
| - | Aller, courage ! Encore une étape et nous pourrons entrer dans le vif du sujet. | ||