
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.