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 raiz 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 siguiente:

Contador Bobinadora Esquema

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.

Contador Bobinadora

Esto da paso al menú de opciones del sistema:

Contador Bobinadora

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.

Contador Bobinadora

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.

Contador Bobinadora

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.

Contador Bobinadora

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 o otros percances, que requieren parar el motor y volverlo a poner en marcha una vez solucionado.

Contador Bobinadora

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 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 <16f628a.h>
#include <stdlib.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT
#use delay(clock=4000000)

#define use_portb_kbd TRUE // para evitar error (undefined identifier --set_tris_d)

#include <LCD2.c>
#include <KBD.c>

#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;
int amp=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 By Rober ",);

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;
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);
// delay_us(1000);
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
}
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); // aqui faltaba la coma antes de la palabra caracter

numeros[contador_caracter]=caracter;
contador_caracter++;
}
}
//while (caracter!='#'&amp,&amp;contador_caracter<=4); //Cambiar los punto y coma por coma como en la siguiente linea
while (caracter!='#'&amp,&amp,contador_caracter<=4);
numeros[contador_caracter]='\0';
vueltas=atol(numeros);

lcd_enviar(LCD_COMANDO,LCD_CLEAR);

lcd_enviar(LCD_COMANDO,LCD_HOME);

printf(lcd_putc,"\f* Motor On/off\n# salir");

return (vueltas);
}
void menu2()
{
char caracter;
int16 vueltas;
int motor_off=1;
int tecla_enter=0; //*es la tecla enter y asi controlo si la he pulsado 1 o ninguna vez

int16 n;

vueltas=introducir_valor();

do
{
caracter=kbd_getc();

switch (caracter)
{
case '*':
if (tecla_enter==0)
{
tecla_enter=1;
motor_off=0;

printf(lcd_putc,"\fON Fin: %Lu\ncuenta:",vueltas);

set_tris_a(0x10);
puertoA3=1; //Activo motor
}
else
{

lcd_gotoxy(1,1);
printf(lcd_putc,"Off Fin: %Lu\n cuenta:",vueltas);

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; //motor apagado
break;
}

if (tecla_enter)
{
n=contar();

if (vueltas==n) /*debo parar motor*/
{
motor_off=2; /*Usado para salir de la función*/
set_tris_a(0x10);
puertoA3=0; //apago motor
}
}
//}while (caracter!='#'&amp;&amp;motor_off!=2); //Cambiar los punto y coma por coma como en la siguiente linea
}while (caracter!='#'&amp,&amp,motor_off!=2);
if (motor_off==2)
{
printf(lcd_putc,"\fSe han Bobinado: \n %Lu Vueltas",n);

do
caracter=kbd_getc();
while (caracter=='\0');
}
}

PCB

Adjuntamos el PCB construido para montar toda la circuitería:

Contador Bobinadora PCB

El montaje final del proyecto se muestra en las siguientes imágenes:
Contador Bobinadora
Contador Bobinadora

Puedes descargar los ficheros del proyecto aquí.
Espero que este artículo te haya sido de utilidad. Si es así te agradecería que lo comentaras en nuestro foro.

 

Compartir

Etiquetas: , , ,