- Messaggi: 353
- Ringraziamenti ricevuti 8
motori passo-passo
2 Anni 9 Mesi fa #1
da elpablito
motori passo-passo è stato creato da elpablito
Buon giorno
Ho fatto una schedina per pilotare tra le altre cose degli stepper da montarsi sui miei robottini e mi sono imbattuto nel solito puzle a cui non so a chi attribuire le colpe.
Eccolo: uso un driver DVR8825 impostato per 16 microstep connesso a umo stepper da 7,5 gradi/step a cui non è connesso nulla ed è alimentato a 24V. Programmino da manuale giusto per vedere come gira lo stepper.
*/
#include <Arduino.h>
#include "AccelStepper.h"
// Definisce gli stepper usati e gli eventuali pin associati
// definire i pin di fine corsa degli stepper, da scegliersi tra A2 e A5 su J6
#define end1 14 // PIN A0
//#define end2 17 // PIN A3
//#define end3 18 // PIN A4
#define enablePin 8 // pin di on/off degli stepper
AccelStepper stp1(1, 6, 7); // (Type:driver, STEP, DIR) - stepper M1
//AccelStepper stp2(1, 4, 5); // Stepper M2
//AccelStepper stp3(1, 3, 2); // Stepper M3
long pippo;
void setup() {
pinMode(enablePin, OUTPUT); // abilito il DRV anche se ha un pulldown interno
digitalWrite(enablePin, LOW);
pinMode(end1, INPUT_PULLUP); // abilito fine corsa
// ritorno lentamente fino a chiudere il fine corsa
stp1.setMaxSpeed(300.0);
stp1.setSpeed(-10);
do
{
stp1.runSpeed();
} while (digitalRead(end1 ) != 0);
stp1.stop(); // fermo tutto
stp1.setCurrentPosition(0); // resetto il contatore
// reimposto i dati
stp1.setMaxSpeed(300.0);
stp1.setAcceleration(100.0);
stp1.moveTo(384); // un giro (microstep 16)
}
void loop() {
if (stp1.distanceToGo() == 0){ // se è arrivato
pippo = stp1.currentPosition(); // Per debug
delay(100); // per debug
stp1.moveTo(-stp1.currentPosition()); //ritorna degli stessi passi
//stp1.moveTo(0); //per debug
}
stp1.run();
// stepper2.run();
// stepper3.run();
}
Il motore gira lentamente all'indietro chiude il fine corsa, cambia velocità e continua a fare un giro avanti e indietro accelerando e decelerando correttamente, ma..
Con l'istruzione " stp1.setCurrentPosition(0);" azzerando il contatore credevo di aver definito il
punto di partenza l'HOME tanto per capirci del sistema. Il contatore in effetti si resetta poi dovrebbe contare 348 passi e lo stepper fare un giro per poi ritornare di 348 passi quindi da dove è partito. Invece resetta il contatore dice di contare 348 passi lo stepper fa mezzo giro invece del giro completo poi correttamente ritorna di 348 passi facendo un giro completo e poi non sbaglia più.
Se però alla fine del primo conteggio dei 348 passi (il primo mezzo giro) gli dico "stp1.moveTo(0);" lui ritorna al punto dove aveva chiuso il finecorsa e azzerato il contatore, ritorna di mezzo giro. Il quesito è quindi a chi attribuire la colpa che al primo conteggio in contatore di accellStepper conta 348 ma lo stepper fa solo mezzo giro.
Saluti Paolo
Ho fatto una schedina per pilotare tra le altre cose degli stepper da montarsi sui miei robottini e mi sono imbattuto nel solito puzle a cui non so a chi attribuire le colpe.
Eccolo: uso un driver DVR8825 impostato per 16 microstep connesso a umo stepper da 7,5 gradi/step a cui non è connesso nulla ed è alimentato a 24V. Programmino da manuale giusto per vedere come gira lo stepper.
*/
#include <Arduino.h>
#include "AccelStepper.h"
// Definisce gli stepper usati e gli eventuali pin associati
// definire i pin di fine corsa degli stepper, da scegliersi tra A2 e A5 su J6
#define end1 14 // PIN A0
//#define end2 17 // PIN A3
//#define end3 18 // PIN A4
#define enablePin 8 // pin di on/off degli stepper
AccelStepper stp1(1, 6, 7); // (Type:driver, STEP, DIR) - stepper M1
//AccelStepper stp2(1, 4, 5); // Stepper M2
//AccelStepper stp3(1, 3, 2); // Stepper M3
long pippo;
void setup() {
pinMode(enablePin, OUTPUT); // abilito il DRV anche se ha un pulldown interno
digitalWrite(enablePin, LOW);
pinMode(end1, INPUT_PULLUP); // abilito fine corsa
// ritorno lentamente fino a chiudere il fine corsa
stp1.setMaxSpeed(300.0);
stp1.setSpeed(-10);
do
{
stp1.runSpeed();
} while (digitalRead(end1 ) != 0);
stp1.stop(); // fermo tutto
stp1.setCurrentPosition(0); // resetto il contatore
// reimposto i dati
stp1.setMaxSpeed(300.0);
stp1.setAcceleration(100.0);
stp1.moveTo(384); // un giro (microstep 16)
}
void loop() {
if (stp1.distanceToGo() == 0){ // se è arrivato
pippo = stp1.currentPosition(); // Per debug
delay(100); // per debug
stp1.moveTo(-stp1.currentPosition()); //ritorna degli stessi passi
//stp1.moveTo(0); //per debug
}
stp1.run();
// stepper2.run();
// stepper3.run();
}
Il motore gira lentamente all'indietro chiude il fine corsa, cambia velocità e continua a fare un giro avanti e indietro accelerando e decelerando correttamente, ma..
Con l'istruzione " stp1.setCurrentPosition(0);" azzerando il contatore credevo di aver definito il
punto di partenza l'HOME tanto per capirci del sistema. Il contatore in effetti si resetta poi dovrebbe contare 348 passi e lo stepper fare un giro per poi ritornare di 348 passi quindi da dove è partito. Invece resetta il contatore dice di contare 348 passi lo stepper fa mezzo giro invece del giro completo poi correttamente ritorna di 348 passi facendo un giro completo e poi non sbaglia più.
Se però alla fine del primo conteggio dei 348 passi (il primo mezzo giro) gli dico "stp1.moveTo(0);" lui ritorna al punto dove aveva chiuso il finecorsa e azzerato il contatore, ritorna di mezzo giro. Il quesito è quindi a chi attribuire la colpa che al primo conteggio in contatore di accellStepper conta 348 ma lo stepper fa solo mezzo giro.
Saluti Paolo
Si prega Accedi o Crea un account a partecipare alla conversazione.
- elpablito
- Autore della discussione
- Platinum Member
Riduci
Di più
2 Anni 9 Mesi fa - 2 Anni 9 Mesi fa #2
da elpablito
Risposta da elpablito al topic motori passo-passo
buon giorno
era chiaro fin dal principio che c'era un errore grossolano bisognava solo trovarlo. Ma è banale, per fare un giro con un motore da 7.5 gradi/step servono 360/7,5 = 48 step Se microstep eguale a 16 gli impulsi diventano 48x16 = 768 Avendo invece impostato 384, il motore fa giustamente mezzo giro poi cicla tra 384 e il suo negato e quindi fa 768 passi cioé un giro.
Saluti Paolo
era chiaro fin dal principio che c'era un errore grossolano bisognava solo trovarlo. Ma è banale, per fare un giro con un motore da 7.5 gradi/step servono 360/7,5 = 48 step Se microstep eguale a 16 gli impulsi diventano 48x16 = 768 Avendo invece impostato 384, il motore fa giustamente mezzo giro poi cicla tra 384 e il suo negato e quindi fa 768 passi cioé un giro.
Saluti Paolo
Ultima Modifica 2 Anni 9 Mesi fa da elpablito. Motivo: errore
Si prega Accedi o Crea un account a partecipare alla conversazione.
- elpablito
- Autore della discussione
- Platinum Member
Riduci
Di più
- Messaggi: 353
- Ringraziamenti ricevuti 8
Moderatori: Mauro Laurenti, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.