Medición de la velocidad de un motor de CC sin escobillas con sensores Hall con STM32

1

Tengo dificultades para entender y encontrar una solución para encontrar la velocidad de un motor BLDC. Aquí están las especificaciones:

  • BLDC trifásico con sensores Hall 3x en 120 grados, 2 pares de polos

La imagen de abajo muestra la situación:

HeconfiguradountemporizadorenmodoXORenelmicro.ElPSCes[19-1]yelPeriododelcontadores[10000-1]mientrasqueelrelojdeltemporizadores80MHz.

Mimotortienelavelocidadmáximade3000RPM.

EltemporizadorseconfiguraenmodoXORyconcadatransicióngeneraunevento.DeacuerdoconelmanualdereferenciaSTM32F407,enestemodo,cadatransiciónrestableceelregistroCCRa0.Significaquesisumoesteregistro6veces,deberíaobteneruna"Rotación eléctrica" completa o la mitad "rotación física. "ya que el motor es 2 pares de polos.

Mis preguntas:

A) Acabo de seleccionar esos números para el temporizador PSC y el período de contador de forma aleatoria ... ¿cómo afectarán estos números a mi medición? p.ej. ¿Con esos números puedo cubrir velocidades de 1 a 3000 RPM?

B)

Tengo el siguiente código dentro del XOR ISR ... ¿este código tiene sentido?

static uint32_t speed = 0;
static uint32_t time = 0;
static int isMeasuring = 0;

void XOR_ISR() {    
     uint8_t state = readHallStateFromGPIO();
    if(state == 0b101 && isMeasuring == 0) {
        time = 0;
        isMeasuring = 1;
        time += TIM4->CCR1;
    } else if(isMeasuring == 1 && state != 0b101) {
        time += TIM4->CCR1;
    } else if(isMeasuring == 1 && state == 0b101) {
        time += TIM4->CCR1;
        speed = time;
        isMeasuring = 0;
    }

Aquí, la velocidad (supongamos que mi código es correcto, debería sumar los valores del temporizador durante todo un período del sensor Hall). Luego lo convertiré a RPM al convertir la frecuencia a tiempo y multiplicar por 2 debido a los pares de polos.

¿Esto es correcto?

    
pregunta DEKKER

1 respuesta

1

Leí el código y tengo algunos comentarios o cosas que podrían ayudar (o no).

Su código: todavía estoy averiguando eso. De acuerdo con la imagen que agregó, el estado nunca será 0b101 ? ¿Estás tratando de medir el tiempo entre cada pulso XORed? Me imagino que void XOR_ISR() se llamará en el borde ascendente de cada pulso. Eso debería ser bastante sencillo, por ejemplo:

void XOR_ISR(){
    long time = TIM4->CCR1;
    int rpm = 10/time; // 60 * 1/(time*6)
}

También agregaría una calculadora de promedio móvil para suavizar un poco las mediciones.

Límite superior: funcionando a un máximo de 3000 RPM, la rueda girará 3000/60 = 50 veces por segundo. Dado que hay un total de 6 polos en la rueda, significa que cada sexta vez que se llama ISR se produce una rotación completa. Esto significa que hay un pulso 50 * 6 = 300 veces por segundo. O un pulso cada 1,6 milisegundos. Viendo que su reloj temporizador funciona a 80MHz, contará hasta 66640 por cada pulso. Esto le dará lecturas muy precisas a altas velocidades.

Límite inferior: Sin embargo, podría hacer que las lecturas de velocidad más bajas sean un poco más complejas. Digamos que la rueda está girando a 10 RPM. Eso da como resultado 10/60 * 6 = 1 pulso por segundo. Esto significa que el temporizador contará hasta 80 000 000 con cada pulso. Como dijo @Harry, esto solo cabrá en una variable long con 5 bits de sobra.

Mis pensamientos: ejecutar tu temporizador a 80 MHz es un poco excesivo. Disminuiría ligeramente la frecuencia del reloj para que la medición sea un poco más robusta a muy bajas RPM. Pero todo depende de lo que el RPM más pequeño es lo que desea medir. 10 RPM? 1 RPM? 0.1 RPM? Deberá asegurarse de que su contador no se desborda.

La precisión: el mayor error de medición que podría estar apagado por un máximo de la mitad del período del temporizador. Esto será 1 / 80MHz / 2 = 6.25ns. A un RPM máximo de 3000 RPM, esto resultará en un error 6.25ns / 1.6ms = 0.00036%. Este es un error de 0.11RPM RPM. Esto es muy bueno para la mayoría de las aplicaciones.

Espero que esto ayude! Y si alguien encuentra un problema con mis matemáticas, por favor dígame :)

Editar: Gracias, Harry, por corregir mi matemática nocturna.

    
respondido por el Hein Wessels

Lea otras preguntas en las etiquetas