Contador Pulsos Con Motor

Embed Size (px)

Citation preview

Contador de Pulsos con PIC

CONTADOR VUELTAS PARA BOBINADORA 1.- Descripcin El siguiente proyecto tiene como objetivo contar las vueltas que da un motor por medio de un sensor de efecto Hall, usndolo para bobinar transformadores. El sistema puede funcionar de dos formas: una es contar las vueltas del motor y otra de ellas es indicarle el nmero de vueltas que tiene que dar. De esta forma podemos desbobinar un transformador y saber el nmero de vueltas que tiene la bobina y/o bobinar un nmero de vueltas determinado, alcanzado ste nmero de vueltas se corta la alimentacin del motor. Al iniciar el sistema entramos en un men en el cual podemos seleccionar la opcin deseada. Al circuito se le pueden dar otro tipo de aplicaciones, teniendo presente que est diseado para contar. 2.- Circuito El ncleo 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 ms 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 ms econmico que el 16F84. El microcontrolador cuenta los pulsos proporcionados por un sensor de efecto Hall. Para ello debemos aadir al motor que elijamos, un pequeo imn 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 elctrico de los que se desechan porque las bateras ya no sirven. El atornillador le he conectado a una fuente de alimentacin externa que le impulsa. Por otro lado e independiente de la alimentacin del motor, se usa otra alimentacin para la electrnica asociada al PIC. Esto se ha hecho as porque en una primera aproximacin vimos que los picos que generaba el motor (consume bastante corriente) se introducan en la electrnica y generaban comportamientos indeseados. A raiz de esta experiencia, se decidi aadir un optoacoplador para aislar la electrnica del rel que da paso a la alimentacin del motor. Como interface con el usuario se ha puesto un teclado matricial de 4x3 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 siguiente:

1

Contador de Pulsos con PIC

2

Contador de Pulsos con PIC

3

Contador de Pulsos con PIC

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 magntico, es un sensor del tipo switch. La salida del sensor es mosfet con drenador abierto, por eso el aadir una resistencia entre +5v y la salida del sensor. 3.- Software El micro ha sido programado en lenguaje C, concretamente el cdigo 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 travs del puerto B, para el LCD. Bsicamente 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:

4

Contador de Pulsos con PIC

Elegiremos una de las opciones pulsando en el teclado numrico 1 2. La opcin 1 permite controlar el motor con start/stop y contar los pulsos que le llegan por el sensor.

La opcin 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.

5

Contador de Pulsos con PIC

La tecla '*' en cualquiera de los mens 1 2, es la encargada de la funcin 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 o 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 depuracin del proyecto hemos hecho un circuito impreso para el proyecto cuyo esquema adjuntamos en el punto 4.// Debe recordarse que las lneas RA0-RA2 actan ahora como salida de seales de control // hacia el LCD. Al estar conectadas con sendos interruptores en la MicroPIC Trainer, // estos deben estar a nivel lgico "1" permanentemente, es decir en la posicion //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 principi funciona como salida de enable. Se puede //estudiar posibilidad de implementar un control PWM para la velocidad. //RA4 entrada para el Timer0 #include #include

6

Contador de Pulsos con PIC

#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) #include #include #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 Vuelt\n2-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 Pulsos\n do caracter=kbd_getc(); while (caracter=='\0'); 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; ",);

7

Contador de Pulsos con PIC 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/off\n# salir"); do { caracter=kbd_getc(); switch (caracter) { case '*': if (tecla_enter==0) { printf(lcd_putc,"\fMotor ON\n cuenta:"); set_timer0(contador_parcial); tecla_enter=1; motor_off=0; set_tris_a(0x10); puertoA3=1; //activo motor

8

Contador de Pulsos con PIC } 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!='\0') { printf(lcd_putc,"%c"caracter); numeros[contador_caracter]=caracter; contador_caracter++; } } while (caracter!='#'&&contador_caracter