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.