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

¿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 dos señales 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.

Sensores de efecto Hall

¿Cómo se leen estas señales?

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 el estado 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. En un microcontrolador Arduino , se utiliza una interrupción creando una ISR o rutina de servicio de interrupción; en el código siguiente se muestra un ejemplo de esto.

// 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;
}


¿Qué se debe considerar 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 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 en un ISR para ayudar a evitar este problema.

En el código de ejemplo anterior, se configuran dos señales con interrupciones. Ambas señales son necesarias para poder detectar la dirección del movimiento del actuador lineal. La desventaja de habilitar interrupciones en ambas señales es que un ISR se activa con el doble de frecuencia. En aplicaciones donde no es necesario conocer la dirección del movimiento del actuador o ya es evidente a partir del programa que se está ejecutando, solo una señal necesitaría una interrupción.

Algunos microcontroladores tienen la capacidad de utilizar velocidades de reloj más rápidas o más lentas. La velocidad del reloj cambia la rapidez con 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. 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 lo 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.

¿Qué información pueden proporcionar las señales?

Si bien los sensores de efecto Hall de nuestros actuadores solo proporcionan dos señales binarias, las señales mismas se pueden usar en un programa para calcular varios parámetros útiles diferentes.

  • dirección del movimiento
  • Posición de la varilla del actuador
  • La velocidad de la varilla del actuador.

Dirección

La dirección del movimiento de un actuador se puede determinar observando el estado actual de las dos señales y comparándolo con el último estado de las dos señales. Esto se debe a que las dos señales cambiarán cuál está adelantada y cuál retrasada dependiendo de la dirección del movimiento del actuador.

Borde actual detectado

Último borde detectado

Dirección

Señal A creciente

Señal B cayendo

Retrayendo

Señal A cayendo

Señal B en aumento

Retrayendo

Señal A creciente

Señal B en aumento

Extensión

Señal A cayendo

Señal B cayendo

Extensión

Posición

La posición del actuador requiere algunos cálculos utilizando las señales de efecto Hall y algunas mediciones del propio actuador. La ecuación para la posición de la varilla del actuador requiere la longitud de carrera del actuador y el número total de bordes detectados desde completamente retraídos hasta completamente extendidos. Utilizando estas medidas se puede utilizar la siguiente ecuación:

Fórmula

Los bordes detectados desde que están completamente retraídos en la ecuación anterior comenzarán en cero y aumentarán en uno cuando se detecte un borde en la dirección hacia adelante y disminuirán en uno cuando se detecte un borde en la dirección hacia atrás.


Velocidad

La velocidad de un actuador se puede medir utilizando las señales de efecto Hall implementando un temporizador en el programa. Este temporizador se utilizará para medir el tiempo entre los bordes detectados. Además, se requiere el valor calculado del cambio de carrera por borde detectado. Usando estos valores se puede utilizar la siguiente ecuación:

Fórmula

¿Interesado en leer más sobre los sensores de efecto Hall?

Consulte nuestras publicaciones de Instructables sobre este tema:

Sensores de efecto Hall 1: control de posición

Sensores de efecto Hall 2: sincronización de movimiento

Sensores de efecto Hall 3: control PID