Pages: [1]   Go Down
Author Topic: Problema de velocidad o sincronización con motor a alta velocidad  (Read 444 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Saludos

Este es mi primer tópico así que saludos a todos. Tenemos un proyecto de un motor con tres bobinas que hace girar un rotor con 12 imanes. A baja velocidad todo va bien pero cuando alcanza unas 100 RPM empieza a frenarse. No se porque no alcanza más velocidad. O el código no traduce los ticks de manera correcta (no creo porque a baja velocidad va bien), o el arduino no puede alcanzar a leer y disparar las bobinas lo suficientemente rápido. No se, porque son 2048 ticks del encoder y 36 pulsaciones de las bobinas por revolución, por lo que no debería de tener problemas. Lo que pienso es que el código no está bien depurado ya que soy muy novato con esto de la programación. Os dejo el código por si alguien pudiese ayudarme:

/* read a rotary encoder with interrupts
   Encoder hooked up with common to GROUND,
   encoder0PinA to pin 2, encoder0PinB to pin 4 (or pin 3 see below)
   it doesn't matter which encoder pin you use for A or B 

   uses Arduino pullups on A & B channel outputs
   turning on the pullups saves having to hook up resistors
   to the A & B channel outputs

*/
#include <digitalWriteFast.h>;


#define encoder0PinA  2        // Definimos pines de entrada (Canal A y B del encoder y el potenciometro)
#define encoder0PinB  4       
#define potpin 2
#define bobina1 13             // Definimos pines de salida (tres bobinas)
#define bobina2 12
#define bobina3 8


volatile unsigned long _Grados = 20;       // Variable _Grados que traduce los ticks del encoder a 360
volatile unsigned long encodertick = 0;    // Variable para contar los ticks del encoder
volatile unsigned long contador = 0;       // Contador para detectar los cambios en grados
unsigned int dur;                          // Duración del pulso en grados
unsigned int durAnt;                     
volatile unsigned long disparador = 20;    // Disparador de las bobinas

void setup() {


  Serial.begin(9600);
  pinMode(encoder0PinA, INPUT);
  digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
  pinMode(encoder0PinB, INPUT);
  digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor
  pinMode(bobina1, OUTPUT);
  pinMode(bobina2, OUTPUT);
  pinMode(bobina3, OUTPUT);

  attachInterrupt(0, doEncoder, CHANGE);  // encoder pin on interrupt 0 - pin 2
  Serial.println ("Hasi");
}

void loop(){
 
   if (disparador > 29){                                             // Limita el disparador a 30 grados
  disparador=0;
  }
  if (_Grados>contador){                                             // Si se mueve un grado aumenta disparador
    disparador++;
    contador=_Grados;
  }
 
  if ((disparador < 0+dur) && (disparador > 0)){                      // Si esta entre los grados 0-10 disparar bobina2
   digitalWriteFast(bobina2, HIGH);
  }
  else
  if ((disparador < 10+dur) && (disparador > 10)){                    // Si esta entre los grados 10-20 disparar bobina3
   digitalWriteFast(bobina3, HIGH);
  }
   
    else
   
    if ((disparador < 20+dur) && (disparador > 20)){                   // Si esta entre los grados 20-30 disparar bobina1
   digitalWriteFast(bobina1, HIGH);
  }
  else{
    digitalWriteFast(bobina1, LOW);
    digitalWriteFast(bobina2, LOW);
    digitalWriteFast(bobina3, LOW);
  }
   
 
  if (encodertick > 2046){                                               // Resetea el contador de ticks cada revolucion
        encodertick = 0;
        contador=0;
        disparador=0;
        _Grados = 0;
       
  }
 
}

void doEncoder() {
  /* If pinA and pinB are both high or both low, it is spinning
   * forward. If they're different, it's going backward.
   *
   * For more information on speeding up this process, see
   * [Reference/PortManipulation], specifically the PIND register.
   */
  _Grados=encodertick;
  _Grados=map(_Grados, 0, 2047, 0, 359);
 
  if (digitalReadFast(encoder0PinA) == digitalReadFast(encoder0PinB)) {
    encodertick++;
  } else {
    encodertick--;
  }
 
}       

Espero que alguien pueda ayudarme. Muchas gracias!
Logged

Pages: [1]   Go Up
Jump to: