How to Read the Signal from a Hall Effect Sensor Using an Arduino

Cómo leer la señal de un sensor de efecto Hall usando un Arduino

Adam Morissette
Adam Morissette
PA Engineer

Los sensores de efecto Hall son una de las opciones de retroalimentación que ofrecemos en nuestros actuadores lineales para proporcionar información de posición y velocidad. Nuestros PA-04-HS y PA-100 tienen sensores de efecto Hall en las unidades originales. Mientras que varios de nuestros otros actuadores se pueden pedir a medida con sensores de efecto Hall.

[cta-contenido]

¡Explore nuestra gama de microcontroladores Arduino para obtener el máximo control de actuadores!

Explorar Arduino

¿QUÉ ES UN SENSOR DE EFECTO HALL?

Un sensor de efecto Hall es un componente electrónico que genera un voltaje basado en la fuerza del campo magnético que fluye a través de él. Cuando este sensor se combina con un circuito de detección de umbral de voltaje, se puede producir una señal con dos estados. En nuestros actuadores , el sensor de efecto Hall está diseñado para producir una señal de dos canales con las formas de onda cuantificadas en cualquiera de los dos estados binarios; Encendido o apagado. Estas dos señales aumentarán y disminuirán a medida que el motor eléctrico gira con una diferencia de fase de 90° entre ellas, como se muestra a continuación. La frecuencia de estos pulsos en relación con el cambio de posición en el actuador depende de su resolución general y difiere entre nuestros diferentes actuadores.

Sensores de efecto Hall

¿CÓMO SE LEEN ESTAS SEÑALES DE PASILLO?

Cómo utilizar un sensor de efecto Hall

Al leer una señal digital en un microcontrolador existen dos métodos principales; sondeos e interrupciones. El sondeo es un método programado en el que un microcontrolador verifica periódicamente el estado de una entrada para ver si ha habido un cambio. Mientras que las interrupciones son un mecanismo de hardware que cambia inmediatamente el enfoque del programa del microcontrolador cuando la señal cambia en una entrada. Cada uno de estos métodos tiene sus pros y sus contras, y cada uno tiene aplicaciones para las que son más adecuados. Para nuestro caso, querremos saber el momento exacto en que una señal cambia de estado, por lo que usaremos interrupciones. Para utilizar un sensor de efecto Hall con microcontroladores Arduino se utiliza una interrupción. Al crear una ISR o una rutina de servicio de interrupciones, se puede hacer que arduino ejecute una sección de código inmediatamente cuando se detecta un cambio definido en una entrada específica. A continuación se muestra un ejemplo de un ISR para un Arduino; una versión modificada que dirige las señales detectadas a los LED es una forma de probar un sensor de efecto Hall.

Programando un Arduino para leer sensores de efecto Hall - método de interrupción

// se necesitan variables volátiles globales para pasar datos entre

// programa principal y los ISR

señal de byte volátil A;
señal de byte volátil B;

// los pines que se pueden usar con interrupciones dependen del tablero que tengas

// están usando
entrada de byte constanteA = 2;
entrada de byte constanteB = 3;

configuración nula() {
// habilita resistencias internas en los pines de entrada
pinMode(entradaA, INPUT_PULLUP);
pinMode(entradaB, INPUT_PULLUP);
// lee el estado inicial de las entradas
señalA = lectura digital (entradaA);
señalB = lectura digital (entradaB);

// detectará un flanco ascendente o descendente
adjuntarInterrupt(digitalPinToInterrupt(entradaA),signalA_ISR,CAMBIAR);
adjuntarInterrupt(digitalPinToInterrupt(entradaB),signalB_ISR,CAMBIAR);

}

bucle vacío() {
// Aquí es donde la información de la señal se puede utilizar en un programa
}

señal nulaA_ISR() {
// cuando se detecta un cambio siempre será

// al opuesto del estado actual

señalA = !señalA;
}

señal nulaB_ISR() {
señalB = !señalB;
}

[cta-contenido]

¡Nuestro PA-04-HS viene con retroalimentación de efecto Hall incorporada!

Aprende más

¿QUÉ DEBE TENERSE EN CUENTA EN LA SOLICITUD?

Dado que las señales que estamos leyendo serán de alta frecuencia, es necesario tener en cuenta algunas consideraciones. En primer lugar, ¿cuánto tiempo tardará el programa en ejecutar el código en el ISR? ¿Cuántas señales separadas deben tener ISR? ¿Qué tan rápida es la velocidad del reloj del microcontrolador?

Un problema que se puede encontrar en un programa con un ISR prolongado es que el ISR se activará nuevamente antes de haber completado el código que contiene la vez anterior que se activó. Se recomienda mantener la cantidad mínima de código necesaria en un ISR para ayudar a evitar este problema.

En el código de ejemplo anterior, se configuran dos señales con interrupciones separadas. Ambas señales son necesarias para detectar la dirección del movimiento del actuador lineal; esto se hace comprobando qué señal cambia de baja a alta antes que la otra. La desventaja de habilitar interrupciones en ambas señales es que se ejecutará el doble de código ISR. En aplicaciones donde la dirección del movimiento del actuador no es necesaria o ya es evidente en el programa que se está ejecutando, solo sería necesario configurar una señal con una rutina de servicio de interrupción.

Algunos microcontroladores tienen la capacidad de cambiar la velocidad del reloj para que sea más rápida. La velocidad del reloj cambia la velocidad a la que el microcontrolador puede ejecutar el programa. Si la frecuencia de las señales que se leen es alta, es posible que sea necesario aumentar la velocidad del reloj para mantener el ritmo. Sin embargo, es más eficiente energéticamente utilizar una velocidad de reloj tan lenta como lo permita la aplicación.

¿QUÉ PASA SI EL MICROCONTROLADOR NO ES SUFICIENTEMENTE RÁPIDO?

Después de haber realizado las consideraciones anteriores, a veces el microcontrolador simplemente no es lo suficientemente rápido para leer el código principal y mantenerse al día con los ISR. En estos casos, es posible que desees utilizar un microcontrolador adicional. Se puede usar un microcontrolador para ejecutar los ISR, leer los datos y luego transmitir los datos necesarios a otro microcontrolador donde el código principal se puede ejecutar sin ser interrumpido.