Control, Sensores

[:es]Medición de rpm de un motor usando encoder version buena[:en]Medición rpm de un motor usando encoder version 2.0[:]

[:es]Objetivos: 

Medir la velocidad rpm de cualquier motor usando un encoder.

Material:

Arduino uno

Motor DC con Encoder

LCD o LCD shield

Desarrollo:

Investiga como función un Encoder.

Lo primero que tenemos que saber es la resolución del enconder a usar.

La resolución de un encoder es  el número de pulsos que se generan en una revolución del motor.

La formula para medir la velocidad rpm es la siguiente.

Vrpm=( #pulsos_en_1_seg/ resolucion)*60;

 

Programa:

#include <LiquidCrystal.h>


const int senrpm = 13;                         // El interruptor a utilizar sera el 0 es decir el pin digital 2

int pulsos=0;                                 // variable para contar los pulsos en 1 segundo
int resolucion = 300;                          // pulsos por revolución del encoder resplucion
int tiempo;  
double rpm;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


void setup() {
  // put your setup code here, to run once:

  lcd.begin(16, 2);

   pinMode(senrpm, INPUT);         //declaramos el boton como entrada
   

}

void loop() {
  // put your main code here, to run repeatedly:

   velocidadrpm();

}





void velocidadrpm(){


//    Serial.println(tiempo);

int pulsos=0;
boolean bandera=LOW;
unsigned long currentTime=0;
unsigned long startTime=millis();

     while(currentTime<=1000)
       {
         if(digitalRead(senrpm)==HIGH)
         {
          bandera=HIGH;
         }
         if(digitalRead(senrpm)==LOW && bandera==HIGH)
         {
           pulsos++;
           bandera=LOW;
      
          }
        
         currentTime=millis()-startTime;
       }
       
    rpm=((double)pulsos/resolucion)*60; 
    
  //   rpm=int(60000./float(1000))*pulsos/resolucion;
    
 
   /// Serial.println(rpm);
    
   lcd.setCursor(0,1);            
   lcd.write("vel:");
   lcd.setCursor(5,1);  
   lcd.print(rpm);
}

 

Notas:

Otra forma de medir la velocidad  rpm es usando un iman acoplado al  eje de rotación del motor  y sensor de efecto hall.

 

 

 

 

 

 

 

 [:en]Estimados lectores les muestro un nuevo código en Arduino para medir la velocidad rpm de cualquier motor usando un encoder.

Lo primero que tenemos que considerar es  saber la resolución de un enconder

La resolución de un encoder es la el número de pulsos que da el enconder por una revolución del motor.

 

La formula para medir la velocidad rpm es la siguiente

 

Vrpm=( #pulsos_en_1_seg/ resolucion)*60;

 

Nuestro programa lo que mide es el número de pulsos que salen del encoder en un 1 seg.

Para medir los pulsos usamos interrupciones externas cada que llega un pulso se produce la interrupción y contamos el número de pulsos

Para medir el tiempo utilizamos la función   millis() de arduino para contar el tiempo y otra función que reinicia el tiempo cada segundo que pasa.

 

 

Programa:

#include <LiquidCrystal.h>

double rpm, tiempo;   // variables a usar

int Interruptor = 0;          // El interruptor a utilizar sera el 0 es decir el pin digital 2 de Arduino


// Autor: Christian A. Vazquez para proyectosarduino.xyz y microcontroalodores.com.mx

LiquidCrystal lcd(12,11, 6, 5, 4, 3); // conexión a lcd 
 

int pulsos=0;   // variable para contar los pulsos


int resolucion = 24; // resolucion del encoder  ( numero de pulsos por revolución) 


extern volatile unsigned long timer0_millis;
unsigned long new_value = 0;



//Esta seria nuestra funcion interrupcion exte.

void interrupcion_isr()  // se ejecuta cada interrupcion

{
  pulsos=pulsos+1;  // contador de pulsos

}

 


 

 

void setup()

{
   
   lcd.begin(16,2); 


 attachInterrupt(Interruptor, interrupcion_isr, FALLING);   // se activan interrucciones externas por detección de alto


} 

 

void loop()

{


tiempo =millis(); // mide el tiempo en microsengudos

if(tiempo==1000){  // si el tiempo es igual a 1 seg. 

 setMillis(new_value); // reinicia el tiempo
    
 rpm=((double)pulsos/resolucion)*60;  // formula para calcular rpm
   
   
   lcd.clear();   

  lcd.setCursor(0,0);            
  lcd.print("rpm");
  lcd.setCursor(5,0);            
  lcd.print(rpm);
 
    pulsos=0;  // reinicia la cuenta de los pulsos
    
}



 

}


void setMillis(unsigned long new_millis){   // función para reiniciar el tiempo a cero
  uint8_t oldSREG = SREG;
  cli();
  timer0_millis = new_millis;
  SREG = oldSREG;
}

 

Diagrama en Proteus

 

La simulación es muy buena ya que nuestra LCD se muestra la misma velocidad rpm que marca el motor CD de proteus.

 

Esto se puede usar para cualquier motor. Normalmente lo encoder de cuadratura traen dos salida el canal A y el canal B en este caso solo usaremos uno de los dos canales

 

 

 

 

 

 

 

 [:]

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *