|
@@ -22,8 +22,8 @@
|
|
|
#include "foc/limit.h"
|
|
#include "foc/limit.h"
|
|
|
|
|
|
|
|
static bool mc_is_hwbrake(void);
|
|
static bool mc_is_hwbrake(void);
|
|
|
-static void _pwm_brake_timer_handler(shark_timer_t *);
|
|
|
|
|
-static shark_timer_t _brake_timer = TIMER_INIT(_brake_timer, _pwm_brake_timer_handler);
|
|
|
|
|
|
|
+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 motor_t motor = {
|
|
static motor_t motor = {
|
|
@@ -60,6 +60,17 @@ static u32 _self_check_task(void *p) {
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static void _mc_internal_init(u8 mode, bool start) {
|
|
|
|
|
+ motor.mode = mode;
|
|
|
|
|
+ motor.throttle = 0;
|
|
|
|
|
+ motor.b_start = start;
|
|
|
|
|
+ motor.b_runStall = false;
|
|
|
|
|
+ motor.runStall_time = 0;
|
|
|
|
|
+ motor.b_epm = false;
|
|
|
|
|
+ motor.b_epm_cmd_move = false;
|
|
|
|
|
+ motor.epm_dir = EPM_Dir_None;
|
|
|
|
|
+ motor.n_autohold_time = 0;
|
|
|
|
|
+}
|
|
|
void mc_init(void) {
|
|
void mc_init(void) {
|
|
|
adc_init();
|
|
adc_init();
|
|
|
pwm_3phase_init();
|
|
pwm_3phase_init();
|
|
@@ -115,7 +126,9 @@ bool mc_start(u8 mode) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
pwm_up_enable(false);
|
|
pwm_up_enable(false);
|
|
|
- motor.mode = mode;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ _mc_internal_init(mode, true);
|
|
|
|
|
+
|
|
|
eCtrl_init(CONFIG_ACC_TIME, CONFIG_DEC_TIME);
|
|
eCtrl_init(CONFIG_ACC_TIME, CONFIG_DEC_TIME);
|
|
|
motor_encoder_start(motor.s_direction);
|
|
motor_encoder_start(motor.s_direction);
|
|
|
PMSM_FOC_Start(mode);
|
|
PMSM_FOC_Start(mode);
|
|
@@ -126,14 +139,6 @@ bool mc_start(u8 mode) {
|
|
|
adc_start_convert();
|
|
adc_start_convert();
|
|
|
phase_current_calibrate_wait();
|
|
phase_current_calibrate_wait();
|
|
|
|
|
|
|
|
- motor.throttle = 0;
|
|
|
|
|
- motor.b_start = true;
|
|
|
|
|
- motor.b_runStall = false;
|
|
|
|
|
- motor.runStall_time = 0;
|
|
|
|
|
- motor.b_epm = false;
|
|
|
|
|
- motor.b_epm_cmd_move = false;
|
|
|
|
|
- motor.epm_dir = EPM_Dir_None;
|
|
|
|
|
- motor.n_autohold_time = 0;
|
|
|
|
|
if (phase_curr_offset_check()) {
|
|
if (phase_curr_offset_check()) {
|
|
|
PMSM_FOC_SetCriticalError(FOC_CRIT_CURR_OFF_Err);
|
|
PMSM_FOC_SetCriticalError(FOC_CRIT_CURR_OFF_Err);
|
|
|
mc_stop();
|
|
mc_stop();
|
|
@@ -167,15 +172,12 @@ bool mc_stop(void) {
|
|
|
sys_debug("throttle error\n");
|
|
sys_debug("throttle error\n");
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
- motor.mode = CTRL_MODE_OPEN;
|
|
|
|
|
|
|
+ _mc_internal_init(CTRL_MODE_OPEN, false);
|
|
|
adc_stop_convert();
|
|
adc_stop_convert();
|
|
|
pwm_stop();
|
|
pwm_stop();
|
|
|
PMSM_FOC_Stop();
|
|
PMSM_FOC_Stop();
|
|
|
pwm_up_enable(true);
|
|
pwm_up_enable(true);
|
|
|
- motor.b_start = false;
|
|
|
|
|
- motor.b_epm = false;
|
|
|
|
|
- motor.epm_dir = EPM_Dir_None;
|
|
|
|
|
- gpio_led2_enable(false);
|
|
|
|
|
|
|
+
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -502,13 +504,13 @@ void MC_Brake_IRQHandler(void) {
|
|
|
sys_debug("brake %d\n", motor.b_break);
|
|
sys_debug("brake %d\n", motor.b_break);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-static void _pwm_brake_timer_handler(shark_timer_t *t){
|
|
|
|
|
|
|
+static void _pwm_brake_prot_timer_handler(shark_timer_t *t){
|
|
|
pwm_brake_enable(true);
|
|
pwm_brake_enable(true);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void MC_Protect_IRQHandler(void){
|
|
void MC_Protect_IRQHandler(void){
|
|
|
pwm_brake_enable(false);
|
|
pwm_brake_enable(false);
|
|
|
- shark_timer_post(&_brake_timer, 1000);
|
|
|
|
|
|
|
+ shark_timer_post(&_brake_prot_timer, 1000);
|
|
|
if (!motor.b_start) {
|
|
if (!motor.b_start) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|