Les posts sur les moteurs pas à pas sont nombreux sur le forum mais peu de tutos
Driving Stepper Motor with Interrupt
**• En effet, il existe 3 types de drivers pour moteur pas à pas : **
- Drivers juste amplificateur de courant (transistors avec hacheur) mais il faut que le processeur commande chaque bobine et gère le courant de chaque bobine via 2 PWM ce qui n’est pas très intéressant.
- Driver ou on injecte juste une fréquence et à chaque impulsion correspond 1 pas ou demi-pas avec paramétrage par switchs du driver et état logique pour choisir le sens, ou l’arrêter tel que DRV8825
GitHub - RobTillaart/DRV8825: Arduino library for DRV8825 stepper motor driver - Driver commander par une liaison série (SPI) pour effectuer ce qu’on lui demande tel que DRV8434S avec differents mode pas à micropas…
GitHub - pololu/drv8434s-arduino: Pololu Arduino library for DRV8434S stepper motor driver with SPI interface
donc la programmation est différentes pour les 3
De plus, il y a un souvent un paradoxe sur la commande du moteur pas à pas qui est un moteur relativement lent mais dans une table traçante, on aimerait qu’il soit le plus rapide possible mais sans perte de pas.
par contre, le moteur pas à pas permet de faire une vitesse tres lente et tres precise (mode demi pas ou micro pas) sans reducteur à engrenages.
Sur ce post, nous allons se tenir à la programmation pour contrôler le moteur en générant une fréquence avec un timer en routine d’interruption avec différents objectifs :
- En commandant sa vitesse par 2 boutons poussoirs,
- Puis demander un position en limitant à une certaine vitesse,
- Pour vérifier, la programmation, en utilisant un potentiomètre multi tour qui sera mis sur l’arbre moteur pour vérifier la position effectuée
- Faire un profil trapézoïdal de vitesse avec certaine accélération pour effectuer un positionnement désiré
- ….
Il est possible de simuler la programmation du moteur pas à pas avec ISIS, mais on n’a pas la vitesse du moteur.
ISIS permet de visualiser les entrées et les sorties
Nous allons utiliser un Arduino nano, mais pourquoi pas un ESP32….pour faire un tuto
**
**
Un debut de programmation pour commander le moteur en frequence
//#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <TimerOne.h>
#define led13 13 // 13
unsigned int temps=0; // Frequence=1/ (T2*0.1ms*2)
unsigned int T2=10; // si T2=10 Frequence=1/(10*0.1ms*2)=500Hz
// si T2=100 Frequence=1/(100*0.1ms*2)=50Hz
float Vbatt;
bool Start=0;
bool direct=0;
void callback() { //0.1ms
temps++;
if (Start==1 && temps>=T2 && digitalRead(7)==1) {digitalWrite(7,0);temps=0;}
if (Start==1 && temps>=T2 && digitalRead(7)==0) {digitalWrite(7,1);temps=0;}
} //fin callback
void setup() {
pinMode (2, INPUT_PULLUP); //incrementation
pinMode (3, INPUT_PULLUP); //decrementation
pinMode (4, INPUT_PULLUP); //start
pinMode (5, INPUT_PULLUP); //sens horaire et antihoraire Direction pin
pinMode(led13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(7, OUTPUT); //clock
//Serial.begin(115200);
Serial.begin(57600);
//Serial.begin(19200);
Timer1.initialize(100); // initialize timer1, and set a 0,1 second period => 100 000 pour 0.01s 10 000
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
// Frequence=1/ (T2*0.1ms*2)
// si T2=10 Frequence=1/(10*0.1ms*2)=500Hz
// si T2=100 Frequence=1/(100*0.1ms*2)=50Hz
}
void loop() {
if ( digitalRead(13)== 1 ) {digitalWrite(13,0);} else {digitalWrite(13,1);} //duree du programme 2ms en 57600 bauds
if (digitalRead(5)==0 && direct==1 ) {digitalWrite(12,0);direct=0;delay(300);} //sens horaire
if (digitalRead(5)==0 && direct==0 ) {digitalWrite(12,1);direct=1;delay(300);} //sens anti horaire
if (digitalRead(2)==0) {T2--;delay(100);} //incrementation vitesse
if (digitalRead(3)==0) {T2++;delay(100);} // vitesse
if (T2>1000) {T2=1000;} //Fmini=0.5Hz
if (T2<=1) {T2=1;} //Fmaxi=5000Hz
if ( digitalRead(4)==0 && Start==0 ) {Start=1;delay(200);}
if ( digitalRead(4)==0 && Start==1 ) {Start=0;delay(200);} //stop
Serial.print(temps);Serial.print(";");
Serial.print(T2);Serial.println(";");
} // fin loop
Donc, 3 groupes d’étudiants vont mettre leurs programmations pour faire des tutos pour repondre aux differents objectifs
en image le driver DRI0043 qui est commandable en frequence
en image le driver EM4422S qui est commandable en frequence et en liaison serie
en effet, Il est facile à commander un moteur pas à pas avec une fonctionnement start/stop ou on/off
Connaitre, cette zone de vitesse de fonctionnement sans perte de pas n’est pas si facile car elle dépend du couple de charge qui est peu connu.
Pour connaitre cette zone de vitesse start/stop, il faut faire des changements de direction pour savoir si l’on revient toujours à la position initiale et ne pas avoir de perte de pas. Donc, faire de nombreux essais (apprentissage de la vitesse max)
Donc, il faut un programme qui fasse de la vitesse variable.
Pour atteindre des vitesses au-delà de cette zone de Start stop, il faut un programme qui fasse un profil de mouvement trapézoïdal avec des accélérations constantes ou il faut encore faire de nombreux essais pour vérifier qu’il n’y a pas de perte de pas.
Souvent, les fabricants de moteur et de driver expliquent la relation vitesse et perte de pas
mais il y a aussi des courbes en S de la vitesse pour minimiser les accelerations