|
@@ -32,7 +32,8 @@ static shark_timer_t _autohold_beep_timer = TIMER_INIT(_autohold_beep_timer, _au
|
|
|
static void _fan_det_timer_handler(shark_timer_t *);
|
|
static void _fan_det_timer_handler(shark_timer_t *);
|
|
|
static shark_timer_t _fan_det_timer1 = TIMER_INIT(_fan_det_timer1, _fan_det_timer_handler);
|
|
static shark_timer_t _fan_det_timer1 = TIMER_INIT(_fan_det_timer1, _fan_det_timer_handler);
|
|
|
static shark_timer_t _fan_det_timer2 = TIMER_INIT(_fan_det_timer2, _fan_det_timer_handler);
|
|
static shark_timer_t _fan_det_timer2 = TIMER_INIT(_fan_det_timer2, _fan_det_timer_handler);
|
|
|
-
|
|
|
|
|
|
|
+static void _encoder_zero_off_timer_handler(shark_timer_t *);
|
|
|
|
|
+static shark_timer_t _encoder_zero_off_timer = TIMER_INIT(_encoder_zero_off_timer, _encoder_zero_off_timer_handler);
|
|
|
|
|
|
|
|
static motor_t motor = {
|
|
static motor_t motor = {
|
|
|
.s_direction = POSITIVE,
|
|
.s_direction = POSITIVE,
|
|
@@ -133,6 +134,7 @@ static void _mc_internal_init(u8 mode, bool start) {
|
|
|
motor.b_auto_hold = 0;
|
|
motor.b_auto_hold = 0;
|
|
|
motor.b_break = false;
|
|
motor.b_break = false;
|
|
|
motor.b_wait_brk_release = false;
|
|
motor.b_wait_brk_release = false;
|
|
|
|
|
+ motor.b_force_run = false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void mc_gear_vmode_changed(void) {
|
|
static void mc_gear_vmode_changed(void) {
|
|
@@ -440,9 +442,47 @@ void mc_get_running_status(u8 *data) {
|
|
|
data[0] |= (motor.b_lock_motor) << 7; //motor locked
|
|
data[0] |= (motor.b_lock_motor) << 7; //motor locked
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+static float _force_angle = 0.0f;
|
|
|
|
|
+static int _force_wait = 2000;
|
|
|
|
|
+/* 开环,强制给定电角度和DQ的电压 */
|
|
|
|
|
+void mc_force_run_open(s16 vd, s16 vq) {
|
|
|
|
|
+ if (motor.b_start || motor.b_force_run) {
|
|
|
|
|
+ if (vd == 0 && vq == 0) {
|
|
|
|
|
+ PMSM_FOC_SetOpenVdq(0, 0);
|
|
|
|
|
+ delay_ms(500);
|
|
|
|
|
+ wdog_reload();
|
|
|
|
|
+ adc_stop_convert();
|
|
|
|
|
+ pwm_stop();
|
|
|
|
|
+ PMSM_FOC_Stop();
|
|
|
|
|
+ pwm_up_enable(true);
|
|
|
|
|
+ motor.b_force_run = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (vd == 0 && vq == 0) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ MC_Check_MosVbusThrottle();
|
|
|
|
|
+ if (mc_unsafe_critical_error()) {
|
|
|
|
|
+ PMSM_FOC_SetErrCode(FOC_Have_CritiCal_Err);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ pwm_up_enable(false);
|
|
|
|
|
+ pwm_turn_on_low_side();
|
|
|
|
|
+ task_udelay(500);
|
|
|
|
|
+ PMSM_FOC_Start(CTRL_MODE_OPEN);
|
|
|
|
|
+ phase_current_offset_calibrate();
|
|
|
|
|
+ pwm_start();
|
|
|
|
|
+ adc_start_convert();
|
|
|
|
|
+ phase_current_calibrate_wait();
|
|
|
|
|
+ PMSM_FOC_Set_Angle(0);
|
|
|
|
|
+ PMSM_FOC_SetOpenVdq(vd, 0);
|
|
|
|
|
+ _force_wait = 2000;
|
|
|
|
|
+ motor.b_force_run = true;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
void mc_encoder_off_calibrate(s16 vd) {
|
|
void mc_encoder_off_calibrate(s16 vd) {
|
|
|
- if (motor.b_start) {
|
|
|
|
|
|
|
+ if (motor.b_start || motor.b_calibrate) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
motor.b_calibrate = true;
|
|
motor.b_calibrate = true;
|
|
@@ -498,10 +538,47 @@ void mc_encoder_off_calibrate(s16 vd) {
|
|
|
motor.b_calibrate = false;
|
|
motor.b_calibrate = false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+static void _encoder_zero_off_timer_handler(shark_timer_t *t){
|
|
|
|
|
+ if (!motor.b_calibrate) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ float enc_off = 0.0f;
|
|
|
|
|
+ float phase = motor_encoder_zero_phase_detect(&enc_off);
|
|
|
|
|
+ PMSM_FOC_SetOpenVdq(0, 0);
|
|
|
|
|
+ delay_ms(50);
|
|
|
|
|
+ adc_stop_convert();
|
|
|
|
|
+ pwm_stop();
|
|
|
|
|
+ PMSM_FOC_Stop();
|
|
|
|
|
+ _mc_internal_init(CTRL_MODE_OPEN, false);
|
|
|
|
|
+ motor.b_calibrate = false;
|
|
|
|
|
+ if (phase != INVALID_ANGLE) {
|
|
|
|
|
+ nv_save_angle_offset(phase);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
bool mc_encoder_zero_calibrate(s16 vd) {
|
|
bool mc_encoder_zero_calibrate(s16 vd) {
|
|
|
- if (PMSM_FOC_Is_Start()) {
|
|
|
|
|
|
|
+ if (motor.b_calibrate) {
|
|
|
|
|
+ if (vd == 0) {
|
|
|
|
|
+ encoder_clear_cnt_offset();
|
|
|
|
|
+ shark_timer_cancel(&_encoder_zero_off_timer);
|
|
|
|
|
+ PMSM_FOC_SetOpenVdq(0, 0);
|
|
|
|
|
+ delay_ms(500);
|
|
|
|
|
+ adc_stop_convert();
|
|
|
|
|
+ pwm_stop();
|
|
|
|
|
+ PMSM_FOC_Stop();
|
|
|
|
|
+ _mc_internal_init(CTRL_MODE_OPEN, false);
|
|
|
|
|
+ motor.b_calibrate = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ encoder_clear_cnt_offset();
|
|
|
|
|
+ MC_Check_MosVbusThrottle();
|
|
|
|
|
+ if (mc_unsafe_critical_error()) {
|
|
|
|
|
+ PMSM_FOC_SetErrCode(FOC_Have_CritiCal_Err);
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
+ _mc_internal_init(CTRL_MODE_OPEN, true);
|
|
|
motor.b_calibrate = true;
|
|
motor.b_calibrate = true;
|
|
|
pwm_turn_on_low_side();
|
|
pwm_turn_on_low_side();
|
|
|
task_udelay(500);
|
|
task_udelay(500);
|
|
@@ -509,26 +586,14 @@ bool mc_encoder_zero_calibrate(s16 vd) {
|
|
|
phase_current_offset_calibrate();
|
|
phase_current_offset_calibrate();
|
|
|
pwm_start();
|
|
pwm_start();
|
|
|
adc_start_convert();
|
|
adc_start_convert();
|
|
|
|
|
+ pwm_enable_channel();
|
|
|
phase_current_calibrate_wait();
|
|
phase_current_calibrate_wait();
|
|
|
PMSM_FOC_Set_Angle(0);
|
|
PMSM_FOC_Set_Angle(0);
|
|
|
PMSM_FOC_SetOpenVdq(vd, 0);
|
|
PMSM_FOC_SetOpenVdq(vd, 0);
|
|
|
- for (int i = 0; i < 10; i++) {
|
|
|
|
|
- delay_ms(1000);
|
|
|
|
|
- wdog_reload();
|
|
|
|
|
- }
|
|
|
|
|
- float phase = motor_encoder_zero_phase_detect();
|
|
|
|
|
- delay_ms(500);
|
|
|
|
|
- PMSM_FOC_SetOpenVdq(0, 0);
|
|
|
|
|
- delay_ms(500);
|
|
|
|
|
- adc_stop_convert();
|
|
|
|
|
- pwm_stop();
|
|
|
|
|
- PMSM_FOC_Stop();
|
|
|
|
|
- motor.b_calibrate = false;
|
|
|
|
|
- if (phase != INVALID_ANGLE) {
|
|
|
|
|
- nv_save_angle_offset(phase);
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
- return false;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ shark_timer_post(&_encoder_zero_off_timer, 6*1000);
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -872,13 +937,24 @@ void Sched_MC_mTask(void) {
|
|
|
/* 母线电流,实际采集的相电流矢量大小的计算 */
|
|
/* 母线电流,实际采集的相电流矢量大小的计算 */
|
|
|
PMSM_FOC_Calc_Current();
|
|
PMSM_FOC_Calc_Current();
|
|
|
|
|
|
|
|
- if ((is96v_prev != motor.b_is96Mode) || limted) {
|
|
|
|
|
- mc_gear_vmode_changed();
|
|
|
|
|
- }
|
|
|
|
|
if (motor.b_calibrate || (motor.mode == CTRL_MODE_OPEN)) {
|
|
if (motor.b_calibrate || (motor.mode == CTRL_MODE_OPEN)) {
|
|
|
|
|
+ if (motor.b_force_run) {
|
|
|
|
|
+ if (_force_wait > 0) {
|
|
|
|
|
+ --_force_wait;
|
|
|
|
|
+ }else {
|
|
|
|
|
+ _force_angle += 1.0f;
|
|
|
|
|
+ rand_angle(_force_angle);
|
|
|
|
|
+ PMSM_FOC_Set_Angle(_force_angle);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
mc_TaskEnd;
|
|
mc_TaskEnd;
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ if ((is96v_prev != motor.b_is96Mode) || limted) {
|
|
|
|
|
+ mc_gear_vmode_changed();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/* 堵转处理 */
|
|
/* 堵转处理 */
|
|
|
if (mc_run_stall_process(runMode) || (runMode == CTRL_MODE_CURRENT)) {
|
|
if (mc_run_stall_process(runMode) || (runMode == CTRL_MODE_CURRENT)) {
|
|
|
eCtrl_Running();
|
|
eCtrl_Running();
|