Estoy diseñando mi propio sistema FOC (control orientado en el campo) y estoy tratando de implementar un control sin sensores. He implementado exitosamente FOC con sensor en mi sistema en dos motores diferentes usando codificadores magnéticos personalizados. Decidí implementar el estimador de posición sin sensor descrito en este documento como punto de partida:
El observador se describe en la ecuación (9) del documento y se calcula directamente utilizando las mediciones de corriente del motor y las constantes del motor precalculadas. Lo estoy replanteando aquí:
\ $ \ dot {\ hat {x}} = y_ {12} + \ frac {\ gamma} {2} (\ hat {x} -Li _ {\ alpha, \ beta}) (\ Phi ^ 2 - | \ hat {x} - Li _ {\ alpha, \ beta} | ^ 2 \ $
Donde \ $ \ gamma \ $ es la ganancia del controlador, \ $ y_ {12} \, \, i _ {\ alpha, \ beta} \ $ se miden y \ $ L, \ Phi \ $ son constantes del motor . Aproximo la variable de estado \ $ \ hat {x} \ $ estimando la integral de la salida del observador:
\ $ \ hat {x} \ approx \ sum {\ dot {\ hat {x}}} \ dt \ $
Donde dt es el tiempo entre las llamadas concurrentes del observador. La variable \ $ \ hat {x} \ $ se define como:
\ $ x = Li _ {\ alpha, \ beta} + \ Phi \ begin {bmatrix} \ cos \ theta \\ \ sin \ theta \ end {bmatrix} \ $
Lo que significa que la posición del codificador \ $ \ theta \ $ se puede calcular finalmente desde \ $ \ hat {x} \ $:
\ $ \ theta = atan2 (x_2 - Li _ {\ beta} \, \, x_1 - Li _ {\ alpha}) \ $
Puedo ejecutar el observador mientras conmuto mi motor utilizando el codificador, e imprimir el observador y el codificador theta en matlab (se muestra a continuación). El observador parece seguir bastante bien la posición del motor, pero cuando comienzo a usar la posición del observador después de unos segundos de usar el codificador, mi motor comienza a vibrar en su lugar y deja de girar. He simulado el mismo observador en matlab / simulink y obtuve resultados lo suficientemente buenos como para usar el observador simulado theta para la conmutación.
También he intentado introducir errores en el mismo rango (.1-.3 radianes) en mi codificador y no es suficiente para detener la conmutación del motor. He intentado ajustar la ganancia del observador, pero hasta ahora no he podido obtener un mejor seguimiento que el que se muestra en la imagen a continuación.
Estoy ejecutando esto en un microcontrolador STM32F0, y estoy usando el DRV8323 para la activación de la compuerta Mosfet y la amplificación en derivación actual.
Me parece que el observador theta debería ser lo suficientemente bueno para usarlo como conmutación, pero en la práctica no lo es. ¿Cómo debo abordar la resolución de este problema?
Editar: actualizó la gráfica con una velocidad del motor más lenta para facilitar la lectura (la velocidad del motor es de aproximadamente 5Hz), y agregó un error.