control de 2 motores PAP con 4 pulsadores y un potenciometro

hola,
estoy intentando controlar 2 motores PAP con 4 pulasdores y un potenciometro y no funciona bien, para un lado funciona ok pero para el otro no.
estoy utilizando un arduino uno y una shield cnc v3.
el funcionamiento deberia ser el siguiente:
cuando pulsamos un pulsador el motor se mueve en una dirección y a la velocidad que le demos con el potenciometro, cuando dejamos el pulsador el motor se para.
Si pulsamos el otro pulsador el motor deberia girar en sentido contrario y a la velocidad que indiquemos con el potenciometro.
que me pasa, cuando el motor gira en un sentido funciona ok, pero cuando pulso el otro pulsador el motor cambia de sentido, pero va muy despacio y no obedece al potenciometro.
esto me pasa lo mismo en los dos motores.
adjunto codigo

[code]
/*
  Button

  /*control de 2 motors pas a pas mitjançant 2 pulsdors per motor
   * el control de la velocitat es regula amb un portenciometre
   */

// creem les constants on van conectats els pins del arduino.
const int pulsador1 = 9;       // pulsador +X  // final carrera X de la CNC shield
const int pulsador2 = 10;      // pulsador -X  // final carrera Y de la CNC shield
const int pulsador3 = 11;      // pulsador +Z  // final carrera Z de la CNC shield
const int pulsador4 = 12;      // pulsador -Z  // Spindle enable de la CNC shield

const int ledPin1 =  5;       // Pin direccio X
const int ledPin2 =  2;       // Pin pasos x
const int ledPin3 =  7;       // pin direccio Z
const int ledPin4 =  4;       // pin pasos  Z
const int enable = 8;           // pin enable per tots els drivers, ha de estar a nivell baix perque funcioni el driver

// variables que utilizarem
int estatpulsador1  = 0;        // variable on posem el valor llegit del pulsador 1
int estatpulsador2  = 0;        // variable on posem el valor llegit del pulsador 2
int estatpulsador3  = 0;        // variable on posem el valor llegit del pulsador 3
int estatpulsador4  = 0;        // variable on posem el valor llegit del pulsador 4

//int retardo;
//int temps;

void setup() {
  // configurem els pins del led com sortides
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
 // Configurem els polsadors com entrades
  pinMode(pulsador1, INPUT);
  pinMode(pulsador2, INPUT);
  pinMode(pulsador3, INPUT);
  pinMode(pulsador4, INPUT);

  // configurem el pin enable com sortida
  pinMode (enable, OUTPUT);

  Serial.begin(9600);
  
}

void loop() {
  // llegim l'estat dels pulsadors i del potenciometre
  
    int temps = analogRead(A1);       // pin hold de la shield CNC arduino 
    temps = map (temps, 0,1023,100,3000);
    estatpulsador1 = digitalRead(pulsador1);
    estatpulsador2 = digitalRead(pulsador2);
    estatpulsador3 = digitalRead(pulsador3);
    estatpulsador4 = digitalRead(pulsador4);
 
  //Serial.println("valor variable temps");
 // Serial.println(temps);
  
  // si hi ha el polsador 1 apretat s'excuatara aquest if
  if (estatpulsador1 == HIGH) {
    
    digitalWrite(enable, LOW);   // enable motor nivell baix perque funcioni el driver
    digitalWrite(ledPin1, HIGH);   //aquest pin es el que anirà a la direció del driver,(+X) estat HIGH el motor girarà en un sentit i LOW en l'altre.
    digitalWrite(ledPin2, HIGH);   // pin que anira el step del driver
    delayMicroseconds(temps);
    //delay (temps);
    digitalWrite(ledPin2, LOW);
    //delay (temps);
    delayMicroseconds(temps);
    Serial.println(" variable temps ");
    Serial.println(temps);

    
  } /*else {
    // si no esta el polsador apretat apaguem tots els leds
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(enable, HIGH);
   
  }*/

  if (estatpulsador2 == HIGH) {
   
    digitalWrite(enable, LOW);
    digitalWrite(ledPin1, LOW);  // pin direcció driver (-X)
    digitalWrite(ledPin2, HIGH); // pin step del driver
    delayMicroseconds(temps);
    //delay (temps);
    digitalWrite(ledPin2, LOW);
    delayMicroseconds(temps);
    //delay (temps);
    
  }
 /* else{
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(enable, HIGH);
  }*/

 if (estatpulsador3 == HIGH) {
   
    digitalWrite(enable, LOW);   // pin enable nivell baix perque funcioni el driver
    digitalWrite(ledPin3, HIGH);  //aquest pin es el que anirà a la direció del driver,(+Z) estat HIGH el motor girarà en un sentit i LOW en l'altre.
    digitalWrite(ledPin4, HIGH); // pin que anira el step del driver
    delayMicroseconds(temps);
    //delay (temps);
    digitalWrite(ledPin4, LOW);
    //delay (temps);
    delayMicroseconds(temps);
    Serial.println(" variable temps ");
    Serial.println(temps);

    
  } /* else {
    // si no esta el polsador apretat apaguem tots els leds
    digitalWrite(enable, HIGH);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
   
  }
  */

  if (estatpulsador4 == HIGH) {
    
    digitalWrite(enable, LOW);
    digitalWrite(ledPin3, LOW);     // pin direcció driver (-Z)
    digitalWrite(ledPin4, HIGH);    // step driver Z
    delayMicroseconds(temps);
   // delay (temps);
    digitalWrite(ledPin4, LOW);
    delayMicroseconds(temps);
    //delay (temps);
    
  } /*else {
    // apaguem el driver
    digitalWrite(enable, HIGH);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
    
  }*/
   if (estatpulsador1 && estatpulsador2 &&estatpulsador3 && estatpulsador4 == LOW) {
    digitalWrite(enable, HIGH);
    
   }
   

}

[/code]

bueno parece que ya esta solventado, por lo que he visto son con un osciloscopio, en un sentido el driver recivia aproximadamente 1 pulso cada 25us y en el otro un pulso cada 25ms, por eso iva tan despacio.
La única diferencia entre las 2 sentencias if de los pulsadores, era que en una había un serial print para ver los datos de la variable que temporizaba y en el otro no.
comentar estas dos lineas para imprimir los datos por el serial print y perfecto.
El problema en principio esta solucionado pero aún no se como puede afectar tanto esta instrucción si solo son dos instrucciones más?
a ver si alguien me lo podria aclarar.
gracias.

Saludos, el tiempo de ejecución de las instrucciones es muy importante cuando se desarrolla un proyecto, pero rara vez la gente suele pensar en ellos, por ejemplo, en una aplicación para una teleoperadora, debes controlar todo tiempo de conexión con la base de datos, para que la teleoperadora pueda atender rápidamente el teléfono, no hay tiempo que perder

Haz una pequeña experimentación

  • vuelve a colocar las líneas de código
  • Antes de ella lee milis y los almacenas
  • Después de ella lee milis y los almacenas en otra variable
  • imprime el tiempo total que ha transcurrido

Si el tiempo que ha transcurrido es ligeramente superior a lo que ganaste (leer los milis consume también tiempo), era eso efectivamente

Si no, hay algo más implicado

Así sales de dudas totalmente

PD: Durará diferente en un UNO que en un DUE, por ejemplo, por la velocidad del reloj y la del procesador

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.