ソースを参照

加入强制无感运行

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 2 年 前
コミット
1128ff67b5

+ 2 - 2
Applications/foc/commands.c

@@ -579,8 +579,8 @@ static void process_foc_command(foc_cmd_body_t *command) {
 		{
 			bool sensorless = decode_u8((u8 *)command->data)?true:false;
 			sys_debug("use smo %d\n", sensorless);
-#if 0
-			if (sensorless && mc_is_start() && PMSM_FOC_GetSpeed() >= foc_observer_sensorless_working_speed()) {
+#if 1
+			if (sensorless && mc_is_start() && foc_observer_sensorless_stable()) {
 				sys_debug("use smo %d\n", sensorless);
 				foc_observer_use_sensorless(sensorless);
 			}else {

+ 11 - 3
Applications/foc/core/foc_observer.c

@@ -6,6 +6,7 @@
 
 static foc_observer_t foc_obser = {
 	.enc_err_cnt = 0,
+	.b_force_sensorless = false,
 };
 void foc_observer_init(void) {
 	foc_obser.is_sensorless_enable = false;
@@ -19,6 +20,7 @@ void foc_observer_init(void) {
 	foc_obser.is_sensorless_stable = false;
 	foc_obser.sensorless_stable_cnt = 0;
 	foc_obser.sensorless_unstable_cnt = 0;
+	foc_obser.b_force_sensorless = 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.is_sensorless_enable = true;
@@ -44,6 +46,9 @@ float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta){
 }
 
 bool foc_observer_diagnostic(float enc_angle, float enc_vel) {
+	if (foc_obser.b_force_sensorless) {
+		return true;
+	}
 	if (enc_vel <= (foc_observer_sensorless_working_speed() - 100.0f)) {
 		if (!foc_obser.is_sensorless_running) {
 			if (motor_encoder_may_error()) {
@@ -91,14 +96,17 @@ float foc_observer_speed(void) {
 }
 
 bool  foc_observer_is_encoder(void) {
+	if (foc_obser.b_force_sensorless) {
+		return false;
+	}
 	return !foc_obser.is_sensorless_running;
 }
 
 void  foc_observer_use_sensorless(bool use_smo) {
-	if (foc_obser.is_sensorless_enable) {
-		foc_obser.is_sensorless_running = use_smo;
+	if (foc_obser.is_sensorless_enable && use_smo) {
+		foc_obser.b_force_sensorless = true;
 	}else {
-		foc_obser.is_sensorless_running = false;
+		foc_obser.b_force_sensorless = false;
 	}
 }
 void  foc_observer_enable_sensorless(bool enable) {

+ 1 - 0
Applications/foc/core/foc_observer.h

@@ -19,6 +19,7 @@ typedef struct {
 	float real_est_diff;
 	float real_est_ration;
 	u16   enc_err_cnt;  //融合系数
+	bool  b_force_sensorless;
 }foc_observer_t;
 void foc_observer_init(void);
 float foc_observer_update(float uAlp, float uBeta, float iAlp, float iBeta);