- Materiales necesarios:
- Cálculo de la velocidad y la distancia cubiertas:
- Diagrama de circuito y configuración del hardware:
- Simulación:
- Programación de su PIC16F877A:
- Explicación de trabajo:
Medir la velocidad / rpm de un vehículo o un motor siempre ha sido un proyecto fascinante para probar. Entonces, en este proyecto vamos a construir uno usando los microcontroladores PIC listos para la industria. Usaremos un trozo de imán y un sensor Hall para medir la velocidad. Hay otras formas / sensores para medir la velocidad, pero usar un sensor de pasillo es barato y también se puede usar en cualquier tipo de motor / vehículo. Al hacer este proyecto, también mejoraremos nuestras habilidades para aprender PIC16F877A, ya que el proyecto implica el uso de interrupciones y temporizadores. Al final de este proyecto, podrá calcular la velocidad y las distancias recorridas por cualquier objeto giratorio y mostrarlas en una pantalla LCD de 16x2. Comencemos con este circuito de velocímetro y odómetro digital con PIC.
Materiales necesarios:
- PIC16F877A
- Regulador de voltaje 7805
- Sensor de efecto Hall (US1881 / 04E)
- Pantalla LCD 16 * 2
- Una pequeña pieza de imán
- Cables de conexión
- Condensadores
- Tablero de circuitos.
- Fuente de alimentación
Cálculo de la velocidad y la distancia cubiertas:
Antes de comenzar a construir el circuito, comprendamos cómo usaremos un sensor Hall y un imán para calcular la velocidad de una rueda. Anteriormente, hemos utilizado la misma técnica para construir el velocímetro Arduino que muestra lecturas en teléfonos inteligentes Android.
Un sensor Hall es un dispositivo que puede detectar la presencia de un imán en función de su polaridad. Pegamos un pequeño trozo de imán en la rueda y colocamos el sensor de pasillo cerca de él de tal manera que cada vez que la rueda gira el sensor de pasillo lo detecta. Luego usamos la ayuda de temporizadores e interrupciones en nuestro microcontrolador PIC para calcular el tiempo necesario para una rotación completa de la rueda.
Una vez que se conoce el tiempo empleado, podemos calcular las RPM utilizando las fórmulas siguientes, donde 1000 / tiempo empleado nos dará el RPS y si lo multiplicamos por 60 obtendrá las RPM.
rpm = (1000 / tiempo tomado) * 60;
Donde (1000 / tiempo tomado) da las rps (revoluciones por segundo) y se multiplica por 60 para convertir rps a rpm (revoluciones por minuto).
Ahora para calcular la velocidad del vehículo tenemos que conocer el radio de la rueda. En nuestro proyecto hemos utilizado una pequeña rueda de juguete que tiene un radio de solo 3 cm. Pero asumimos que el radio de la rueda debe ser de 30 cm (0,3 m) para que podamos visualizar las lecturas.
El valor también se multiplica por 0.37699 ya que sabemos que Velocidad = (RPM (diámetro * Pi) / 60). Las fórmulas se simplifican hasta
v = radio_de_ rueda * rpm * 0.37699;
Una vez que calculamos la velocidad, también podemos calcular la distancia recorrida utilizando un método similar. Con nuestra disposición Hall e imán sabemos cuántas veces ha girado la rueda. También conocemos el radio de la rueda, mediante el cual podemos encontrar la circunferencia de la rueda, suponiendo que el radio de la rueda sea de 0,3 m (R), los valores de la circunferencia Pi * R * R serán 0,2827. Esto significa que cada vez que el sensor de pasillo se encuentra con el imán, la rueda recorre una distancia de 0,2827 metros.
Distancia_cubierta = distancia_cubierta + circunferencia_del_circulo
Dado que, ahora que sabemos cómo funcionará este proyecto, procedamos a nuestro diagrama de circuito y comencemos a construirlo.
Diagrama de circuito y configuración del hardware:
El diagrama de circuito de este proyecto de velocímetro y odómetro es muy simple y se puede construir en una placa de pruebas. Si ha seguido los tutoriales de PIC, también puede reutilizar el hardware que usamos para aprender los microcontroladores PIC. Aquí hemos utilizado la misma placa perf que hemos construido para LED parpadeando con microcontrolador PIC, como se muestra a continuación:
Las conexiones de clavijas para la MCU PIC16F877A se proporcionan en la tabla siguiente.
S. No: |
Número de PIN |
Nombre de PIN |
Conectado a |
1 |
21 |
RD2 |
RS de LCD |
2 |
22 |
RD3 |
E de LCD |
3 |
27 |
RD4 |
D4 de LCD |
4 |
28 |
RD5 |
D5 de LCD |
5 |
29 |
RD6 |
D6 de LCD |
6 |
30 |
RD7 |
D7 de LCD |
7 |
33 |
RB0 / INT |
3 er pin del sensor Hall |
Una vez que construya su proyecto, debería verse así en la imagen de abajo
Como puede ver, he usado dos cajas para colocar el motor y un sensor de pasillo en una posición cercana. Puede fijar el imán en su objeto giratorio e intacto el sensor de pasillo cerca de él de tal manera que pueda detectar el imán.
Nota: el sensor Hall tiene polaridades, así que asegúrese de qué polo está detectando y colóquelo en consecuencia.
También asegúrese de usar una resistencia Pull-up con el pin de salida del sensor Hall.
Simulación:
La simulación de este proyecto se realiza utilizando Proteus. Dado que el proyecto implica objetos en movimiento, no es posible demostrar el proyecto completo mediante simulación, pero se puede verificar el funcionamiento de la pantalla LCD. Simplemente cargue el archivo hexadecimal en la simulación y simule. Podrá notar que la pantalla LCD funciona como se muestra a continuación.
Para comprobar si el velocímetro y el odómetro están funcionando, reemplacé el sensor Hall con un dispositivo de estado lógico. Durante la simulación, puede hacer clic en el botón de estado lógico para activar la interrupción y verificar si la velocidad y la distancia recorridas se actualizan como se muestra arriba.
Programación de su PIC16F877A:
Como se dijo anteriormente, utilizaremos la ayuda de temporizadores e interrupciones en el microcontrolador PIC16F877A para calcular el tiempo necesario para una rotación completa de la rueda. Ya hemos aprendido a usar Timers en nuestro tutorial anterior. He dado el código completo del proyecto al final de este artículo. Además, he explicado algunas líneas importantes a continuación.
Las siguientes líneas de código inicializan el puerto D como pines de salida para la interfaz LCD y RB0 como pin de entrada para usarlo como pin externo. Además, hemos habilitado la resistencia pull-up interna usando OPTION_REG y también hemos establecido 64 como preventa. Luego, habilitamos la interrupción global y periférica para habilitar el temporizador y la interrupción externa. Para definir RB0 como bit de interrupción externa, INTE debe hacerse alto. El valor de desbordamiento se establece en 100 para que por cada milisegundo se active el indicador de interrupción del temporizador TMR0IF. Esto ayudará a ejecutar un temporizador de milisegundos para determinar el tiempo necesario en milisegundos:
TRISD = 0x00; // PORTD declarado como salida para la interfaz LCD TRISB0 = 1; // DEFINIR el pin RB0 como entrada para usar como pin de interrupción OPTION_REG = 0b00000101; // Timer0 64 como prescalar // También habilita PULL UPs TMR0 = 100; // Cargue el valor de tiempo para 1ms; delayValue puede estar entre 0-256 solo TMR0IE = 1; // Habilita el bit de interrupción del temporizador en el registro PIE1 GIE = 1; // Habilitar la interrupción global PEIE = 1; // Habilita la interrupción de periféricos INTE = 1; // Habilita RB0 como pin de interrupción externo
La siguiente función se ejecutará cada vez que se detecte una interrupción. Podemos nombrar la función según nuestro deseo, así que la he nombrado speed_isr (). Este programa se ocupa de dos interrupciones, una es la interrupción del temporizador y la otra es la interrupción externa. Siempre que ocurre una interrupción del temporizador, la bandera TMR0IF se pone alta, para borrar y restablecer la interrupción, tenemos que hacerla baja definiendo TMR0IF = 0 como se muestra en el código a continuación.
void interrupt speed_isr () {if (TMR0IF == 1) // El temporizador se ha desbordado {TMR0IF = 0; // Borrar el indicador de interrupción del temporizador milli_sec ++; } si (INTF == 1) {rpm = (1000 / mili_seg) * 60; velocidad = 0,3 * rpm * 0,37699; // (Suponiendo que el radio de la rueda sea de 30 cm) INTF = 0; // limpia la bandera de interrupción milli_sec = 0; distancia = distancia + 028,2; }}
De manera similar, cuando ocurre una interrupción externa, la bandera INTF se elevará, esto también debe borrarse definiendo INTF = 0. La interrupción del temporizador mantiene el tiempo necesario y la interrupción externa determina cuándo la rueda ha completado una rotación completa. Con estos datos se calcula la velocidad y la distancia recorridas por la rueda durante cada interrupción externa.
Una vez calculadas la velocidad y la distancia, pueden mostrarse simplemente en la pantalla LCD utilizando nuestras funciones LCD. Si es nuevo en las pantallas LCD, consulte nuestro tutorial de interfaz LCD con MCU PIC16F877A.
Explicación de trabajo:
Una vez que haya preparado el hardware y el software, simplemente cargue el código en su PIC16F877A. Si es completamente nuevo en PIC, entonces debería leer algunos tutoriales sobre cómo cargar el programa en un microcontrolador PIC16F877A.
He utilizado un POT variable para ajustar la velocidad del motor con fines de demostración. También puede utilizar lo mismo para buscar una aplicación en tiempo real. Si todo funciona como se esperaba, entonces debería poder obtener la velocidad en km / h y la distancia cubierta en términos de metros, como se muestra en el video a continuación.
Espero que hayas disfrutado del proyecto y lo hayas hecho funcionar. Si no, puede utilizar la sección de comentarios a continuación o el foro para publicar su duda.