#include "bsp/bsp.h" #include "foc/core/foc_observer.h" #include "foc/core/smo_observer.h" #include "foc/motor/motor.h" static foc_observer_t foc_obser; void foc_observer_init(void) { foc_obser.smo_enabled = false; foc_obser.smo_used = false; #ifdef CONFIG_SMO_OBSERVER smo_observer_init(CONFIG_SMO_PLL_BANDWITH, CONFIG_SMO_LFP_WC, CONFIG_SMO_GAIN_K, CONFIG_SMO_SIGMOID_MAX); foc_obser.smo_enabled = true; #endif } float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){ if (foc_obser.smo_enabled) { foc_obser.smo_angle = smo_observer_update(uAlp, uBeta, iAlp, iBeta); foc_obser.smo_speed = smo_observer_est_rpm(); } foc_obser.enc_angle = motor_encoder_get_angle(); foc_obser.enc_speed = motor_encoder_get_speed(); if (foc_obser.smo_used) { return foc_obser.smo_angle; } return foc_obser.enc_angle; } float foc_observer_speed(void) { if (foc_obser.smo_used) { return foc_obser.smo_speed; } return foc_obser.enc_speed; } bool foc_observer_is_encoder(void) { return !foc_obser.smo_used; } void foc_observer_use_smo(bool use_smo) { if (foc_obser.smo_enabled) { foc_obser.smo_used = use_smo; }else { foc_obser.smo_used = false; } } void foc_observer_enable_smo(bool enable) { foc_obser.smo_enabled = enable; } float foc_observer_smo_angle(void) { return foc_obser.smo_angle; } float foc_observer_smo_speed(void) { return foc_obser.smo_speed; }