|
|
@@ -1,22 +1,27 @@
|
|
|
#include "bsp/bsp_driver.h"
|
|
|
#include "foc/core/foc_observer.h"
|
|
|
+#include "foc/core/ladrc_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;
|
|
|
+ foc_obser.is_sensorless_enable = false;
|
|
|
+ foc_obser.is_sensorless_running = false;
|
|
|
foc_obser.enc_angle = INVALID_ANGLE;
|
|
|
foc_obser.enc_est_angle = INVALID_ANGLE;
|
|
|
foc_obser.enc_speed = 0;
|
|
|
- foc_obser.smo_angle = INVALID_ANGLE;
|
|
|
- foc_obser.smo_est_angle = INVALID_ANGLE;
|
|
|
- foc_obser.smo_speed = 0;
|
|
|
+ foc_obser.sensorless_angle = INVALID_ANGLE;
|
|
|
+ foc_obser.sensorless_est_angle = INVALID_ANGLE;
|
|
|
+ foc_obser.sensorless_speed = 0;
|
|
|
foc_obser.fusion_ceof = 1.0f;
|
|
|
#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;
|
|
|
+ foc_obser.is_sensorless_enable = true;
|
|
|
+#endif
|
|
|
+#ifdef CONFIG_LADRC_OBSERVER
|
|
|
+ ladrc_observer_init(CONFIG_LADRC_OBSERVER_MIN_Wo, CONFIG_LADRC_OBSERVER_MIN_eVEL, CONFIG_LADRC_OBSERVER_LPF_FREQ);
|
|
|
+ foc_obser.is_sensorless_enable = true;
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
@@ -29,7 +34,7 @@ float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
|
|
|
foc_obser.enc_angle = motor_encoder_get_angle();
|
|
|
foc_obser.enc_speed = motor_encoder_get_speed();
|
|
|
|
|
|
- if (!foc_obser.smo_enabled) {
|
|
|
+ if (!foc_obser.is_sensorless_enable) {
|
|
|
return foc_obser.enc_angle;
|
|
|
}
|
|
|
float est_enc_delta = RPM_2_degree(prev_enc_speed);
|
|
|
@@ -56,12 +61,16 @@ float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
|
|
|
}
|
|
|
foc_obser.enc_est_angle = foc_obser.enc_angle;
|
|
|
}
|
|
|
- foc_obser.smo_est_angle = foc_obser.smo_angle + RPM_2_degree(foc_obser.smo_speed);
|
|
|
- foc_obser.smo_angle = smo_observer_update(uAlp, uBeta, iAlp, iBeta);
|
|
|
- foc_obser.smo_speed = smo_observer_est_rpm();
|
|
|
-
|
|
|
- if (foc_obser.smo_used) {
|
|
|
- return foc_obser.smo_angle;
|
|
|
+ foc_obser.sensorless_est_angle = foc_obser.sensorless_angle + RPM_2_degree(foc_obser.sensorless_speed);
|
|
|
+#ifdef CONFIG_SMO_OBSERVER
|
|
|
+ foc_obser.sensorless_angle = smo_observer_update(uAlp, uBeta, iAlp, iBeta);
|
|
|
+ foc_obser.sensorless_speed = smo_observer_vel();
|
|
|
+#elif defined CONFIG_LADRC_OBSERVER
|
|
|
+ foc_obser.sensorless_angle = ladrc_observer_update(uAlp, uBeta, iAlp, iBeta);
|
|
|
+ foc_obser.sensorless_speed = ladrc_observer_vel();
|
|
|
+#endif
|
|
|
+ if (foc_obser.is_sensorless_running) {
|
|
|
+ return foc_obser.sensorless_angle;
|
|
|
}
|
|
|
#if 0
|
|
|
return (foc_obser.enc_est_angle * foc_obser.fusion_ceof + foc_obser.smo_angle * (1.0f - foc_obser.fusion_ceof));
|
|
|
@@ -71,8 +80,8 @@ float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
|
|
|
}
|
|
|
|
|
|
float foc_observer_speed(void) {
|
|
|
- if (foc_obser.smo_used) {
|
|
|
- return foc_obser.smo_speed;
|
|
|
+ if (foc_obser.is_sensorless_running) {
|
|
|
+ return foc_obser.sensorless_speed;
|
|
|
}
|
|
|
return foc_obser.enc_speed;
|
|
|
}
|
|
|
@@ -89,24 +98,34 @@ float foc_observer_speed(void) {
|
|
|
|
|
|
#endif
|
|
|
bool foc_observer_is_encoder(void) {
|
|
|
- return !foc_obser.smo_used;
|
|
|
+ return !foc_obser.is_sensorless_running;
|
|
|
}
|
|
|
-void foc_observer_use_smo(bool use_smo) {
|
|
|
- if (foc_obser.smo_enabled) {
|
|
|
- foc_obser.smo_used = use_smo;
|
|
|
+void foc_observer_use_sensorless(bool use_smo) {
|
|
|
+ if (foc_obser.is_sensorless_enable) {
|
|
|
+ foc_obser.is_sensorless_running = use_smo;
|
|
|
}else {
|
|
|
- foc_obser.smo_used = false;
|
|
|
+ foc_obser.is_sensorless_running = false;
|
|
|
}
|
|
|
}
|
|
|
-void foc_observer_enable_smo(bool enable) {
|
|
|
- foc_obser.smo_enabled = enable;
|
|
|
+void foc_observer_enable_sensorless(bool enable) {
|
|
|
+ foc_obser.is_sensorless_enable = enable;
|
|
|
}
|
|
|
|
|
|
-float foc_observer_smo_angle(void) {
|
|
|
- return foc_obser.smo_angle;
|
|
|
+float foc_observer_sensorless_angle(void) {
|
|
|
+ return foc_obser.sensorless_angle;
|
|
|
}
|
|
|
|
|
|
-float foc_observer_smo_speed(void) {
|
|
|
- return foc_obser.smo_speed;
|
|
|
+float foc_observer_sensorless_speed(void) {
|
|
|
+ return foc_obser.sensorless_speed;
|
|
|
+}
|
|
|
+
|
|
|
+float foc_observer_sensorless_working_speed(void) {
|
|
|
+#ifdef CONFIG_SMO_OBSERVER
|
|
|
+ return CONFIG_SMO_MIN_SPEED;
|
|
|
+#elif defined CONFIG_LADRC_OBSERVER
|
|
|
+ return CONFIG_LADRC_OBSERVER_MIN_SPEED;
|
|
|
+#else
|
|
|
+ return 20000.0f;
|
|
|
+#endif
|
|
|
}
|
|
|
|