FOC para un motor BLDC con sensores Hall pero sin codificador

0

Estoy intentando implementar un algoritmo FOC en una MCU para usar con un motor BLDC.

Mi problema es que solo tengo la retroalimentación del sensor Hall, no se puede usar un codificador preciso. Con este motor de 4 pares de polos, los sensores Hall proporcionan una resolución de 15 grados.

Creo que esta es la razón por la que mi algoritmo está fallando y no puedo obtener los valores de d y q de DC constante.

¿Hay alguna forma mejor de conducir un motor BLDC que FOC? Lo que realmente necesito es una forma de alimentar el par / corriente al regulador y poder leer con precisión los comentarios.

Mi circuito analógico para medir las corrientes \ $ I_a \ $ y \ $ I_b \ $ funciona bien, simplemente no sé cómo calcular el valor de retroalimentación necesario.

En otras palabras, ¿puede FOC incluso funcionar para BLDC sin un codificador pero solo con sensores Hall? Si no, ¿cuál es la mejor manera?

Mi circuito analógico:

    
pregunta Bremen

2 respuestas

1
  

puede FOC incluso trabajar para BLDC sin un codificador pero solo con Hall   sensores?

Usted tiene un codificador, simplemente no tiene una resolución muy alta. ¿Pero cómo aumentarlo?

Una vez que sepa qué tan rápido está girando el rotor (el tiempo entre los cambios de la señal del sensor Hall) puede predecir ángulos intermedios. Si la velocidad del motor está cambiando, la predicción estará desactivada, pero también puede compensar esto midiendo la aceleración y factorizándola.

    
respondido por el Bruce Abbott
1

Es bastante difícil pensar en un sistema de este tipo sin crear un estimador de velocidad / posición del eje como un concepto separado cuyas propiedades puede ajustar independientemente de los otros componentes.

El estimador actualizaría la estimación de posición / velocidad cada vez que actualice el ciclo de control. Las entradas al estimador son el paso del tiempo (por ejemplo, las señales del bucle de control) y los cambios de entrada de Hall. Expresada en C ++, la API del estimador tendría el siguiente aspecto:

class ShaftEstimator {
  ...
  float m_angle = 0., m_speed = 0.;
  /// Initializes the estimator with null angle and speed
  ShaftEstimator();
  /// Called every loop tick. Updates the angle and speed.
  void update(bool hall_a, bool hall_b, bool hall_c);
  /// Shaft position in radians.
  float angle() const { return m_angle; }
  /// Shaft speed in radians per tick.
  float speed() const { return m_speed; }
};

El estimador no necesita acceso a ningún hardware: la API anterior es todo lo que necesita para interactuar con el resto del sistema. Dado que update() se llama periódicamente a una tasa fija, el estimador puede realizar un seguimiento de la cantidad de tics que tomó el eje para rotar entre los cambios de estado de Hall. Podría aplicar un filtrado acorde con la relación de inercia en el sistema en comparación con el par perturbador esperado (ya sea generado por el motor o aplicado externamente), también podría hacer un estimador más complejo que use el par generado por el motor para estimar la eficacia. Inercia del sistema motor y par de carga externo aplicado. Nada de eso es particularmente complicado; Aquí tiene un punto de partida que aclara cómo debe verse la interfaz del estimador.

Si desea un punto de inicio, nota de aplicación AVR32732 tiene un enlace al código fuente que incluye una implementación completa de un estimador de este tipo, aunque utiliza innecesariamente interrupciones para leer las entradas de Hall, no lo necesita, ni ofrece ningún beneficio para hacerlo.

    
respondido por el Kuba Ober

Lea otras preguntas en las etiquetas