|
@@ -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) {
|