EUR | USD

Cómo usar los sensores Hall BLDC como codificadores de posición, parte 3

Cómo usar un microcontrolador Teensy 3.5 para calcular la posición, la dirección y la distancia

La siguiente información tiene el objetivo de ayudar a interpretar la salida lógica del sensor Hall para determinar la posición, la dirección y la velocidad. Aunque la salida se puede utilizar para la conmutación del motor, ese aspecto del funcionamiento del motor BLDC no se explica aquí.

Consulte la Parte 1y la Parte 2de esta serie de blogs para revisar este proyecto hasta este punto.

Visión general

Cuando las tres salidas del sensor de efecto Hall en un BLDC se alimentan a un microcontrolador, las señales se pueden procesar como un codificador de tres canales. Los datos se pueden mostrar o utilizar para determinar el conteo de impulsos, la dirección de rotación y las revoluciones promedio por minuto (RPM). Las RPM se promedian para crear una progresión suave en los valores mostrados.

Placa de desarrollo PJRC Teensy 3.5

La placa de desarrollo PJRC Teensy 3.5 de SparkFun (1568-1464-ND) tiene más que suficientes interrupciones digitales para manejar las tres entradas de señal de los sensores Hall e incluye cabeceras soldadas. El Teensy 3.5 es lo suficientemente potente como para ejecutar muchas tareas adicionales debido a una gran cantidad de canales de E/S adicionales y se puede usar para el registro de datos utilizando la tarjeta SD incorporada.

Figura 1: El tablero de evaluación de SparkFun Electronics Teensy 3.5. (Fuente de la imagen: SparkFun Electronics)

Tablero de prueba de la salida del sensor y PJRC Teensy 3.5

Con un tablero de prueba (438-1045-ND o similar), coloque el Teensy 3.5 con el conector USB a la derecha y las clavijas superiores del cabezal insertadas en la primera fila de orificios del tablero de pruebas sobre la partición (Figura 2). Esto permitirá espacio para la conexión de las salidas del sensor a la E/S de Teensy.

Figura 2: Tablero de prueba con el tablero Teensy 3.5 y conectores puente. (Fuente de la imagen: Digi-Key Electronics)

Utilice cables de puente (BKWK-3-ND) para hacer todas las conexiones del tablero de prueba. Conecte la fuente de alimentación de rail positivo (+) de 5 V 1 A al riel positivo superior o inferior del tablero de prueba; luego conecte el riel de alimentación negativo (-) al riel de alimentación negativo superior o inferior. Conecte los cables positivo (rojo) y negativo (negro) del conector del sensor de pasillo a los rieles positivo y negativo del tablero de prueba respectivamente; luego conecte los tres rieles sensores del conector al Teensy 3.5 en los pines 2, 3 y 4 en cualquier orden.

La salida del sensor es baja activa, lo que significa que, cuando se dispara, la salida está conectada al riel de alimentación negativa. Cuando no se dispara, la salida del sensor debe subirse al riel de alimentación positiva para establecer dos estados lógicos definidos. Inserte tres resistencias de 4 KΩ - 8 KΩ en la placa de pruebas para usarlas como pull-ups para la salida del sensor (Figura 2).

Conecte el Teensy 3.5 a una computadora usando un cable USB micro B a un cable A estándar.

Software

Teensy 3.5 es compatible con el entorno de desarrollo integrado (IDE) de Arduino con fines de programación. El complemento IDE y Teensyduino está disponible en línea. Siga los procedimientos de instalación en https://www.pjrc.com/teensy/td_download.html para continuar.

El código de ejemplo de programación suministrado a continuación utiliza tres interrupciones de hardware para monitorear cualquier cambio (picos ascendentes y descendentes) de las salidas del sensor Hall. Una vez que se produce una interrupción, se leen el reloj de tiempo transcurrido del Teensy 3.5 y dos de los tres pines de entrada. Los valores del sensor se comparan para determinar la dirección de rotación; luego se realizan otros cálculos para determinar el conteo de impulsos y el promedio de RPM. El tiempo entre las interrupciones se calcula comparando el valor del reloj actual con el valor del reloj almacenado de la interrupción anterior.

Hay cuatro valores disponibles para la impresión en serie dentro del bucle de vacío. Comente o quite el comentario de las líneas de código para desactivar o activar la función de impresión en serie; luego descargue el código en Teensy e inicie el monitor serie para ver los datos en vivo. Gire el motor BLDC para observar los cambios en los valores en el monitor de impresión.

Nota: Las funciones de impresión en serie ralentizan el microcontrolador. Las interrupciones de E/S causan la detención y el salto de los valores mostrados ya que, por definición, el proceso de impresión en serie se interrumpe cada vez que un pin de entrada cambia de estado. Si no se utiliza la función de visualización, asegúrese de que todas las funciones de impresión en serie estén comentadas fuera del código.

Copy/ * Programa de lectura y cálculo de BLDC Hall Sensor para Teensy 3.5 en el IDE de Arduino (Ver.1). Digi-Key Electronics * / / ***************************** Variables ************* ******************** / #define CW 1 // Asignar un valor para representar la rotación en sentido horario #define CCW -1 // Asignar un valor para representar el contador del reloj rotación sabia bool HSU_Val = digitalRead (2); // Establezca el valor del sensor U como booleano y lea el estado inicial bool HSV_Val = digitalRead (3); // Establezca el valor del sensor V como booleano y lea el estado inicial bool HSW_Val = digitalRead (4); // Establezca el valor del sensor W como booleano y lea el estado inicial int directo = 1; // Variable entera para almacenar la dirección de rotación de BLDC int pulseCount; // Variable entera para almacenar el conteo de impulsos float startTime; // Variable flotante para almacenar la hora de inicio de la interrupción actual flotante prevTime; // Variable flotante para almacenar la hora de inicio de la interrupción anterior flotador pulseTimeW; // Variable flotante para almacenar el tiempo transcurrido entre interrupciones para el sensor de sala W float pulseTimeU; // Variable flotante para almacenar el tiempo transcurrido entre interrupciones para el sensor de pasillo U float pulseTimeV; // Variable flotante para almacenar el tiempo transcurrido entre interrupciones para el sensor de pasillo V flotador AvPulseTime; // Variable flotante para almacenar el tiempo promedio transcurrido entre todas las interrupciones PPM flotante; // Flotante variable para almacenar impulsos calculados por minuto RPM flotantes; // Variable flotante para almacenar revoluciones calculadas por minuto / *****************************INSTALACIÓN********* ************************ / void setup () {// Establezca los pines digitales 2, 3 y 4 como entradas pinMode (2, INPUT); pinMode (3, ENTRADA); pinMode (4, ENTRADA); // Establezca los pines digitales 2, 3 y 4 como interrupciones que se activan en los cambios de picos ascendentes y descendentes. Llamar a una función (es decir, HallSensorU) sobre el cambio attachInterrupt (digitalPinToInterrupt (2), HallSensorU, CHANGE); attachInterrupt (digitalPinToInterrupt (3), HallSensorV, CHANGE); attachInterrupt (digitalPinToInterrupt (4), HallSensorW, CHANGE); // Inicialice el monitor de impresión y establezca la velocidad en baudios a 9600 Serial.begin (9600); } /*************************** Bucle principal ******************* *********** / void loop () {if ((millis () - prevTime)> 600) RPM = 0; // Cero fuera de la variable RPM si la rueda está detenida //Serial.print(HSU_Val); Serial.print (HSV_Val); Serial.println (HSW_Val); // Mostrar los valores del sensor Hall //Serial.println(direct); // Mostrar la dirección de rotación //Serial.println(pulseCount); // Muestra el conteo de pulsos Serial.println (RPM); // Mostrar revoluciones por minuto} / ************************ Funciones de interrupción **************** *********** / void HallSensorW () {startTime = millis (); // Establezca startTime en el valor de tiempo transcurrido del microcontrolador actual HSW_Val = digitalRead (4); // Leer el valor actual del sensor W hall HSV_Val = digitalRead (3); // Leer el valor actual del sensor de hall V (o U) directo = (HSW_Val == HSV_Val)? CW : CCW; // Determine la dirección de rotación (ternaria si sentencia) pulseCount = pulseCount + (1 * direct); // Agregar 1 al conteo de pulsos pulseTimeW = startTime - prevTime; // Calcular el tiempo actual entre los pulsos AvPulseTime = ((pulseTimeW + pulseTimeU + pulseTimeV) / 3); // Calcular el tiempo promedio entre los pulsos PPM = (1000 / AvPulseTime) * 60; // Calcular los pulsos por minuto (1000 milis en 1 segundo) RPM = PPM / 90; // Calcular revoluciones por minuto en base a 90 pulsos por rev prevTime = startTime; // Recuerde la hora de inicio de la siguiente interrupción} void HallSensorV () {startTime = millis (); HSV_Val = digitalRead (3); HSU_Val = digitalRead (2); // Leer el valor actual del sensor de la sala U (o W) directo = (HSV_Val == HSU_Val)? CW : CCW; pulseCount = pulseCount + (1 * directo); pulseTimeV = startTime - prevTime; AvPulseTime = ((pulseTimeW + pulseTimeU + pulseTimeV) / 3); PPM = (1000 / AvPulseTime) * 60; RPM = PPM / 90; prevTime = startTime; } void HallSensorU () {startTime = millis (); HSU_Val = digitalRead (2); HSW_Val = digitalRead (4); // Leer el valor actual del sensor de hall W (o V) directo = (HSU_Val == HSW_Val)? CW : CCW; pulseCount = pulseCount + (1 * directo); pulseTimeU = startTime - prevTime; AvPulseTime = ((pulseTimeW + pulseTimeU + pulseTimeV) / 3); PPM = (1000 / AvPulseTime) * 60; RPM = PPM / 90; prevTime = startTime; } 

Nota: Los programadores pueden verse tentados a dividir el código de la función de interrupción repetitiva en una función adicional para simplificar el programa general. De lo contrario, se puede interrumpir la función adicional y cambiar los valores entre los cálculos que dan como resultado errores en los datos. Tal como se indica en los pasos del tablero de prueba y en el código del proceso, el orden de entrada del sensor solo afecta la determinación de la dirección de rotación. Descomente la línea de impresión en serie relacionada con la variable "directo" para ver el valor en el monitor de pantalla. Verifique que el valor permanezca como 1 o -1 según la forma en que gire la rueda. Si se desvía, gire el “CW” y el “CCW” en el código ternario en la función de interrupción correspondiente para corregir la salida.

Resumen

Los sensores BLDC Hall ahora están configurados como un codificador de tres canales y baja resolución, capaz de proporcionar datos precisos para ayudar en la navegación y la detección de la posición de las ruedas sin obstaculizar su función de control principal del motor. Algunos controladores BLDC usan solo EMF en la parte posterior para determinar la posición de la bobina y el imán, dejando las salidas del sensor Hall disponibles únicamente para la navegación y la detección de posición. De cualquier manera, los sensores tienen más valor para el usuario que solo el control del motor.

Recursos adicionales:

Arduino IDE: http://www.arduino.cc/en/Main/Software

Teensyduino: https://www.pjrc.com/teensy/td_145/TeensyduinoInstall.exe

Información sobre el autor

Image of Don Johanneck

Don Johanneck, desarrollador de contenido técnico de Digi-Key Electronics, ha trabajado para esta empresa desde 2014. Fue promovido recientemente y su responsabilidad actual es de escribir las descripciones de videos y contenido sobre productos. Don obtuvo un título de Ciencias aplicadas en tecnología electrónica y sistemas automatizados en Northland Community & Technical College a través del programa de becas de Digi-Key. También disfruta del control por radio y restauración y experimentación con máquinas antiguas.

More posts by Don Johanneck