arduino motor dc encoder

Cálculo de las revoluciones por minuto (RPM) de un motor con encoder. Arduino y los Encoders

Muchas veces es necesario calcular las revoluciones por minuto (RPM) de un motor mediante un encoder unido a su eje. Esto es clave en los péndulos invertidos, robots autobalanceados, y cualquier aplicación que necesite del control de las rpm de un motor. El motor eléctrico con encoder incorporado en el que nos basamos emplea dos sensores Hall desfasados 90º. Este es un tipo de configuración muy habitual en el mercado. Además en este ejemplo se pueden calcular las RPM en ambos sentidos de rotación.

 

//Joober Technologies
//Motor de CD con motorreductor, caja de engranes metálicos y encoder cuadratura. Torque de 5.2 kg.cm a 110 rpm.
//Autor: Ing. Josep Ramon Vidal. Joober Tecnologies. https://joober.page.link/joober

const byte Encoder_C1 = 3; // Cable amarillo pin 3 digital
const byte Encoder_C2 = 4; // Cable verde al pin 4 digital
byte Encoder_C1Last;
int paso = 0;
boolean direccion;

float rpm = 0;
unsigned long timeold = 0;

void setup()
{
  Serial.begin(57600);
  attachInterrupt(digitalPinToInterrupt(3), calculapulso, CHANGE);
}

void loop()
{
  pinMode(Encoder_C2, INPUT);

  /*Serial.print("Paso: ");
    Serial.print(paso);
    Serial.print(", ");
    Serial.print("Ángulo: ");
    Serial.println(paso * 0.481283422459893);*/
  /*Para por cada vuelta del rotor antes de la caja de engranes, se producen 22 pulsos (o pasos) del encoder.
    El motor tiene una relación de reducción en su caja de engranes de 1:34. Por tanto, se tienen 748 ticks o pulsos
    del encoder por cada revolución del rotor después de la caja de engranes. Por lo que 748/360 = 0.48128...*/

  if (millis() - timeold >= 200) {
    rpm = paso* (0.481283422459893/(millis() - timeold)) * (60000/360);
    //Serial.print("RPM: ");
    Serial.println(rpm);
    timeold = millis();
    paso = 0;
    }
    
}

void calculapulso()
{
  int Lstate = digitalRead(Encoder_C1);
  if ((Encoder_C1Last == LOW) && Lstate == HIGH)
  {
    int val = digitalRead(Encoder_C2);
    if (val == LOW && direccion)
    {
      direccion = false; //Reverse
    }
    else if (val == HIGH && !direccion)
    {
      direccion = true;  //Forward
    }
  }
  Encoder_C1Last = Lstate;

  if (!direccion)  paso++;
  else  paso--;
  }

Para más información consultar en la web de Arduino.

Más información

Deseamos que te haya gustado este post. Si deseas más información sobre cómo programar en Arduino consulta en la web oficial de Arduino. Para cualquier otra consulta, puedes contactar con nosotros. También nos puedes ayudar descargando nuestra APP de Servicios Profesionales, freelancers y autónomos.

Leave a Comment

Your email address will not be published. Required fields are marked *

Información básica sobre protección de datos
Responsable Francisco de Asís Benavente Delgado +info...
Finalidad Gestionar y moderar tus comentarios. +info...
Legitimación Consentimiento del interesado. +info...
Destinatarios No se cederán datos a terceros, salvo obligación legal +info...
Derechos Acceder, rectificar y cancelar los datos, así como otros derechos. +info...
Información adicional Puedes consultar la información adicional y detallada sobre protección de datos en nuestra página de política de privacidad.