Просмотр исходного кода

1. 增加mos2的采集
2. 增加acc电门电压的采集
3. 检测锁电机线处理,开机5s内检测

Signed-off-by: huhui <huhui@sharkgulf.com>

huhui 3 лет назад
Родитель
Сommit
0df69e24bd

+ 16 - 0
Applications/bsp/gpio.c

@@ -68,6 +68,13 @@ void mc_brk_gpio_init(void) {
 #endif
 }
 
+void gpio_mlock_init(void) {
+#ifdef GPIO_MLOCK_IN_GROUP
+	rcu_periph_clock_enable(GPIO_MLOCK_IN_RCU);
+	gpio_init(GPIO_MLOCK_IN_GROUP, GPIO_MLOCK_IN_MODE, GPIO_OSPEED_50MHZ, GPIO_MLOCK_IN_PIN);
+#endif
+}
+
 void gpio_phase_u_detect(bool enable) {
 #ifdef GPIO_UDEC_OUT_GROUP
 	if (enable) {
@@ -85,10 +92,19 @@ void gpio_phase_u_detect(bool enable) {
 #endif
 }
 
+void mc_gpio_init(void) {
+	gpio_mlock_init();
+	mc_brk_gpio_init();
+}
+
 bool mc_get_gpio_brake(void) {
 	return gpio_input_bit_get(GPIO_BRAKE_IN_GROUP, GPIO_BRAKE_IN_PIN) == SET;
 }
 
+bool gpio_motor_locked(void) {
+	return gpio_input_bit_get(GPIO_MLOCK_IN_GROUP, GPIO_MLOCK_IN_PIN) == RESET;
+}
+
 void gpio_ir2136_enable(bool enable) {
 #ifdef GD32_FOC_DEMO
 	gpio_bit_write(_pins[IR2136S_Enable_pin].group, _pins[IR2136S_Enable_pin].pin, (enable)?SET:RESET);

+ 2 - 0
Applications/bsp/gpio.h

@@ -26,5 +26,7 @@ void gpio_beep(u32 ms);
 void gpio_phase_u_detect(bool enable);
 void mc_brk_gpio_init(void);
 bool mc_get_gpio_brake(void);
+void mc_gpio_init(void);
+bool gpio_motor_locked(void);
 
 #endif /* _GPIO_PIN_H__ */

+ 40 - 9
Applications/foc/motor/motor.c

@@ -22,6 +22,7 @@
 #include "foc/limit.h"
 
 static bool mc_is_hwbrake(void);
+static bool mc_is_gpio_mlock(void);
 static void _pwm_brake_prot_timer_handler(shark_timer_t *);
 static shark_timer_t _brake_prot_timer = TIMER_INIT(_brake_prot_timer, _pwm_brake_prot_timer_handler);
 static void _autohold_beep_timer_handler(shark_timer_t *);
@@ -62,7 +63,12 @@ static u32 _self_check_task(void *p) {
 		err_add_record(FOC_CRIT_Encoder_Err, 0);
 		mc_set_critical_error(FOC_CRIT_Encoder_Err);
 	}
-	return 0;
+	if (get_tick_ms() < 5000) { //启动后5s内检测锁电机线
+		if (mc_is_gpio_mlock()) {
+			mc_lock_motor(true);
+		}
+	}
+	return 5;
 }
 
 static void mc_detect_vbus_mode(void) {
@@ -107,7 +113,7 @@ void mc_init(void) {
 	mc_detect_vbus_mode();
 	PMSM_FOC_CoreInit();
 	eCtrl_init(nv_get_foc_params()->n_acc_time, nv_get_foc_params()->n_dec_time);
-	mc_brk_gpio_init();
+	mc_gpio_init();
 	limter_set_under_voltage(nv_get_foc_params()->s_minDCVol);
 	MC_Check_MosVbusThrottle();
 	sched_timer_enable(CONFIG_SPD_CTRL_US);
@@ -463,13 +469,17 @@ bool mc_lock_motor(bool lock) {
 	if (motor.b_lock_motor == lock) {
 		return true;
 	}
+	int ret = true;
+	u32 mask = cpu_enter_critical();
 	if (motor.b_start) {
 		PMSM_FOC_SetErrCode(FOC_NotAllowed);
-		return false;
+		ret = false;
+		goto ml_ex_cri;
 	}
 	if (lock && (PMSM_FOC_GetSpeed() > 10)) {
 		PMSM_FOC_SetErrCode(FOC_NowAllowed_With_Speed);
-		return false;
+		ret = false;
+		goto ml_ex_cri;
 	}
 	motor.b_lock_motor = lock;
 	if (lock) {
@@ -479,7 +489,9 @@ bool mc_lock_motor(bool lock) {
 	}else {
 		pwm_stop();
 	}
-	return true;
+ml_ex_cri:
+	cpu_exit_critical(mask);
+	return ret;
 }
 
 bool mc_auto_hold(bool hold) {
@@ -528,6 +540,25 @@ bool mc_throttle_released(void) {
 	return get_throttle_float() <= nv_get_foc_params()->n_minThroVol;
 }
 
+static bool mc_is_gpio_mlock(void) {
+	int count = 50;
+	int settimes = 0;
+	while(count-- > 0) {
+		bool b1 = mc_get_gpio_brake();
+		if (b1) {
+			settimes ++;
+		}
+		delay_us(1);
+	}
+	if (settimes == 0) {
+		return false;
+	}else if (settimes == 50) {
+		return true;
+	}	
+	//有干扰,do nothing
+	return false;
+}
+
 static bool mc_is_hwbrake(void) {
 	int count = 50;
 	int settimes = 0;
@@ -550,12 +581,12 @@ static bool mc_is_hwbrake(void) {
 #else
 		return true;
 #endif
-	}else {
-		//有干扰,do nothing
-		motor.n_brake_errors++;
-		return false;
 	}
+	//有干扰,do nothing
+	motor.n_brake_errors++;
+	return false;
 }
+
 void MC_Brake_IRQHandler(void) {
 
 	if (mc_is_hwbrake()) {

+ 50 - 5
Applications/foc/samples.c

@@ -30,12 +30,24 @@ static samples_t motor_temp;
 #ifdef MOS_TEMP_ADC_CHAN
 static samples_t mos_temp;
 #endif
+#ifdef MOS_TEMP1_ADC_CHAN
+static samples_t mos_temp1;
+#endif
+#ifdef ACC_V_CHAN
+static samples_t acc_vol;
+#endif
 
 void samples_init(void){
 	_vbus.filted_value = (CONFIG_RATED_DC_VOL);
 	_vbus.value = (CONFIG_RATED_DC_VOL);
-	_vbus.lowpass = (0.01f); 
+	_vbus.lowpass = (0.01f);
+#ifdef ACC_V_CHAN
+	acc_vol.filted_value = (CONFIG_RATED_DC_VOL);
+	acc_vol.value = (CONFIG_RATED_DC_VOL);
+	acc_vol.lowpass = (0.01f);
+#endif
 	sample_vbus();
+
 #ifdef THROTTLE_CHAN
 	_throttle.filted_value = (0);
 	_throttle.value = (0);
@@ -61,6 +73,11 @@ void samples_init(void){
 	mos_temp.lowpass = 0.01;
 	sample_mos_temp();
 #endif
+#ifdef MOS_TEMP1_ADC_CHAN
+	mos_temp1.value = mos_temp1.filted_value = 0;
+	mos_temp1.lowpass = 0.01;
+	sample_mos_temp();
+#endif
 
 	shark_task_create(sample_task, NULL);
 }
@@ -80,6 +97,14 @@ int get_vbus_int(void){
 	return _vbus.filted_int;
 }
 
+int get_acc_vol(void) {
+#ifdef ACC_V_CHAN
+	return acc_vol.filted_int;
+#else
+	return get_vbus_int();
+#endif
+}
+
 s16 get_motor_temp(void) {
 	return motor_temp.filted_value;
 }
@@ -87,6 +112,13 @@ s16 get_motor_temp(void) {
 s16 get_mos_temp(void) {
 	return mos_temp.filted_value;
 }
+s16 get_mos_temp2(void) {
+#ifdef MOS_TEMP1_ADC_CHAN
+	return mos_temp1.filted_value;
+#else
+	return get_mos_temp();
+#endif
+}
 
 float get_throttle_float(void) {
 #ifdef THROTTLE_CHAN
@@ -110,6 +142,12 @@ void sample_vbus(void){
 	_vbus.value = (float)vadc * VBUS_VOL_CEOF;
 	LowPass_Filter(_vbus.filted_value, _vbus.value, _vbus.lowpass);
 	_vbus.filted_int = (int)_vbus.filted_value;
+#ifdef ACC_V_CHAN
+	vadc = adc_get_acc();
+	acc_vol.value = (float)vadc * VBUS_VOL_CEOF;
+	LowPass_Filter(acc_vol.filted_value, acc_vol.value, acc_vol.lowpass);
+	acc_vol.filted_int = (int)acc_vol.filted_value;
+#endif
 }
 
 void sample_throttle(void){
@@ -137,21 +175,28 @@ void sample_uvw_phase(void) {
 }
 
 void sample_motor_temp(void) {
-//#ifdef MOTOR_BLUESHARK_OLD
+#ifdef MC100_HW_V1
 	u16 adc = adc_get_motor_temp();
 	u16 r = MOTOR_TEMP_R(adc);
 	motor_temp.value = ntc_get_motor_temp(r);
 	LowPass_Filter(motor_temp.filted_value, motor_temp.value, motor_temp.lowpass);
-//#endif
+#endif
 }
 
 void sample_mos_temp(void) {
-//#ifdef MOTOR_BLUESHARK_OLD
+#ifdef MC100_HW_V1
 	u16 adc = adc_get_mos_temp();
 	u16 r = MOS_TEMP_R(adc);
 	mos_temp.value = ntc_get_mos_temp(r);
 	LowPass_Filter(mos_temp.filted_value, mos_temp.value, mos_temp.lowpass);
-//#endif
+#ifdef MOS_TEMP1_ADC_CHAN
+	adc = adc_get_mos_temp2();
+	r = MOS_TEMP_R(adc);
+	mos_temp1.value = ntc_get_mos_temp(r);
+	LowPass_Filter(mos_temp1.filted_value, mos_temp1.value, mos_temp1.lowpass);
+
+#endif
+#endif
 }
 
 

+ 2 - 0
Applications/foc/samples.h

@@ -17,5 +17,7 @@ void sample_motor_temp(void);
 void sample_mos_temp(void);
 s16 get_motor_temp(void);
 s16 get_mos_temp(void);
+int get_acc_vol(void);
+s16 get_mos_temp2(void);
 #endif /* _SAMPLES_H__ */