Quellcode durchsuchen

加入母线电流过流检测

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui vor 3 Jahren
Ursprung
Commit
62ae51e888

+ 1 - 0
Applications/bsp/gd32/board_mc105_v3.h

@@ -12,6 +12,7 @@
 #define CONFIG_MIN_DC_VOL   (36.0f)
 
 #define CONFIG_MAX_VBUS_CURRENT 200.0f
+#define CONFIG_MAX_CHRG_CURRENT (-100.0f)
 #define CONFIG_MAX_MOT_RPM      9000.0f
 #define CONFIG_MAX_PHASE_CURR   500.0F
 #define CONFIG_MAX_PHASE_VOL    (CONFIG_MOS_MAX_VOL - 20.0F)

+ 2 - 2
Applications/foc/core/PMSM_FOC_Core.h

@@ -63,8 +63,8 @@ typedef enum {
 	FOC_CRIT_Phase_Conn_Err,
 	FOC_CRIT_MOTOR_TEMP_Err,
 	FOC_CRIT_MOS_TEMP_Err,
-	FOC_CRIT_Fan1_Err,
-	FOC_CRIT_Fan2_Err,
+	FOC_CRIT_Fan_Err,
+	FOC_CRIT_IDC_OV,
 	FOC_CRIT_THRO_Err,
 	FOC_CRIT_Err_Max = 32,	
 }FOC_CritiCal_Ebit_t;

+ 21 - 12
Applications/foc/motor/motor.c

@@ -124,16 +124,9 @@ static u32 _self_check_task(void *p) {
 	if (fan_pwm_is_running()) {
 	#ifdef GPIO_FAN1_IN_GROUP
 		if ((get_delta_ms(motor.fan[0].start_ts) >= 5000) && (motor.fan[0].rpm == 0)) {
-			mc_set_critical_error(FOC_CRIT_Fan1_Err);
+			mc_set_critical_error(FOC_CRIT_Fan_Err);
 		}else if (motor.fan[0].rpm > 0) {
-			mc_clr_critical_error(FOC_CRIT_Fan1_Err);
-		}
-	#endif
-	#ifdef GPIO_FAN2_IN_GROUP
-		if ((get_delta_ms(motor.fan[1].start_ts) >= 5000) && (motor.fan[1].rpm == 0)) {
-			mc_set_critical_error(FOC_CRIT_Fan2_Err);
-		}else if (motor.fan[1].rpm > 0) {
-			mc_clr_critical_error(FOC_CRIT_Fan2_Err);
+			mc_clr_critical_error(FOC_CRIT_Fan_Err);
 		}
 	#endif
 	}
@@ -234,11 +227,13 @@ mc_gear_t *mc_get_gear_config(void) {
 	return mc_get_gear_config_by_gear(motor.n_gear);
 }
 
-
+bool mc_critical_not_running(void) {
+	u32 err = motor.n_CritiCalErrMask & FOC_CRIT_IDC_OV;
+	return (err != 0);
+}
 
 bool mc_unsafe_critical_error(void) {
-	u32 err = motor.n_CritiCalErrMask & (~(FOC_Cri_Err_Mask(FOC_CRIT_Fan1_Err)));
-	err = err & (~(FOC_Cri_Err_Mask(FOC_CRIT_Fan2_Err)));
+	u32 err = motor.n_CritiCalErrMask & (~(FOC_Cri_Err_Mask(FOC_CRIT_Fan_Err)));
 #ifdef CONFIG_DQ_STEP_RESPONSE
 	sys_debug("err=0x%x\n", err);
 	err = err & (~(FOC_Cri_Err_Mask(FOC_CRIT_Encoder_Err)));
@@ -1018,6 +1013,9 @@ void ADC_IRQHandler(void) {
 
 #ifndef CONFIG_DQ_STEP_RESPONSE
 static bool mc_can_stop_foc(void) {
+	if (mc_critical_not_running()) {
+		return true;
+	}
 	if (mc_throttle_released() && PMSM_FOC_GetSpeed() == 0.0f) {
 		if (!PMSM_FOC_AutoHoldding() && motor.epm_dir == EPM_Dir_None) {
 			return true;
@@ -1173,6 +1171,7 @@ measure_time_t g_meas_MCTask;
 #define mc_TaskStart time_measure_start(&g_meas_MCTask)
 #define mc_TaskEnd time_measure_end(&g_meas_MCTask)
 void Sched_MC_mTask(void) {
+	static int vbus_err_cnt = 0;
 	mc_TaskStart;
 
 	adc_vref_filter();
@@ -1189,6 +1188,16 @@ void Sched_MC_mTask(void) {
 	/* 母线电流,实际采集的相电流矢量大小的计算 */
 	PMSM_FOC_Calc_Current();
 
+	if ((PMSM_FOC_GetVbusCurrent() > CONFIG_MAX_VBUS_CURRENT) || (PMSM_FOC_GetVbusCurrent() < CONFIG_MAX_CHRG_CURRENT)) {
+		vbus_err_cnt ++;
+		if (vbus_err_cnt > 10) {
+			mc_error.ibus_x10 = (s16)(PMSM_FOC_GetVbusCurrent() * 10.0f);
+			mc_set_critical_error(FOC_CRIT_IDC_OV);
+		}
+	}else {
+		vbus_err_cnt = 0;
+	}
+
 	if (mc_process_force_running()) {
 		mc_TaskEnd;
 		return;