Contrôler un moteur pas à pas avec un motor driver DM556

Bonjour à tous,

Je cherche à faire tourner un moteur à la vitesse de 12tours/min en utilisant une arduino Uno (nano possible ?) ainsi qu'un motor driver DM556.

Datasheets :

Moteur 17HD48002-22B : https://us.amazon.com/Zyltech-Stepper-Motor-Connector-Printer/dp/B01GNAGJI2?_encoding=UTF8&psc=1

DM556 : Driver pour moteur pas à pas - SOPROLEC - dm556

DM556 User Manual (minimum 1.4A) : http://www.leadshine.com/UploadFile/Down/DM556m.pdf

Sur le driver, j'ai choisi un courant max de 1.4A (réglable avec les petits switch)

Je le fais tourner avec le code suivant :

//int reverseSwitch = 2; 
int driverPUL = 6;    // PUL- pin
int driverDIR = 7;    // DIR- pin
int spd = A0;     // Potentiometer

// Variables

int pd = 3000;       // Pulse Delay period
boolean setdir = LOW; // Set Direction

void setup() {

  pinMode (driverPUL, OUTPUT);
  pinMode (driverDIR, OUTPUT);
}

void loop() {
    digitalWrite(driverDIR,setdir);
    digitalWrite(driverPUL,HIGH);
    delayMicroseconds(pd);
    digitalWrite(driverPUL,LOW);
    delayMicroseconds(pd);
}

Ce code fait bien tourner le moteur à 12tours/min (1tour/5sec) et il tire 0.45A en rotation. Le souci c'est que le moteur chauffe fort. En effet, à l'oscilloscope on mesure des tensions aux bornes des bobines de l'ordre de la tension d'alimentation du driver soit 20 à 50VDC. On a donc 10W minimum dans le moteur et il chauffe rapidement et fortement jusqu'à être trop chaud au toucher.

Besoin de vos avis experts :slight_smile:
Est-ce le driver qui est inadapté ?

hello
as tu essayé en commandant "EN" du driver

tu valides le driver par "EN" avant d'envoyer les pulses
et tu dévalides le driver juste après la fin des "PULSES"

Salut dfgh,

Non je n'ai pas essayé en commandant "EN" car si l'on ne le commande pas il est toujours activé.
C'est une bonne remarque puisque cela veut dire que le courant circule toujours dans le moteur d'où un chauffe importante.

Je teste cela et je reviens vers toi.

Non, commander le "EN" ne fonctionne pas. Cela saccade la rotation.
Quand je fais tourner le moteur à la vitesse de 12rpm avec la tension de 24V, il consomme 0.3A (la limite si 1.4A) donc il fait 7.2W. Si je baisse la tension à 20V (tension minimale du pilote), il consomme alors 0.36A pour à nouveau 7.2W. Comment pourrions-nous expliquer cela ?

Nous ne nous sommes pas compris.
Tu valides EN avant de faire démarrer le moteur et tu devallides EN lorsque le moteur a terminé sa rotation.
.
Tu ne touches pas EN entre les pulses, seulement avant le début du mouvement et après la fin du mouvement.

Ah, je vois. Pour le moment, je fais un prototype qui doit seulement tourner à 12tr/min donc ce n'est pas nécessaire. D'ailleurs, j'ai mis le Switch 4 en OFF pour avoir une réduction du courant de maintien (en arrêt) de 60%..

Lien sur le moteur (utiliser la balise lien)

Ce code fait bien tourner le moteur à 12tours/min (1tour/5sec) et il tire 0.45A en rotation. Le souci c'est que le moteur chauffe fort. En effet, à l'oscilloscope on mesure des tensions aux bornes des bobines de l'ordre de la tension d'alimentation du driver soit 20 à 50VDC. On a donc 10W minimum dans le moteur et il chauffe rapidement et fortement jusqu'à être trop chaud au toucher.

Le driver utilisé hache la tension pour que le courant s'établisse à la valeur de consigne. Quelle que soit la tension d’alimention du driver, le driver va mettre la tension maximale (pour faire augmenter le courant, ou une tension nulle (pour faire décroitre le courant lentement) ou une tension en inverse (décroissance rapide du courant). Et ce même si le moteur est arrêté. A l'oscillo on doit voir quel que soit le fonctionnement, du 0V, Valim et -Valim. En principe, les moteurs supportent des tension de l'ordre de 50 à 80V, c'est donc normal.

Ce n'est pas parce que la tension est de 24V aux bornes du moteur, qu'il est en surcharge. Car ces 24V ne sont que des impulsions et le courant n'a pas le temps de dépasser les 1,77A. Pour s'en convaincre, on peut mesurer à l'oscillo la tension moteur arrêté et avec un multimètre la tension moyenne.

Le moteur est un 1,77A, 1.8ohms, au nominal, il dissipe P=R.I2 soit 5,7W par phase, le double pour les deux phases, Avec un réglage à 1,4A il doit dissiper à l'arrêt environ 5W. En rotation, on peut compter sur 60% en plus, et les mesures que tu as faites sont correctes et normales.

Pour l'échauffement, si c'est un moteur bas de gamme (classe A), la température peut atteindre 100°C à l'intérieur, avec une différence de 30°C généralement admise entre les enroulements et la carcasse, et en réservant 10°C pour les points chauds, la carcasse devrait être à 60°C en fonctionnement normal. On peut donc cuire un steak, les pas à pas sont des moteurs qui fonctionnent chaud. Certains pas à pas peuvent aller jusqu'à 180°C en interne, soit 140° sur le boitier!

Quand je fais tourner le moteur à la vitesse de 12rpm avec la tension de 24V, il consomme 0.3A (la limite si 1.4A) donc il fait 7.2W. Si je baisse la tension à 20V (tension minimale du pilote), il consomme alors 0.36A pour à nouveau 7.2W. Comment pourrions-nous expliquer cela ?

Réglage à 1,4A si on l'alimente en continu, cela va dissiper 5W. Avec une alim à découpage (le driver), ce sera un peu plus, et si il touren c'est encore un peu plus, et on tombe sue 7,2W. c'est normal. Le moteur est alimenté en courant (de driver, dans la mesure du possible) s'arrange pour maintenir le courant à la bonne valeur. Si on change la tension d'alimentation, le driver conduira plus ou moins longtemps, maintiendra le même courant, et on aura donc toujours la même puissance dans le moteur.

Avec 12V, 24V, ou 48V, on tire donc toujours la même puissance.

Le courant dans le moteur ne change pas, par contre l'alimentaion verra moins de courant si la tension augmente. La mesure 0,3A est la mesure de l'alimentaion et pas celle du moteur (difficilement accessible si il tourne car la moyenne est nulle...)

Merci pour ces précieuses informations, j'ai fait des mesures hier sur le moteur et j'ai compris plusieurs choses qui rejoignent tes remarques :

  • J'ai visualisé à l'oscilloscope que le courant dans les bobines est de forme sinusoïdale de valeur max 1.5A (le 1.4A configuré avec les switches). Les tension aux bornes des bobines est bien hachée avec un rapport cyclique augmentant avec le forme de la sinusoïde (Courant intégrale de la tension par la formule de la tension aux bornes d'une bobine ?)

-Lorsque le moteur est arrêté/en maintien, le courant aux bornes des bobines devient continu à la valeur efficace du courant de fonctionnement (soit Imax/1.4=1.04A). Pour limiter la chauffe et si l'application ne demande pas un maintien conséquent, il est possile de réduire cette valeur efficace de 60% (soit Imax*(1-0.6)=Imax*0.4=0.6A) pour limiter la chauffe du moteur.

Le moteur est un classe B.
En effet, la mesure de 0.3A était celle de l'alimentation.

J'ai trouvé un driver du même genre avec une tension d'alimentation de 9V jusqu'à 42V et un courant pic de 0.5A jusqu'à 3.5A. Ne serait-il pas mieux d'utiliser ce driver ?

Aussi concernant la vitesse du moteur, j'ai mesuré une rotation de 1tours/5sec avec une période des pulse (temps haut + temps bas, rapport cyclique de 50%) de 6ms soit 166Hz avec un microstep de 400pulse/rev donc en Half Step mode (200pulse/rev de base).

Y'aurait-il moyen de calculer la vitesse du moteur à l'aide de la fréquence des pulse ?

Edit : j'ai trouvé en 3 secondes :stuck_out_tongue_closed_eyes: , je me demande même pourquoi j'ai posé la question.

Tout marche parfaitement et je comprendre mieux le fonctionnement du driver grâce à vous, merci d'avoir pris de votre temps pour partager vos connaissances.

  • J'ai visualisé à l'oscilloscope que le courant dans les bobines est de forme sinusoïdale de valeur max 1.5A (le 1.4A configuré avec les switches). Les tension aux bornes des bobines est bien hachée avec un rapport cyclique augmentant avec le forme de la sinusoïde (Courant intégrale de la tension par la formule de la tension aux bornes d'une bobine ?)

Si on n'a pas une vitesse importante l'inductance intervient peu (surtout que la tension du moteur est de l'ordre de 3V et que la tension d'alim est de 20V). Aux faibles vitesses, on atteint le courant assez rapidement. Du coup le courant est proportionnel à la tension moyenne.

Le moteur est un classe B.

La température peut aller jusqu'à 130°C soit environ 90°C sur la carcasse maxi.

il est possible de réduire cette valeur efficace de 60% (soit Imax*(1-0.6)=Imax*0.4=0.6A) pour limiter la chauffe du moteur.

Le couple est sensiblement proportionnel au courant, en réduisant le courant à l'arrêt à 40%, on diminue fortement l’échauffement (proportionnel au carré du courant soit réduction à 16%), mais le couple n'est réduit qu'à 40%. Ce qui n'est pas grave car à l'arrêt, on n'a plus besoin de vaincre les frottement sec et les inerties; et même les frottements sec vont aider au maintien en position.

J'ai trouvé un driver du même genre avec une tension d'alimentation de 9V jusqu'à 42V et un courant pic de 0.5A jusqu'à 3.5A. Ne serait-il pas mieux d'utiliser ce driver ?

celui que tu utilise permet le passage du courant nominal et peut être alimenté jusqu'en 45V. Les caractéristiques sont voisines.

Pour travailler avec des vitesses lentes, la tension d'alimentation importe moins. C'est intéressant de monter la tension d'alimentation pour des vitesses au delà de 200tr/mn. Monter le courant permet d'avoir plus de couple, mais échauffe le moteur. On considère que diminuer la température de 10°C double la durée de vie du moteur.

Aussi concernant la vitesse du moteur, j'ai mesuré une rotation de 1tours/5sec avec une période des pulse (temps haut + temps bas, rapport cyclique de 50%) de 6ms soit 166Hz avec un microstep de 400pulse/rev donc en Half Step mode (200pulse/rev de base).

Y'aurait-il moyen de calculer la vitesse du moteur à l'aide de la fréquence des pulse ?

Je ne suis pas sûr d'avoir les bons chiffres

Si on est à 166Hz dans une bobine,il y a 4 vrais pas entiers faits par "sinusoïde", ce qui fait 166*4=664 pas par seconde. Avec un moteur 200pas/tr, cela fait 3tr/s. Si on passe en microsteps, cela "améliore" la sinusoïde, on a plus de microspas, mais on a toujours 4 vrais pas entiers par période.

Si les 166Hz est la fréquence du hachage, on ne peut rien calculer (à l'arrêt on a le hachage, mais pas d'impulsions).

Concernant la vitesse du moteur cela se trouve facilement :

Vitesse rotation visée : 12tours/min = 1tour/5sec
Step mode utilisé : 400pulse/tour

Configuration désirée : 400pulse/5sec = 1pulse/12.5ms

Le signal pulse étant carré de rapport cyclique 50% (envoyé par l'Arduino), il suffit de mettre un temps haut et bas de 6.25ms.

Mon code final ressemble donc à cela :

//Titre : Contrôle moteur par microstep drive DM556 24V 0.3A 400pulse/rev


int driverPUL = 7;    // PUL- pin
int driverDIR = 6;    // DIR- pin
int pulse_time = 6250; /*400pulse/rev donc 5sec/400pulse 
                        donc 1pulse/12.5ms soit un temps à l'état haut et état bas (50%) de 6.25ms*/

void setup() {

  pinMode (driverPUL, OUTPUT);
  pinMode (driverDIR, OUTPUT);

  digitalWrite(driverDIR, LOW); //Sens horaire
}

void loop() {
  digitalWrite(driverPUL, HIGH);
  delayMicroseconds(pulse_time);
  digitalWrite(driverPUL, LOW);
  delayMicroseconds(pulse_time);
}

Enfin, concernant le choix d'un driver avec tension d'alimentation minimale de 9V, cela me serait surtout utile car je rentre dans la plage d'alimentation de l'Arduino et je peux ainsi alimenter l'Arduino et le driver avec une seule alimentation.

Grâce à toi, j'ai beaucoup mieux compris comment fonctionne un moteur pas à pas ainsi qu'une driver tel que le DM556.

Concernant la vitesse du moteur cela se trouve facilement...[]

Je me suis posé la question du signal envoyé par l'arduino. Le dernier calcul est bon, mais on n'a pas les 166Hz...

Enfin, concernant le choix d'un driver avec tension d'alimentation minimale de 9V, cela me serait surtout utile car je rentre dans la plage d'alimentation de l'Arduino et je peux ainsi alimenter l'Arduino et le driver avec une seule alimentation.

Plus la tension est basse, plus le couple va chuter rapidement. Mais pour des vitesses lentes de l'ordre de 0,2tr/s, je ne crois pas que cela se sente beaucoup. Cela ne va pas changer beaucoup non plus l'échauffement.

Le courant dans une seule bobine est donné à 1,77A. Pour profiter du courant nominal il faut régler le DM556 ou son équivalent racine de 2 fois plus fort (il y a deux enroulements en jeu). Soit à 2,5A. C'est d'ailleurs dit dans la doc:

Connections to 4-lead Motors:
4 lead motors are the least flexible but easiest to wire. Speed and torque will depend on winding inductance. In setting the Driver output current, multiply the specified phase current by 1.4 to determine the peak output current.

Maintenant réduire le courant permet de réduire l’échauffement.

Note aussi que le rapport cyclique en provenance de l'arduino n'a pas besoin d'avoir un rapport cyclique de 50%, seule la fréquence joue, à condition d'avoir des temps haut ou bas d'au moins 2,5µs (une seule tempo suffirait).