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

过流过压保护,刹车处理

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 лет назад
Родитель
Сommit
ac710fb089

+ 0 - 2
Applications/bsp/board_gd32demo.h

@@ -101,8 +101,6 @@
 /* 是否用编码器 */
 #define USE_ENCODER_ABI
 
-#define USER_ITMER_BRAKE 0
-
 /* 编码器 */
 #define ENC_A_GROUP GPIOA
 #define ENC_A_PIN GPIO_PIN_6

+ 18 - 7
Applications/bsp/board_mc_v1.h

@@ -6,9 +6,9 @@
 #include "gd32e10x.h"
 #endif
 
-#define HW_DEAD_TIME_NS  1200u
+#define HW_DEAD_TIME_NS  200u
 #define HW_RISE_TIME_NS  500u
-#define HW_NOISE_TIME_NS 500u
+#define HW_NOISE_TIME_NS 300u
 
 #define TDead NS_2_TCLK(HW_DEAD_TIME_NS)/* ����ʱ�� */ 
 #define TRise NS_2_TCLK(HW_RISE_TIME_NS)/* MOS ����ʱ��*/
@@ -19,6 +19,7 @@
 
 #define ADC_REFERENCE_VOLTAGE  (3.3F)
 
+/* MOS驱动 */
 #define pwm_timer TIMER0
 #define PWM_U_P_GROUP 	GPIOA
 #define PWM_U_P_PIN 	GPIO_PIN_8
@@ -50,6 +51,11 @@
 #define PWM_W_N_RCU 	RCU_GPIOB
 #define PWM_W_N_MODE 	GPIO_MODE_AF_PP
 
+#define PWM_BRAKE_GROUP 	GPIOB
+#define PWM_BRAKE_PIN 	GPIO_PIN_12
+#define PWM_BRAKE_RCU 	RCU_GPIOB
+#define PWM_BRAKE_MODE 	GPIO_MODE_AF_PP
+
 
 /* 高边电流传感器采样 */
 #define HIGH_SIDE_CURRENT_SENSOR
@@ -72,21 +78,26 @@
 #define MOTOR_TEMP_CHAN ADC_CHANNEL_0
 #define THROTTLE_CHAN ADC_CHANNEL_1 //转把信号
 #define VBUS_V_CHAN 	ADC_CHANNEL_2
-#define W_PHASE_V_CHAN  ADC_CHANNEL_3
-#define V_PHASE_V_CHAN  ADC_CHANNEL_4
-#define U_PHASE_V_CHAN  ADC_CHANNEL_5
 #define VBUS_I_CHAN     ADC_CHANNEL_9
 
 #define ADC_TO_CURR_ceof (0.0942f)
 #define VBUS_VOL_CEOF (ADC_REFERENCE_VOLTAGE*45/4096.0f)
 #define THROTTLE_VOL_CEOF (1)
 
+/* 刹车手把输入 */
+#define GPIO_BRAKE_IN_GROUP 	GPIOA
+#define GPIO_BRAKE_IN_PIN 	GPIO_PIN_2
+#define GPIO_BRAKE_IN_RCU 	RCU_GPIOA
+#define GPIO_BRAKE_IN_MODE 	GPIO_MODE_IN_FLOATING
+#define GPIO_BRAKE_IRQ  EXTI2_IRQn
+#define GPIO_BRAKE_EXTI EXTI_2
+#define GPIO_BRAKE_EXIT_SRC_GROUP GPIO_PORT_SOURCE_GPIOA
+#define GPIO_BRAKE_EXIT_SRC_PIN GPIO_PIN_SOURCE_2
+
 
 /* 是否用编码器 */
 #define USE_ENCODER_ABI
 
-#define USER_ITMER_BRAKE 0
-
 /* 编码器 */
 #define ENC_A_GROUP GPIOA
 #define ENC_A_PIN GPIO_PIN_6

+ 7 - 4
Applications/bsp/mc_irqs.c

@@ -76,6 +76,9 @@ void DebugMon_Handler(void)
 
 __weak void MC_Brake_IRQHandler(void) {
 
+}
+__weak void MC_Protect_IRQHandler(void) {
+
 }
 __weak void TIMER_UP_IRQHandler(void) {
 
@@ -95,11 +98,8 @@ __weak void ABI_I_IRQHandler(void) {
 
 void ADC0_1_IRQHandler(void)
 {
-	//adc_disable_ext_trigger();
 	ADC_IRQHandler();
-    /* clear the ADC flag */
 	adc_clear_irq_flags();
-	//adc_enable_ext_trigger();
 }
 
 void TIMER0_UP_IRQHandler(void) {
@@ -112,7 +112,7 @@ void TIMER0_UP_IRQHandler(void) {
 void TIMER0_BRK_IRQHandler(void) {
 	if (timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_BRK)) {
 		timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_BRK);
-		MC_Brake_IRQHandler();
+		MC_Protect_IRQHandler();
 	}
 }
 
@@ -137,6 +137,9 @@ void EXTI2_IRQHandler(void)
 {
 	if(RESET != exti_interrupt_flag_get(EXTI_2)){
 		exti_interrupt_flag_clear(EXTI_2);
+#if (GPIO_BRAKE_EXTI == EXTI_2)
+		MC_Brake_IRQHandler();
+#endif
 	}	
 }
 

+ 7 - 13
Applications/bsp/pwm.c

@@ -19,7 +19,7 @@ DMA0 ch4 -> timer0 update event
 
 static void _init_pwm_timer(void);
 static void _pwm_gpio_config(void);
-#if USER_ITMER_BRAKE==0
+#ifndef PWM_BRAKE_GROUP
 static void _gpio_brakein_irq_enable(void);
 #endif
 u16 timer_update_buffer[6] = {0};
@@ -63,16 +63,10 @@ static void _pwm_gpio_config(void)
     gpio_init(PWM_W_N_GROUP,PWM_W_N_MODE,GPIO_OSPEED_50MHZ,PWM_W_N_PIN);
 
 	/*configure BRAKE IN*/
-#if USER_ITMER_BRAKE==1
-#ifdef GD32_FOC_DEMO
+#ifdef PWM_BRAKE_GROUP
     /* TIMER0 BKIN */
-    gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
-#else
-	gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_6);
-#endif
-#else
-	gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_4);//高刹车
-	gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_5);//低刹车
+	rcu_periph_clock_enable(PWM_BRAKE_RCU);
+    gpio_init(PWM_BRAKE_GROUP, PWM_BRAKE_MODE, GPIO_OSPEED_50MHZ, PWM_BRAKE_PIN);
 #endif
 }
 
@@ -136,13 +130,13 @@ static void _init_pwm_timer(void) {
     timer_channel_output_mode_config(timer,TIMER_CH_3,TIMER_OC_MODE_PWM1);
     timer_channel_output_shadow_config(timer,TIMER_CH_3,TIMER_OC_SHADOW_ENABLE);
 
-#if USER_ITMER_BRAKE==1
+#ifdef PWM_BRAKE_GROUP
 	timer_break_parameter_struct timer_breakpara;
     timer_breakpara.runoffstate        = TIMER_ROS_STATE_DISABLE;
     timer_breakpara.ideloffstate       = TIMER_ROS_STATE_DISABLE;
     timer_breakpara.protectmode        = TIMER_CCHP_PROT_OFF; 
     timer_breakpara.deadtime           = 0;//NS_2_TCLK(TIMER_DT_NS);
-    timer_breakpara.breakstate         = TIMER_BREAK_DISABLE;
+    timer_breakpara.breakstate         = TIMER_BREAK_ENABLE;
     timer_breakpara.breakpolarity      = TIMER_BREAK_POLARITY_HIGH;
     timer_breakpara.outputautostate    = TIMER_OUTAUTO_DISABLE;
     timer_break_config(timer,&timer_breakpara);
@@ -173,7 +167,7 @@ static void _init_pwm_timer(void) {
 
 
 
-#if USER_ITMER_BRAKE==0
+#ifndef PWM_BRAKE_GROUP
 static void _gpio_brakein_irq_enable(void){
 #ifndef GD32_FOC_DEMO
 	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_4);

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

@@ -21,6 +21,19 @@ static motor_t motor = {
 	.s_direction = POSITIVE,
 };
 
+static void mc_gpio_init(void) {
+#ifdef GPIO_BRAKE_IN_GROUP
+	rcu_periph_clock_enable(GPIO_BRAKE_IN_RCU);
+	gpio_init(GPIO_BRAKE_IN_GROUP, GPIO_BRAKE_IN_MODE, GPIO_OSPEED_50MHZ, GPIO_BRAKE_IN_PIN);
+	
+	gpio_exti_source_select(GPIO_BRAKE_EXIT_SRC_GROUP, GPIO_BRAKE_EXIT_SRC_PIN);
+	exti_init(GPIO_BRAKE_EXTI, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
+	nvic_irq_enable(GPIO_BRAKE_IRQ, EBREAK_IRQ_PRIORITY, 0U);
+	exti_interrupt_flag_clear(GPIO_BRAKE_EXTI);
+	exti_interrupt_enable(GPIO_BRAKE_EXTI);	
+#endif
+}
+
 void mc_init(void) {
 	adc_init();
 	pwm_3phase_init();
@@ -28,6 +41,7 @@ void mc_init(void) {
 	motor_encoder_init();
 	foc_command_init();
 	PMSM_FOC_CoreInit();
+	mc_gpio_init();
 	sched_timer_enable(SPD_CTRL_MS);
 }
 
@@ -156,31 +170,34 @@ bool mc_throttle_released(void) {
 }
 
 
-/*do 50 times filter*/
-static void brake_timer_handler(shark_timer_t *t) {
+void MC_Brake_IRQHandler(void) {
 	int count = 50;
 	int settimes = 0;
 	while(count-- >= 0) {
-		bool b1 = gpio_input_bit_get(GPIOB, GPIO_PIN_4) == SET;
-		bool b2 = gpio_input_bit_get(GPIOB, GPIO_PIN_5) == SET;
-		if (b1 && b2) {
-			settimes++;
-		}		
+		bool b1 = gpio_input_bit_get(GPIO_BRAKE_IN_GROUP, GPIO_BRAKE_IN_PIN) == SET;
+		if (b1) {
+			settimes ++;
+		}
+		delay_us(1);
 	}
 	if (settimes == 0) {
-		PMSM_FOC_Brake(true);
-	}else if (settimes == 50) {
 		PMSM_FOC_Brake(false);
+	}else if (settimes == 50) {
+		PMSM_FOC_Brake(true);
 	}else {
 		//有干扰,do nothing
+		motor.n_brake_errors++;
 	}
 }
 
-static shark_timer_t _brake_timer = TIMER_INIT(_brake_timer, brake_timer_handler);
 
-void MC_Brake_IRQHandler(void){
-	shark_timer_post(&_brake_timer, 0);
+void MC_Protect_IRQHandler(void){
+	PMSM_FOC_Stop(); //三相50%占空比输出,防止mos过压击穿
+	pwm_start();
+	adc_start_convert();
+	PMSM_FOC_SetErrCode(FOC_Phase_Curr_OV_Err);
 }
+
 measure_time_t g_meas_timeup = {.intval_max_time = 62, .intval_low_err = 0, .intval_hi_err = 0, .first = true,};
 void TIMER_UP_IRQHandler(void){
 	//phase_current_adc_triger();

+ 1 - 0
Applications/foc/motor/motor.h

@@ -12,6 +12,7 @@ typedef struct {
 	s16    s_testAngle;
 	s32    s_targetFix;
 	s8     s_direction;
+	u32    n_brake_errors;
 }motor_t;
 
 void mc_init(void);

+ 1 - 1
Project/GD32_DEMO.uvoptx

@@ -120,7 +120,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name>(a?g</Name>
+          <Name>?</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>