Date post: | 19-Jun-2018 |
Category: |
Documents |
Upload: | vuongxuyen |
View: | 217 times |
Download: | 0 times |
Proyecto Final Universidad Nacional Autónoma de México Facultad de Ingeniería Medición e Instrumentación Ing. José de Jesús Vega Jiménez Gpo: 04
Medidor de RPM FÉLIX TEJEDA Fernando
22.11.2014
Proyecto Final
OBJETIVO
Realizar un sistema general de medición para medir RPM de un rodillo para una banda distribuidora.
INTRODUCCIÓN
El proyecto consiste en desarrollar un instrumento de medición basado en el sistema general de mediciones, que medirá las revoluciones por minuto de un rodillo para una cinta transportadora, utilizada para alguna proceso fabril, en la cual se requiere para la medición y control de la velocidad de la banda y por lo tanto del proceso de fabricación mismo. Sistema General de Medición (SGM): Sistema para estudiar cualquier aparato de medición, tiene que contar con los siguientes bloques para ser un SGM.
o Mensurado. Variable que va a medir. o Elemento sensor. Elemento que va a “sentir” las variables físicas. o Elemento transductor. Elemento que se encarga de convertir el tipo de energía de las señales o Elemento de manipulación de la variable transducida. Elemento que va a manipular la señal del
transductor a nuestra conveniencia. o Elemento de transmisión. Elemento que va a propagar la señal. o Elemento de presentación de datos. Elemento que va a mostrar la variable de manera presentable. o Observador. Unidad que se interpretara del SGM.
Motor de corriente directa: Dispositivo que produce movimiento y torque a expensas de otra fuente de energía, en este caso energía eléctrica en mecánica.
Cinta transportadora: Sistema para transportar una carga de un lugar a otro en una fábrica.
Proyecto Final
RPM: Se refiere a la abreviación de (Revolutions Per Minute), aunque en español (Revoluciones Por Minuto) no cambia mucho. Es una unidad de referencia para representar la velocidad angular de un objeto y son las vueltas completas que realiza un objeto en un minuto. Convertidor frecuencia/voltaje: Dispositivo electrónico que va a medir la frecuencia y como salida enviara una señal de voltaje proporcional a dicha frecuencia. LM2917: Es un circuito integrado convertidor de frecuencia a voltaje, va a recibir una señal cuadrada con cierta frecuencia y entonces el circuito integrado mandara una señal de voltaje proporcional a la frecuencia que incide.
NE555: Circuito integrado que genera una señal cuadrada, dependiendo de su conexión se puede cambiar la frecuencia y el ciclo de trabajo. Puede ser utilizado en modo astable y monoestable.
Disco codificado: Va a estar fijado en el eje rotatorio para tener una referencia con la ayuda del foto interruptor. A la salida del foto interruptor se tiene una señal pulsante con frecuencia proporcional al giro del disco y, por lo tanto, al giro de la llanta.
LM2907-N, LM2917-NSNAS555C –JUNE 2000–REVISED MARCH 2013 www.ti.com
CONNECTION DIAGRAMS
PDIP and SOIC Packages, Top Views
Figure 1. See Package Number D0008A or P0008E Figure 2. See Package Number D0008A or P0008E
Figure 3. See Package Number D0014A or Figure 4. See Package Number D0014A orNFF0014A NFF0014A
2 Submit Documentation Feedback Copyright © 2000–2013, Texas Instruments Incorporated
Product Folder Links: LM2907-N LM2917-N
Proyecto Final
Foto interruptor LED IR: Consiste en un emisor y receptor LED infrarrojo, cada vez que se interrumpa la señal por el disco codificado este dejara de mandar una señal eléctrica.
Arduino: Microcontrolador que va a interpretar las señales para así mostrar los RPMs medidos. Alambrado: Conexiones entre los elementos eléctricos. Display de 7 segmentos con 4 diígitos y ánodo común: Un arreglo de LEDs que representaran un número.
PWM (Pulse Wide Modulation): Consiste en mandar pulsos de la misma amplitud y estos se varían según su ciclo de trabajo, este método se utiliza para variar la velocidad de motores de CD.
Proyecto Final
DESARROLLO
Para el desarrollo del medidor RPM, se identificaron los bloques del SGM.
Para crear la variable a medir se armó un circuito con un motor de C.D. controlado por medio del método PWM, gracias al NE555. El circuito implementado para lograr tener control sobre la velocidad del motor se muestra a continuación.
En el bloque J1 se tiene una alimentación de 9V por parte de una fuente de alimentación externa. En J2 se tiene un potenciómetro que permite variar el ancho de pulso. En J3 es la salida del motor de DC.
Después de tener el elemento que va a crear nuestra variable a medir, se acopló el encoder a la rueda para que diera las mismas vueltas que el motor, al igual que el foto interruptor y el convertidor de frecuencia a voltaje para que pueda interpretar la señal. En el siguiente esquema de conexiones se ilustra cómo se realizo el alambrado.
Mensurado Movimiento del encoder
Sensor Fotointerruptor, LM2917
Transductor Fotointerruptor
Manipulación de la variable LM2917, Arduino
Transmisión Alambrado
Presentación de datos Display de 7 segmentos
Observador RPM
Proyecto Final
Para el convertidor de frecuencia a voltaje, el fabricante proporciona la configuración necesaria, solo se reemplazó la reluctancia magnética por el foto interruptor. El LM2917 va a recibir la señal cuadrada que va a mandar el foto interruptor y entonces la convertirá a una señal analógica de voltaje proporcional a la frecuencia de entrada sobre el integrado.
Respecto a las entradas y salidas sobre el microcontrolador, se tienen las siguientes conexiones:
Ahora que se tienen todos los elementos necesarios, se programa el microcontrolador Arduino Leonardo para que responda de la manera deseada. A continuación se muestra el código desarrollado en Arduino IDE. La última actualización de este archivo fue realizada el 21 de noviembre a las 8:00 hrs.
Selección de dígito
Salidas al display
Señal del LM2917
Proyecto Final
//VARIABLES PARA EL DISPLAY DE 7 SEGMENTOS CON 4 DIGITOS//LA LETRA CORRESPONDE AL SEGMENTO Y EL NUMERO AL PUERTO GIOint A=0;int B=1;int C=2;int D=3;int E=4;int F=5;int G=6;int DP=7;
//VARIABLES PARA ENCENDER/APAGAR LOS DIGITOS//LA LETRA CORRESPONDE AL DIGITO Y EL NUMERO AL PUERTO GIOint D1=8;int D2=9;int D3=10;int D4=11;
int Display[]={A,B,C,D,E,F,G}; //VECTOR CON LOS SEGMENTOS DEL DISPLAYint Digit[]={D1,D2,D3,D4}; //VECTOR PARA CONTROL DE DIGITOSint i=0,j=0,k=0,l=0,m=0,t=0; //VARIABLES PARA CONTADORES
double rpm; //VARIABLE DONDE SERAN ALMACENADAS LAS RPMdouble offset; //VARIABLE PARA ERROR DE OFFSETint rpmPin = 0; //ENTRADA ANALOGICA POR EL PUERTO A0int array[4]; //VECTOR PARA SEPARAR LOS VALORES EN LOS DIGITOS
void setup() { //CONDICIONES INICIALES DE OPERACION: Serial.begin(9600); //SE INICIA COMUNICACION SERIAL A 9600 BITS POR SEGUNDO for(i=0;i<7;i++){ pinMode(Display[i],OUTPUT); //SEGMENTOS DEL DISPLAY COMO SALIDA digitalWrite(Display[i],HIGH); //SEGMENTOS APAGADOS } pinMode(DP,OUTPUT); //PUNTO DECIMAL COMO SALIDA digitalWrite(DP,HIGH); //PUNTO DECIMAL APAGADO for(i=0;i<4;i++){ pinMode(Digit[i],OUTPUT); //DIGITOS COMO SALIDA digitalWrite(Digit[i],HIGH); //DIGITOS APAGADOS }}
void loop() { //FUNCION PRINCIPAL rpm = analogRead(rpmPin); //LECTURA DE LA ENTRADA ADC (SALIDA DEL LM2917) rpm = ((rpm+3.3)/256); //SE CONVIERTE LA ENTRADA DIGITAL AL VALOR DEL VOLTAJE
offset=rpm; //VARIABLE DE OFFSET SE LE DA EL VALOR DEL VOLTAJE Serial.println(rpm); //SE MUESTRA EL VALOR DEL VOLTAJE EN EL MONITOR SERIAL rpm = (2844.63*rpm-11.40795)/10; //SE CONVIERTE EL VOLTAJE A RPM Serial.println(rpm); //SE MUESTRA EL VALOR DE LAS RPM EN EL MONITOR SERIAL //PROCESO MATEMATICO PARA SEPARAR EL NUMERO DE RPM EN CADA DIGITO array[0]=rpm/10; //DIGITO 1 array[1]=rpm-(array[0]*10); //DIGITO 2 array[2]=(rpm-(array[0]*10+array[1]))*10; //DIGITO 3 array[3]=100*(rpm-((array[0]*10)+(array[1])+(array[2]*0.1))); //DIGITO 4
for(t=0;t<5000;t++){ //CADA MEDIO SEGUNDO SE MUESTRAN LAS RPM EN EL DISPLAY if(offset<=0.0129){ //SI EL VALOR DEL VOLTAJE ES MENOR O IGUAL A 0.0129 SE MUESTRA CERO digitalWrite(D4,LOW); //SE ENCIENDE EL DIGITO 4 NUM(0); //SE MANDA EL NUMERO CERO INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D4,HIGH); //SE APAGA EL DIGITO 4 digitalWrite(D3,LOW); //SE ENCIENDE EL DIGITO 3 digitalWrite(DP,LOW); //SE ENCIENDE EL PUNTO DECIMAL NUM(0); //SE MANDA EL NUMERO CERO INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(DP,HIGH); //SE APAGA EL PUNTO DECIMAL digitalWrite(D3,HIGH); //SE APAGA EL DIGITO 3 digitalWrite(D2,LOW); //SE ENCIENDE EL DIGITO 2 NUM(0); //SE MANDA EL NUMERO CERO INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D2,HIGH); //SE APAGA EL DIGITO 2 digitalWrite(D1,LOW); //SE ENCIENDE EL DIGITO 1 NUM(0); //SE MANDA EL NUMERO CERO INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D1,HIGH); //SE APAGA EL DIGITO 1 }else{ //SI EL VALOR DEL VOLTAJE ES MAYOR A 0.0129 digitalWrite(D4,LOW); //SE ENCIENDE EL DIGITO 4 NUM(array[3]); //DIGITO CUATRO DEL VALOR DE LAS RPM INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D4,HIGH); //SE APAGA EL DIGITO 4 digitalWrite(D3,LOW); //SE ENCIENDE EL DIGITO 3 digitalWrite(DP,LOW); //SE ENCIENDE EL PUNTO DECIMAL NUM(array[2]); //DIGITO TRES DEL VALOR DE LAS RPM INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(DP,HIGH); //SE APAGA EL PUNTO DECIMAL digitalWrite(D3,HIGH); //SE APAGA EL DIGITO 3
Proyecto Final
offset=rpm; //VARIABLE DE OFFSET SE LE DA EL VALOR DEL VOLTAJE Serial.println(rpm); //SE MUESTRA EL VALOR DEL VOLTAJE EN EL MONITOR SERIAL rpm = (2844.63*rpm-11.40795)/10; //SE CONVIERTE EL VOLTAJE A RPM Serial.println(rpm); //SE MUESTRA EL VALOR DE LAS RPM EN EL MONITOR SERIAL //PROCESO MATEMATICO PARA SEPARAR EL NUMERO DE RPM EN CADA DIGITO array[0]=rpm/10; //DIGITO 1 array[1]=rpm-(array[0]*10); //DIGITO 2 array[2]=(rpm-(array[0]*10+array[1]))*10; //DIGITO 3 array[3]=100*(rpm-((array[0]*10)+(array[1])+(array[2]*0.1))); //DIGITO 4
for(t=0;t<5000;t++){ //CADA MEDIO SEGUNDO SE MUESTRAN LAS RPM EN EL DISPLAY if(offset<=0.0129){ //SI EL VALOR DEL VOLTAJE ES MENOR O IGUAL A 0.0129 SE MUESTRA CERO digitalWrite(D4,LOW); //SE ENCIENDE EL DIGITO 4 NUM(0); //SE MANDA EL NUMERO CERO INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D4,HIGH); //SE APAGA EL DIGITO 4 digitalWrite(D3,LOW); //SE ENCIENDE EL DIGITO 3 digitalWrite(DP,LOW); //SE ENCIENDE EL PUNTO DECIMAL NUM(0); //SE MANDA EL NUMERO CERO INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(DP,HIGH); //SE APAGA EL PUNTO DECIMAL digitalWrite(D3,HIGH); //SE APAGA EL DIGITO 3 digitalWrite(D2,LOW); //SE ENCIENDE EL DIGITO 2 NUM(0); //SE MANDA EL NUMERO CERO INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D2,HIGH); //SE APAGA EL DIGITO 2 digitalWrite(D1,LOW); //SE ENCIENDE EL DIGITO 1 NUM(0); //SE MANDA EL NUMERO CERO INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D1,HIGH); //SE APAGA EL DIGITO 1 }else{ //SI EL VALOR DEL VOLTAJE ES MAYOR A 0.0129 digitalWrite(D4,LOW); //SE ENCIENDE EL DIGITO 4 NUM(array[3]); //DIGITO CUATRO DEL VALOR DE LAS RPM INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D4,HIGH); //SE APAGA EL DIGITO 4 digitalWrite(D3,LOW); //SE ENCIENDE EL DIGITO 3 digitalWrite(DP,LOW); //SE ENCIENDE EL PUNTO DECIMAL NUM(array[2]); //DIGITO TRES DEL VALOR DE LAS RPM INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(DP,HIGH); //SE APAGA EL PUNTO DECIMAL digitalWrite(D3,HIGH); //SE APAGA EL DIGITO 3 digitalWrite(D2,LOW); //SE ENCIENDE EL DIGITO 2 NUM(array[1]); //DIGITO DOS DEL VALOR DE LAS RPM INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D2,HIGH); //SE APAGA EL DIGITO 2 digitalWrite(D1,LOW); //SE ENCIENDE EL DIGITO 1 NUM(array[0]); //DIGITO UNO DEL VALOR DE LAS RPM INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D1,HIGH); //SE APAGA EL DIGITO 1 } } }
//SE TOMA LA DECISION DE QUE NUMERO SE VA A MOSTAR EN EL DIGITO DEL DISPLAY//ESTE NUMERO DEPENDE DEL DIGITO DEL VALOR DE LAS RPMvoid NUM(int c){ if(c==0) ZERO(); if(c==1) EINS(); if(c==2) ZWEI(); if(c==3) DREI(); if(c==4) VIER(); if(c==5) FUNF(); if(c==6) SECHS(); if(c==7) SIEBEN(); if(c==8) ACHT(); if(c==9) NEUN();}
void ZERO(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL CERO digitalWrite(Display[A],LOW); digitalWrite(Display[B],LOW); digitalWrite(Display[C],LOW); digitalWrite(Display[D],LOW); digitalWrite(Display[E],LOW); digitalWrite(Display[F],LOW);}
void EINS(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL UNO digitalWrite(Display[B],LOW);
Proyecto Final
digitalWrite(D2,LOW); //SE ENCIENDE EL DIGITO 2 NUM(array[1]); //DIGITO DOS DEL VALOR DE LAS RPM INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D2,HIGH); //SE APAGA EL DIGITO 2 digitalWrite(D1,LOW); //SE ENCIENDE EL DIGITO 1 NUM(array[0]); //DIGITO UNO DEL VALOR DE LAS RPM INIT(); //RESET EN EL VALOR DEL DISPLAY digitalWrite(D1,HIGH); //SE APAGA EL DIGITO 1 } } }
//SE TOMA LA DECISION DE QUE NUMERO SE VA A MOSTAR EN EL DIGITO DEL DISPLAY//ESTE NUMERO DEPENDE DEL DIGITO DEL VALOR DE LAS RPMvoid NUM(int c){ if(c==0) ZERO(); if(c==1) EINS(); if(c==2) ZWEI(); if(c==3) DREI(); if(c==4) VIER(); if(c==5) FUNF(); if(c==6) SECHS(); if(c==7) SIEBEN(); if(c==8) ACHT(); if(c==9) NEUN();}
void ZERO(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL CERO digitalWrite(Display[A],LOW); digitalWrite(Display[B],LOW); digitalWrite(Display[C],LOW); digitalWrite(Display[D],LOW); digitalWrite(Display[E],LOW); digitalWrite(Display[F],LOW);}
void EINS(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL UNO digitalWrite(Display[B],LOW);
digitalWrite(Display[C],LOW);}
void ZWEI(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL DOS digitalWrite(Display[A],LOW); digitalWrite(Display[B],LOW); digitalWrite(Display[D],LOW); digitalWrite(Display[E],LOW); digitalWrite(Display[G],LOW);}
void DREI(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL TRES digitalWrite(Display[A],LOW); digitalWrite(Display[B],LOW); digitalWrite(Display[C],LOW); digitalWrite(Display[D],LOW); digitalWrite(Display[G],LOW);}
void VIER(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL CUATRO digitalWrite(Display[B],LOW); digitalWrite(Display[C],LOW); digitalWrite(Display[F],LOW); digitalWrite(Display[G],LOW);}
void FUNF(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL CINCO digitalWrite(Display[A],LOW); digitalWrite(Display[C],LOW); digitalWrite(Display[D],LOW); digitalWrite(Display[F],LOW); digitalWrite(Display[G],LOW);}
void SECHS(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL SEIS digitalWrite(Display[C],LOW); digitalWrite(Display[D],LOW); digitalWrite(Display[E],LOW); digitalWrite(Display[F],LOW); digitalWrite(Display[G],LOW);}
void SIEBEN(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL SIETE digitalWrite(Display[A],LOW); digitalWrite(Display[B],LOW); digitalWrite(Display[C],LOW);}
void ACHT(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL OCHO digitalWrite(Display[A],LOW); digitalWrite(Display[B],LOW); digitalWrite(Display[C],LOW);
Proyecto Final
digitalWrite(Display[C],LOW);}
void ZWEI(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL DOS digitalWrite(Display[A],LOW); digitalWrite(Display[B],LOW); digitalWrite(Display[D],LOW); digitalWrite(Display[E],LOW); digitalWrite(Display[G],LOW);}
void DREI(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL TRES digitalWrite(Display[A],LOW); digitalWrite(Display[B],LOW); digitalWrite(Display[C],LOW); digitalWrite(Display[D],LOW); digitalWrite(Display[G],LOW);}
void VIER(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL CUATRO digitalWrite(Display[B],LOW); digitalWrite(Display[C],LOW); digitalWrite(Display[F],LOW); digitalWrite(Display[G],LOW);}
void FUNF(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL CINCO digitalWrite(Display[A],LOW); digitalWrite(Display[C],LOW); digitalWrite(Display[D],LOW); digitalWrite(Display[F],LOW); digitalWrite(Display[G],LOW);}
void SECHS(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL SEIS digitalWrite(Display[C],LOW); digitalWrite(Display[D],LOW); digitalWrite(Display[E],LOW); digitalWrite(Display[F],LOW); digitalWrite(Display[G],LOW);}
void SIEBEN(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL SIETE digitalWrite(Display[A],LOW); digitalWrite(Display[B],LOW); digitalWrite(Display[C],LOW);}
void ACHT(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL OCHO digitalWrite(Display[A],LOW); digitalWrite(Display[B],LOW); digitalWrite(Display[C],LOW);
digitalWrite(Display[D],LOW); digitalWrite(Display[E],LOW); digitalWrite(Display[F],LOW); digitalWrite(Display[G],LOW);}
void NEUN(void){ //SEGMENTOS NECESARIOS PARA MOSTRAR EL NUEVE digitalWrite(Display[A],LOW); digitalWrite(Display[B],LOW); digitalWrite(Display[C],LOW); digitalWrite(Display[F],LOW); digitalWrite(Display[G],LOW);}
void INIT(void){ //REINICIO DEL DISPLAY, TODOS LOS SEGMENTOS APAGADOS for(i=0;i<7;i++){ digitalWrite(Display[i],HIGH); }}
Proyecto Final
Para convertir el voltaje del LM2917 se obtiene el modelo matemático que relaciona el voltaje con la frecuencia y ésta a su vez con las RPM. Primeramente, se obtiene la relación de voltaje a frecuencia con ayuda del osciloscopio y un voltímetro se obtiene la tabla y gráficas siguientes.
f"[Hz]" V"[V]"0" 0.003"
5.708" 0.018"9.615" 0.03"17.544" 0.045"24.39" 0.071"35.461" 0.1"40.323" 0.115"48.06" 0.13"48.077" 0.135"62.5" 0.166"73.529" 0.194"
Con estos valores se obtiene la recta que caracteriza al sistema. Se hace una regresión lineal cuya ecuación y parámetros característicos se muestran a continuación.
! = 379.284 ! − 1.521
! = 0.9987!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! = 1.504 Ya que el encoder utilizado tiene 8 dientes por revolución. Se tiene que por cada ocho pulsos del encoder implican una revolución. Por lo tanto la relación para obtener las RPM es la siguiente.
!"# = 379.284 ! − 1.521 608
!"# = 2844.63 ! − 11.40795
0
10
20
30
40
50
60
70
80
0.003 0.018 0.03 0.045 0.071 0.1 0.115 0.13 0.135 0.166 0.194
Frecuencia
Voltaje
Proyecto Final
Puesta a punto
Las siguientes figuras muestran al sistema funcionando. Se arma una base para que la llanta este siempre acoplada al circuito medidor de RPM. Todos los dispositivos funcionan con forme a lo esperado. El motor está alimentado por una fuente externa, mientras que la electrónica para la medición está alimentado desde el microcontrolador.