Accueil > ARDUINO > Drivers moteurs > Arduino & Driver de moteur pas à pas DRV8825

Arduino & Driver de moteur pas à pas DRV8825

dimanche 22 novembre 2015, par thebault

CARACTÉRISTIQUES DU CONTRÔLEUR DRV8825

La carte contrôleur de moteur pas à pas DRV 8825 utilisée provient du fabricant POLOLU et intègre le driver DRV8825 de Texas instrument. Cette carte contrôleur permet de commander un moteur pas à pas bipolaire.

- la datasheet du driver,
- la page du contrôleur chez Pololu.
- 4 x 1/2 pont en H en sortie à base de MOSFETs
- le courant maxi par phase est de 1,5A sans dissipateur thermique. Cela peut monter à 2,5 A avec dissipateur thermique (cf datasheet TI DRV8825)
- réglage du courant maxi à l’aide d’un potentiomètre (voir ci dessous)
- alimentation de la partie puissance 45V max
- signaux commande en 3,3V ou 5V
- les entrées/sorties

JPEG - 115.6 ko
/ENABLE Autorise le fonctionnement Vmoteur GND Alimentation puissance
M0 à M1 mode de micro pas B1 B2 Bobine 2
/RESET réinitialisation A1 A2 bobine 1
/SLEEP mode veille basse consommation /FAULT indique un pb type surcharge, échauffement
STEP incrémente/décremente d’un pas GND Masse
DIR Sens de rotation

- choix du fonctionnement en pas entier, 1/2 pas, 1/4 pas, 1/8 pas, 1/16 pas, 1/32 pas (fonctionnement en micro pas) grâce aux entrées M0, M1, M2 :

JPEG - 45.2 ko
https://www.pololu.com/product/2132/

- Principe de fonctionnement du driver.

  • A chaque impulsion sur l’entrée STEP, le moteur effectue une rotation d’1 pas (ou 1/2 pas ou ... cf précédemment).
  • la broche DIR permet de contrôler le sens de rotation (en la mettant à 0 ou 1).
  • il faudra donc envoyer un signal carré sur STEP (chaque impulsion correspond au déplacement d’un pas) et maintenir la broche DIR à 1 ou 0 suivant le sens de rotation souhaité

- Exemple de branchement :

PNG - 74.4 ko
https://www.pololu.com/product/2132/

(avec un condensateur aux bornes de l’alimentation)

- Réglage du courant maxi à l’aide du potentiomètre.

Grâce au réglage de limitation de courant, on peut utiliser des tensions d’alimentations supérieures aux spécifications du moteur (par exemple, le moteur 14HS11-1004S qui est donné pour 3,5V fonctionne correctement avec une alimentation du driver à 12V, du moment que le courant maxi soit réglé).

Voir la méthode de réglage sur le site de POLOLU ou dans la vidéo suivante

La méthode en résumé/simplifié  : moteur débranché, on mesure au voltmètre Vref par rapport à la masse (Vref est accessible via un trou traversant). Le courant maxi est défini par Imax=2xVref (Imax en A, Vref en V). On régle le potentiomètre pour obtenir Vref voulu.
Ensuite, on branche le moteur (maintenu à l’arrêt, pas de commande STEP) et on vérifie l’intensité sur une des phases. Si besoin, on la règle à nouveau avec le potentiomètre.

JPEG - 268.1 ko

Le schéma de câblage.

JPEG - 715.8 ko
Schéma avec plaque d’essai
JPEG - 661.7 ko
Schéma avec shield

Programmes Arduino.

La carte utilisée dans le schéma précédent est une carte LEONARDO mais le fonctionnement est le même avec une carte UNO.

Exemple 1 : programme permettant de faire tourner le moteur dans le sens "positif" en pas entiers. On génère dans cet exemple une impulsion sur la broche 4 (STEP) de période T=7000us. La fréquence du signal STEP est de 142,85 Hz, c’est à dire environ 143 pas par seconde.

  1. int STEP = 4;
  2. int DIR = 3;
  3. int DureePas = 7000; // durée d'un pas en us
  4.  
  5. void setup() {
  6. pinMode(STEP, OUTPUT);
  7. pinMode(DIR, OUTPUT);
  8. }
  9.  
  10. void loop() {
  11. digitalWrite(DIR, 0); // sens de rotation
  12.  
  13. digitalWrite(STEP, 1);
  14. delayMicroseconds(DureePas/2);
  15. digitalWrite(STEP, 0);
  16. delayMicroseconds(DureePas/2);
  17. }

Télécharger

Le programme en détail :
Dans un premier temps, on déclare les variables :
- STEP de type entier (integer => int) qui correspondra à la valeur 4. Ainsi, à chaque fois que l’on a besoin d’indiquer le numéro de broche "4", on utilisera STEP à la place. Cela sert juste à simplifier la lecture du programme.
- DIR de type entier (integer => int) qui correspondra à la valeur 3. Ainsi, à chaque fois que l’on a besoin d’indiquer le numéro de broche "3", on marquera DIR. Cela sert juste à simplifier la lecture du programme.
- DureePas de type entier (integer => int) : c’est la période du signal carré STEP. Cette durée est en microsecondes.

  1. int STEP = 4;
  2. int DIR = 3;
  3. int DureePas = 7000; // durée d'un pas en us

Télécharger

- Ensuite, on entre dans la fonction void setup() qui ne s’exécute qu’une seule fois lors du démarrage du programme.
- PinMode(broche,OUPUT) permet de configurer une broche en sortie. Les broches STEP (4) et DIR (3) sont configurées en sortie ci-dessous

  1. void setup() {
  2. pinMode(STEP, OUTPUT);
  3. pinMode(DIR, OUTPUT);
  4. }

Télécharger

- on entre ensuite dans la boucle infinie void loop() qui se répète à l’infini.

  1. void loop() {
  2. ...
  3. }

Télécharger

- on fixe le sens de rotation en mettant à 0 la broche DIR. (si on souhaite tourner dans l’autre sens, il faudra mettre la broche à 1 (digitalWrite(DIR, 1) ; )

  1. digitalWrite(DIR, 0); // sens de rotation

- enfin, on génère une impulsion qui va provoquer le déplacement d’un pas du moteur

  • mise à 1 de la broche STEP
  • pause de DureePas/2
  • mise à 0 de la broche STEP
  • pause de DureePas/2
    1. digitalWrite(STEP, 1);
    2. delayMicroseconds(DureePas/2);
    3. digitalWrite(STEP, 0);
    4. delayMicroseconds(DureePas/2);

    Télécharger

    JPEG - 60.3 ko

    Exemple 2 : un programme qui permet de faire 250 pas dans un sens en vitesse rapide, puis 250 pas dans l’autre sens en vitesse plus lente.
    Pour cela, on utilise une variable de type entier n qui permettra de compter le nombre de pas effectués.

    1. int STEP = 4;
    2. int DIR = 3;
    3. int n;
    4. int DureePas; // durée d'un pas en us
    5.  
    6. void setup() {
    7. // put your setup code here, to run once:
    8. pinMode(STEP, OUTPUT);
    9. pinMode(DIR, OUTPUT);
    10. }
    11.  
    12. void loop() {
    13. // put your main code here, to run repeatedly:
    14. digitalWrite(DIR, 0); // sens 1
    15. DureePas = 7000;
    16. n = 0;
    17. while (n < 250) {
    18. digitalWrite(STEP, 1);
    19. delayMicroseconds(DureePas / 2);
    20. digitalWrite(STEP, 0);
    21. delayMicroseconds(DureePas / 2);
    22. n = n + 1;
    23. }
    24. digitalWrite(DIR, 1); // sens 2
    25. DureePas = 10000;
    26. while (n >= 0) {
    27. digitalWrite(STEP, 1);
    28. delayMicroseconds(DureePas / 2);
    29. digitalWrite(STEP, 0);
    30. delayMicroseconds(DureePas / 2);
    31. n = n - 1;
    32. }
    33. }

    Télécharger


    Exemple 3 : on va maintenant améliorer ce programme en utilisant une fonction Motor(Npas,sens,DureePas) qui pourra nous faire un nombre de pas voulu Npas, dans le sens voulu sens avec la durée d’un pas égale à DureePas. Le programme suivant aura le même fonctionnement que l’exemple 2.

  1. int STEP = 4;
  2. int DIR = 3;
  3.  
  4. void Motor(int Npas, int sens, int DureePas) {
  5. int i;
  6. digitalWrite(DIR, sens);
  7. for (i = 0; i < Npas; i++) {
  8. digitalWrite(STEP, 1);
  9. delayMicroseconds(DureePas / 2);
  10. digitalWrite(STEP, 0);
  11. delayMicroseconds(DureePas / 2);
  12. }
  13. }
  14.  
  15. void setup() {
  16. // put your setup code here, to run once:
  17. pinMode(STEP, OUTPUT);
  18. pinMode(DIR, OUTPUT);
  19. }
  20.  
  21. void loop() {
  22. Motor(250, 0, 7000);
  23. Motor(250, 1, 10000);
  24. }

Télécharger


Exemple 4 : Si le mouvement du moteur est limité par des fins de course, il sera indispensable de vérifier à chaque pas si un fin de course est atteint. Ainsi, nous nous limiterons à une fonction qui ne réalise que le déplacement d’un pas MotorStep(sens,DureePas) dans le sens voulu sens avec la durée du pas égale à DureePas. (Le programme suivant utilise cette fonction mais ne scrute pas les fins de course qui dépende de la mise en oeuvre voulue et qui pourront être ajoutés dans les conditions des structures while).

  1. int STEP = 4;
  2. int DIR = 3;
  3. int n;
  4.  
  5. void MotorStep( int sens, int DureePas) {
  6. digitalWrite(DIR, sens);
  7. digitalWrite(STEP, 1);
  8. delayMicroseconds(DureePas / 2);
  9. digitalWrite(STEP, 0);
  10. delayMicroseconds(DureePas / 2);
  11. }
  12.  
  13. void setup() {
  14. // put your setup code here, to run once:
  15. pinMode(STEP, OUTPUT);
  16. pinMode(DIR, OUTPUT);
  17. }
  18.  
  19. void loop() {
  20. n = 0;
  21. while (n < 250) {
  22. MotorStep(0, 7000);
  23. n = n + 1;
  24. }
  25. while (n > 0 ) {
  26. MotorStep(1, 10000);
  27. n = n - 1;
  28. }
  29. }

Télécharger

SPIP | | Plan du site | Suivre la vie du site RSS 2.0
Habillage visuel © digitalnature sous Licence GPL