Contador de vueltas para bobinadora.docx
Short Description
Download Contador de vueltas para bobinadora.docx...
Description
Contador de vueltas para bobinadora http://www.micropic.es/mpblog/2010/10/contador-de-vueltas-para-bobinadora/
17 octubre, 2010 Este proyecto que nos envía el amigo Roberto González, tiene como objetivo contar las vueltas que da un motor por medio de un sensor de efecto Hall, usándolo para bobinar transformadores. El sistema puede funcionar de dos formas: una es contar las vueltas del motor y otra de ellas es indicarle el número de vueltas que tiene que dar. De esta forma podemos desbobinar un transformador y saber el número de vueltas que tiene la bobina y/o bobinar un número de vueltas determinado, alcanzado éste número de vueltas se corta la alimentación del motor. Al iniciar el sistema entramos en un menú en el cual podemos seleccionar la opción deseada. Al circuito se le pueden dar otro tipo de aplicaciones, teniendo presente que está diseñado para contar.
Circuito El núcleo principal del circuito está basado en un PIC 16F628. No se ha utilizado el PIC 16F84 debido a que el programa que hemos desarrollado ocupa más de 1k de memoria. Si el programa se desarrolla en ensamblador es posible que se pueda economizar memoria y quepa en el 16F84. Aunque si miramos los precios de los componentes el 16F628, que tienes mayores prestaciones, es más económico que el 16F84. El microcontrolador cuenta los pulsos proporcionados por un sensor de efecto Hall. Para ello debemos añadir al motor que elijamos, un pequeño imán en el eje, para que con cada vuelta que dé el motor se genere un pulso en el sensor Hall. En mi caso he utilizado un atornillador eléctrico de los que se desechan porque las baterías ya no sirven. El atornillador le he conectado a una fuente de alimentación externa que le impulsa. Por otro lado e independiente de la alimentación del motor, se usa otra alimentación para la electrónica asociada al PIC. Esto se ha hecho así porque en una primera aproximación vimos que los picos que generaba el motor (consume bastante corriente) se introducían en la electrónica y generaban comportamientos indeseados. A raíz de esta experiencia, se decidió añadir un optoacoplador para aislar la electrónica del relé que da paso a la alimentación del motor. Como interface con el usuario se ha puesto un teclado matricial de 4×3 y un LCD. El teclado sirve para dar las órdenes al sistema y con el LCD podemos ver en que punto nos encontramos. El esquema es el mostrado en la figura de la siguiente pagina. Como sensor HALL se ha usado el A1104 de la marca Allegro, que hemos adquirido en web www.amidata.es. Se trata de un sensor que nos da un pulso a la salida cuando detecta un campo magnético, es un sensor del tipo switch. La salida del sensor es mosfet con drenador abierto, por eso el añadir una resistencia entre +5v y la salida del sensor.
Software El micro ha sido programado en lenguaje C, concretamente el código está realizado en CCS. Utilizamos dos rutinas proporcionadas por este compilador para manejar el teclado matricial y el LCD. Hemos modificado las rutinas para que usen el puerto B, en el caso del teclado matricial y para que usen 8 bits para control del LCD a través del puerto B, para el LCD. Básicamente el programa utiliza el TIMER0 como contador de eventos de nivel bajo a alto que son introducidos por RA4 procedentes del sensor HALL.
Inicialmente el programa inicializa el teclado, el LCD, pone RA4 como entrada y el resto como salidas. Es necesario activas las resistencias de pull-up asociadas al puerto RB. Tras inicializar el TIMER_0 para que cuente eventos por el pin RA4 en los flancos de bajo a alto, entramos en un bucle en el que se esperan órdenes desde el teclado. En primer lugar se muestra en el LCD un mensaje del proyecto, el cual saltaremos tras pulsar cualquier tecla.
Esto da paso al menú de opciones del sistema:
Elegiremos una de las opciones pulsando en el teclado numérico 1 ó 2. La opción 1 permite controlar el motor con start/stop y contar los pulsos que le llegan por el sensor.
La opción 2 nos habilita el teclado para introducir el valor de cuenta en el cual se debe parar el motor. Tras introducir este valor, con la tecla start/stop se pone en marcha el motor parando cuando se haya llegado al final de la cuenta.
Se puede salir de cualquier menú pulsando la tecla ‘#’. Si en el menú principal pulsamos la tecla ‘#’ el micro entra en estado sleep y no se vuelve a ejecutar el programa hasta que reseteamos el micro con el pulsador.
La tecla ‘*’ en cualquiera de los menús 1 ó 2, es la encargada de la función start/stop, es decir, al pulsarla por primera vez acciona el relé que alimenta al motor y al pulsarla por segunda vez para el motor. Esto sirve para un control manual de la bobinadora, puesto que puede ocurrir que el hilo se atasque, se rompa u otros percances, que requieren parar el motor y volverlo a poner en marcha una vez solucionado.
Primero se hizo todo el proyecto en la placa MicroPic Trainer, de hay que en los comentarios del programa se adjunta el estado de los interruptores para que funcione correctamente el teclado y el LCD. Tras la depuración del proyecto hemos hecho un circuito impreso cuya imagen adjuntamos más adelante. // Debe recordarse que las líneas RA0-RA2 actúan ahora como salida de // señales de control hacia el LCD. Al estar conectadas con sendos interruptores // en la MicroPIC Trainer, estos deben estar a nivel lógico "1" permanentemente, // es decir en la posición marcada como 0 en la placa // Datos del LCD conectado al puerto B // Teclado conectado al puerto B: Columna 0,1,2 a B5,B6 y B7. // Fila 0,1,2 y 3 a B1, B2,B3 y B4 // RA3 conecto la salida para el motor. En un principio funciona como salida // de enable. Se puede estudiar posibilidad de implementar un control PWM // para la velocidad. RA4 entrada para el Timer0 #include #include #FUSES NOWDT //No Watch Dog Timer #FUSES XT #FUSES NOPUT //No Power Up Timer #FUSES NOPROTECT #use delay(clock=4000000) #use fast_io(A) #use fast_io(B) #bit puertoA3 = 5.3 //Usado para control on/off motor void menu1(void); void menu2 (void); int16 contar(void); int16 introducir_valor(void); char cadena1[]={"f1-Contar Vueltn2-Introd. Vuelt"}; int desbordamiento=0; void main() { char caracter; port_b_pullups(TRUE); lcd_init(); kbd_init(); set_tris_a(0x10); //A4 como entrada puertoA3=0; //inicializo motor con 0 //lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); No activo cursor ni blinker setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1); printf (lcd_putc,"Contador de Pulsosn By Rober ",); do caracter=kbd_getc(); while (caracter=='�'); printf(lcd_putc,"%s",cadena1); while (1) { caracter=kbd_getc();
switch (caracter) { case '1': desbordamiento=0; set_timer0(0); menu1(); printf(lcd_putc,"%s",cadena1); break; case '2': desbordamiento=0; set_timer0(0); menu2(); printf(lcd_putc,"%s",cadena1); break; case '*': printf(lcd_putc,"f BY BY"); sleep(); } }; } int16 contar() { int cuenta=0; int16 n; cuenta=get_timer0(); if (cuenta==255) { set_timer0(0); desbordamiento++; } n=256*desbordamiento+cuenta; lcd_gotoxy(10,2); printf(LCD_PUTC,"%Lu",n); return(n); } void menu1() { char caracter; int contador_parcial=0; int motor_off=1; int tecla_enter=0; //control de la tecla asterisco pulsada primera vez=1, pulsada otra vez =0 printf(lcd_putc,"f* Motor On/offn# salir"); do { caracter=kbd_getc(); switch (caracter) { case '*': if (tecla_enter==0)
{ printf(lcd_putc,"fMotor ONn cuenta:"); set_timer0(contador_parcial); tecla_enter=1; motor_off=0; set_tris_a(0x10); puertoA3=1; //activo motor } else { lcd_gotoxy(1,1); contador_parcial=get_timer0(); printf(lcd_putc,"Motor OFF"); motor_off=1; tecla_enter=0; set_tris_a(0x10); puertoA3=0; // motor apagado } break; case '#': tecla_enter=0; motor_off=1; set_tris_a(0x10); puertoA3=0; break; } if (tecla_enter) contar(); }while (caracter!='#'); } int16 introducir_valor() { char caracter; char numeros[6]; int contador_caracter=0; int16 vueltas; printf(lcd_putc,"fN. Vueltas (4cifras)n "); lcd_enviar(LCD_COMANDO,LCD_CURSOR_ON); // activo cursor y blinker do { caracter=kbd_getc(); if (caracter!='�') { printf(lcd_putc,"%c"caracter); numeros[contador_caracter]=caracter; contador_caracter++; } } while (caracter!='#'&&contador_caracter
View more...
Comments