Ver Fonte

加入刹车断电功能,可以配置

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui há 3 anos atrás
pai
commit
9c78d6740d

+ 1 - 1
Applications/app/nv_storage.c

@@ -49,7 +49,7 @@ static void nv_default_foc_params(void) {
 	foc_params.n_currentBand = 500;
 	foc_params.n_currentBand = 500;
 	foc_params.n_modulation = 1.0f;
 	foc_params.n_modulation = 1.0f;
 	foc_params.n_PhaseFilterCeof = 0.2f;
 	foc_params.n_PhaseFilterCeof = 0.2f;
-	//foc_params.n_TrqVelLimGain = 1.0f;
+	foc_params.n_brkShutPower = 1;
 	foc_params.s_LimitiDC = 20.0f;
 	foc_params.s_LimitiDC = 20.0f;
 
 
 	foc_params.pid_conf[PID_D_id].kp = (CONFIG_CURRENT_BANDWITH * MOTOR_Ld);
 	foc_params.pid_conf[PID_D_id].kp = (CONFIG_CURRENT_BANDWITH * MOTOR_Ld);

+ 8 - 8
Applications/bsp/board_mc_v1.h

@@ -139,15 +139,15 @@
 #define UVW_VOL_CEOF (ADC_REFERENCE_VOLTAGE*(41.0f)/ADC_FULL_MAX)
 #define UVW_VOL_CEOF (ADC_REFERENCE_VOLTAGE*(41.0f)/ADC_FULL_MAX)
 
 
 /* 刹车手把输入 */
 /* 刹车手把输入 */
-//#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_GROUP 	GPIOB
+#define GPIO_BRAKE_IN_PIN 	GPIO_PIN_3
+#define GPIO_BRAKE_IN_RCU 	RCU_GPIOB
 #define GPIO_BRAKE_IN_MODE 	GPIO_MODE_IN_FLOATING
 #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 GPIO_BRAKE_IRQ  EXTI3_IRQn
+#define GPIO_BRAKE_EXTI EXTI_3
+#define GPIO_BRAKE_EXIT_SRC_GROUP GPIO_PORT_SOURCE_GPIOB
+#define GPIO_BRAKE_EXIT_SRC_PIN GPIO_PIN_SOURCE_3
+#define GPIO_BREAK_MODE GPIO_LOW_BRK_MODE      
 
 
 /* 是否用编码器 */
 /* 是否用编码器 */
 #define USE_ENCODER_ABI
 #define USE_ENCODER_ABI

+ 4 - 0
Applications/bsp/bsp.h

@@ -45,6 +45,10 @@
 #define THREE_SHUNTS_SAMPLE 1
 #define THREE_SHUNTS_SAMPLE 1
 #define ONE_SHUNT_SAMPLE 2
 #define ONE_SHUNT_SAMPLE 2
 
 
+#define GPIO_HIGH_BRK_MODE 1
+#define GPIO_LOW_BRK_MODE 2
+
+
 #ifdef GD32_FOC_DEMO
 #ifdef GD32_FOC_DEMO
 #include "bsp/board_gd32demo.h"
 #include "bsp/board_gd32demo.h"
 #else
 #else

+ 4 - 1
Applications/bsp/mc_irqs.c

@@ -145,7 +145,10 @@ void EXTI3_IRQHandler(void)
 {
 {
 	if(RESET != exti_interrupt_flag_get(EXTI_3)){
 	if(RESET != exti_interrupt_flag_get(EXTI_3)){
 		exti_interrupt_flag_clear(EXTI_3);
 		exti_interrupt_flag_clear(EXTI_3);
-	}	
+#if (GPIO_BRAKE_EXTI == EXTI_3)
+		MC_Brake_IRQHandler();
+#endif
+	}
 }
 }
 
 
 void EXTI4_IRQHandler(void)
 void EXTI4_IRQHandler(void)

+ 15 - 12
Applications/foc/core/e_ctrl.c

@@ -54,13 +54,17 @@ void eCtrl_enable_eBrake(bool enable) {
 	}
 	}
 }
 }
 
 
-void _eCtrl_process_eBrake(void) {
+void _eCtrl_clear_ramp(void) {
 	eRamp_init(&g_eCtrl.current);
 	eRamp_init(&g_eCtrl.current);
 	eRamp_init(&g_eCtrl.speed);
 	eRamp_init(&g_eCtrl.speed);
 	eRamp_init(&g_eCtrl.torque);
 	eRamp_init(&g_eCtrl.torque);
 	g_eCtrl.current_shadow = 0.0f;
 	g_eCtrl.current_shadow = 0.0f;
 	g_eCtrl.torque_shadow = 0.0f;
 	g_eCtrl.torque_shadow = 0.0f;
 	g_eCtrl.speed_shadow = 0.0f;
 	g_eCtrl.speed_shadow = 0.0f;
+}
+
+void _eCtrl_process_eBrake(void) {
+	_eCtrl_clear_ramp();
 	if (g_eCtrl.is_ebrake) {
 	if (g_eCtrl.is_ebrake) {
 		PMSM_FOC_SetCtrlMode(CTRL_MODE_CURRENT_BRK);
 		PMSM_FOC_SetCtrlMode(CTRL_MODE_CURRENT_BRK);
 		eCtrl_set_TgtCurrent(-PMSM_FOC_GeteBrkPhaseCurrent());
 		eCtrl_set_TgtCurrent(-PMSM_FOC_GeteBrkPhaseCurrent());
@@ -129,6 +133,9 @@ static void _eCtrl_set_TgtSpeed(float s) {
 }
 }
 
 
 static void _eCtrl_set_TgtTorque(float t) {
 static void _eCtrl_set_TgtTorque(float t) {
+	if (g_eCtrl.hw_brake && nv_get_foc_params()->n_brkShutPower){
+		return;
+	}
 	_eCtrl_set_target(&g_eCtrl.torque, t);
 	_eCtrl_set_target(&g_eCtrl.torque, t);
 }
 }
 
 
@@ -157,24 +164,20 @@ float eCtrl_get_FinalTorque(void) {
 }
 }
 
 
 void eCtrl_brake_signal(bool hw_brake) {
 void eCtrl_brake_signal(bool hw_brake) {
+	u32 mask = cpu_enter_critical();
 	if (hw_brake != g_eCtrl.hw_brake) {
 	if (hw_brake != g_eCtrl.hw_brake) {
 		g_eCtrl.hw_brake = hw_brake;
 		g_eCtrl.hw_brake = hw_brake;
 		if (hw_brake) {
 		if (hw_brake) {
 			g_eCtrl.brake_ts = shark_get_mseconds();
 			g_eCtrl.brake_ts = shark_get_mseconds();
 		}
 		}
 	}
 	}
-	
-	if (g_eCtrl.hw_brake) {
-		float ebrk_torque = 0.0f;
-		float ebrk_speed = 0.0f;
-		if (shark_get_mseconds() - g_eCtrl.brake_ts >= eCTRL_Brake_TIME) {
-			if (g_eCtrl.accl_time != DEFAULT_D_TIME) {
-				ebrk_torque = eCTRL_NEG_TORQUE;
-			}
-		}
-		eCtrl_set_TgtTorque(ebrk_torque);
-		eCtrl_set_TgtSpeed(ebrk_speed);
+	if (g_eCtrl.hw_brake && nv_get_foc_params()->n_brkShutPower) {
+		eRamp_init(&g_eCtrl.speed);
+		eRamp_init(&g_eCtrl.torque);
+		g_eCtrl.torque_shadow = 0.0f;
+		g_eCtrl.speed_shadow = 0.0f;
 	}
 	}
+	cpu_exit_critical(mask);
 }
 }
 
 
 
 

+ 2 - 2
Applications/foc/motor/hall.c

@@ -455,7 +455,7 @@ void HALL_IRQHandler(void) {
 		_sensor_hander.trns_detect = false;
 		_sensor_hander.trns_detect = false;
 	}
 	}
 	_hall_put_sample(delta_us, delta_angle);
 	_hall_put_sample(delta_us, delta_angle);
-	os_disable_irq();
+	u32 mask = cpu_enter_critical();
 	if (_sensor_hander.samples.full) {
 	if (_sensor_hander.samples.full) {
 		//float estimate_delta_angle =  _sensor_hander.next_delta_angle - _sensor_hander.estimate_delta_angle;
 		//float estimate_delta_angle =  _sensor_hander.next_delta_angle - _sensor_hander.estimate_delta_angle;
 		//plot_2data16(estimate_delta_angle>>19, (estimate_delta_angle/((s32)(delta_us/FOC_CTRL_US)))>>10);//, _sensor_hander.estimate_delta_angle>>19);
 		//plot_2data16(estimate_delta_angle>>19, (estimate_delta_angle/((s32)(delta_us/FOC_CTRL_US)))>>10);//, _sensor_hander.estimate_delta_angle>>19);
@@ -474,7 +474,7 @@ void HALL_IRQHandler(void) {
 	_sensor_hander.next_delta_angle = next_delta_angle;
 	_sensor_hander.next_delta_angle = next_delta_angle;
 	_sensor_hander.measured_el_angle = theta_now;
 	_sensor_hander.measured_el_angle = theta_now;
 
 
-	os_enable_irq();
+	cpu_exit_critical(mask);
 	_sensor_hander.hall_stat = hall_stat_now;
 	_sensor_hander.hall_stat = hall_stat_now;
 	_sensor_hander.hall_ticks = hall_ticks_now;
 	_sensor_hander.hall_ticks = hall_ticks_now;
 	_sensor_hander.el_speed = _hall_angle_speed();	//s32q5
 	_sensor_hander.el_speed = _hall_angle_speed();	//s32q5

+ 32 - 10
Applications/foc/motor/motor.c

@@ -28,7 +28,7 @@ static void mc_gpio_init(void) {
 	gpio_init(GPIO_BRAKE_IN_GROUP, GPIO_BRAKE_IN_MODE, GPIO_OSPEED_50MHZ, GPIO_BRAKE_IN_PIN);
 	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);
 	gpio_exti_source_select(GPIO_BRAKE_EXIT_SRC_GROUP, GPIO_BRAKE_EXIT_SRC_PIN);
-	exti_init(GPIO_BRAKE_EXTI, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
+	exti_init(GPIO_BRAKE_EXTI, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
 	nvic_irq_enable(GPIO_BRAKE_IRQ, EBREAK_IRQ_PRIORITY, 0U);
 	nvic_irq_enable(GPIO_BRAKE_IRQ, EBREAK_IRQ_PRIORITY, 0U);
 	exti_interrupt_flag_clear(GPIO_BRAKE_EXTI);
 	exti_interrupt_flag_clear(GPIO_BRAKE_EXTI);
 	exti_interrupt_enable(GPIO_BRAKE_EXTI);	
 	exti_interrupt_enable(GPIO_BRAKE_EXTI);	
@@ -237,12 +237,11 @@ bool mc_throttle_released(void) {
 	return get_throttle_float() < THROTTLE_LOW_VALUE;
 	return get_throttle_float() < THROTTLE_LOW_VALUE;
 }
 }
 
 
-
-void MC_Brake_IRQHandler(void) {
+static bool mc_is_brake(void) {
 #ifdef GPIO_BRAKE_IN_GROUP
 #ifdef GPIO_BRAKE_IN_GROUP
 	int count = 50;
 	int count = 50;
 	int settimes = 0;
 	int settimes = 0;
-	while(count-- >= 0) {
+	while(count-- > 0) {
 		bool b1 = gpio_input_bit_get(GPIO_BRAKE_IN_GROUP, GPIO_BRAKE_IN_PIN) == SET;
 		bool b1 = gpio_input_bit_get(GPIO_BRAKE_IN_GROUP, GPIO_BRAKE_IN_PIN) == SET;
 		if (b1) {
 		if (b1) {
 			settimes ++;
 			settimes ++;
@@ -250,15 +249,37 @@ void MC_Brake_IRQHandler(void) {
 		delay_us(1);
 		delay_us(1);
 	}
 	}
 	if (settimes == 0) {
 	if (settimes == 0) {
-		PMSM_FOC_Brake(false);
+#if GPIO_BREAK_MODE==GPIO_LOW_BRK_MODE
+		return true;
+#else
+		return false;
+#endif
 	}else if (settimes == 50) {
 	}else if (settimes == 50) {
-		PMSM_FOC_Brake(true);
+#if GPIO_BREAK_MODE==GPIO_LOW_BRK_MODE
+		return false;
+#else
+		return true;
+#endif
 	}else {
 	}else {
 		//有干扰,do nothing
 		//有干扰,do nothing
 		motor.n_brake_errors++;
 		motor.n_brake_errors++;
+		return false;
 	}
 	}
+#else
+	return false;
 #endif
 #endif
 }
 }
+void MC_Brake_IRQHandler(void) {
+
+	if (!motor.b_start) {
+		return;
+	}
+	if (mc_is_brake()) {
+		PMSM_FOC_Brake(true);
+	}else {
+		PMSM_FOC_Brake(false);
+	}
+}
 
 
 
 
 void MC_Protect_IRQHandler(void){
 void MC_Protect_IRQHandler(void){
@@ -316,16 +337,17 @@ void Sched_MC_mTask(void) {
 #endif
 #endif
 	if ((runMode != CTRL_MODE_OPEN) || (motor.mode != CTRL_MODE_OPEN)) {
 	if ((runMode != CTRL_MODE_OPEN) || (motor.mode != CTRL_MODE_OPEN)) {
 		if (motor.mode != CTRL_MODE_OPEN) {
 		if (motor.mode != CTRL_MODE_OPEN) {
+			u32 mask;
 			if (mc_throttle_released() && PMSM_FOC_GetSpeed() == 0.0f) {
 			if (mc_throttle_released() && PMSM_FOC_GetSpeed() == 0.0f) {
-				os_disable_irq();
+				mask = cpu_enter_critical();
 				PMSM_FOC_Stop();
 				PMSM_FOC_Stop();
 				pwm_disable_channel();
 				pwm_disable_channel();
-				os_enable_irq();
+				cpu_exit_critical(mask);
 			}else {
 			}else {
-				os_disable_irq();
+				mask = cpu_enter_critical();
 				PMSM_FOC_Start(motor.mode);
 				PMSM_FOC_Start(motor.mode);
 				pwm_enable_channel();
 				pwm_enable_channel();
-				os_enable_irq();
+				cpu_exit_critical(mask);
 			}
 			}
 		}
 		}
 		if (runMode != CTRL_MODE_OPEN) {
 		if (runMode != CTRL_MODE_OPEN) {

+ 0 - 8
Applications/os/os_task.c

@@ -27,14 +27,6 @@ void SysTick_Handler(void)
 	_g_ticks ++;
 	_g_ticks ++;
 }
 }
 
 
-void os_disable_irq(void) {
-	__disable_irq();
-}
-
-void os_enable_irq(void) {
-	__enable_irq();
-}
-
 
 
 u64 shark_get_mseconds(void)
 u64 shark_get_mseconds(void)
 {
 {

+ 11 - 3
Applications/os/os_task.h

@@ -1,5 +1,5 @@
 #pragma once
 #pragma once
-
+#include "bsp/bsp.h"
 #include "os/os_types.h"
 #include "os/os_types.h"
 #include "bsp/delay.h"
 #include "bsp/delay.h"
 #define MAX_TASK 32
 #define MAX_TASK 32
@@ -31,8 +31,16 @@ static inline bool shark_timer_stopped(shark_timer_t *timer)
 	return timer->next == timer;
 	return timer->next == timer;
 }
 }
 
 
-void os_enable_irq(void);
-void os_disable_irq(void);
+static inline uint32_t cpu_enter_critical() {
+    uint32_t primask = __get_PRIMASK();
+    __disable_irq();
+    return primask;
+}
+
+static inline void cpu_exit_critical(uint32_t priority_mask) {
+    __set_PRIMASK(priority_mask);
+}
+
 u32 get_tick_ms(void);
 u32 get_tick_ms(void);
 u32 get_delta_ms(uint32_t prev_ms);
 u32 get_delta_ms(uint32_t prev_ms);
 u64 shark_get_mseconds(void);
 u64 shark_get_mseconds(void);

+ 4 - 1
Project/MC100.uvoptx

@@ -120,7 +120,6 @@
         <SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Number>0</Number>
           <Key>DLGUARM</Key>
           <Key>DLGUARM</Key>
-          <Name>窧H
:</Name>
         </SetRegEntry>
         </SetRegEntry>
         <SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Number>0</Number>
@@ -253,6 +252,10 @@
           <Name>System Viewer\ADC0</Name>
           <Name>System Viewer\ADC0</Name>
           <WinId>35901</WinId>
           <WinId>35901</WinId>
         </Entry>
         </Entry>
+        <Entry>
+          <Name>System Viewer\GPIOB</Name>
+          <WinId>35899</WinId>
+        </Entry>
         <Entry>
         <Entry>
           <Name>System Viewer\RCU</Name>
           <Name>System Viewer\RCU</Name>
           <WinId>35900</WinId>
           <WinId>35900</WinId>