#include #include "bsp/bsp.h" #include "foc/foc_api.h" #include "foc/foc_core.h" extern motor_foc_t g_foc; foc_state_t foc_stm_state(void){ return g_foc.state; } foc_fault_t foc_stm_nextstate(foc_state_t state) { bool changed = false; if (state == g_foc.state) { return foc_success; } if (state == START) { if (g_foc.state == IDLE) { changed = true; } }else if (state == IDLE) { if (g_foc.state == ANY_STOP) { changed = true; } }else if (state == ANY_STOP) { if (g_foc.state != IDLE) { changed = true; } }else if (state == CURRENT_CALIBRATE) { if (g_foc.state == START) { changed = true; } }else if (state == READY_TO_RUN) { if (g_foc.state == CURRENT_CALIBRATE) { changed = true; } }else if (state == RAMPING_START) { if (g_foc.state == READY_TO_RUN || g_foc.state == RUNNING) { changed = true; } } if (changed) { g_foc.state = state; return foc_success; } return foc_not_allowed; } void FOC_Normal_Task(motor_foc_t *foc) { switch (foc->state) { case IDLE: foc->mode = FOC_MODE_OPEN_LOOP; break; case START: PWM_TurnOnLowSides(); foc_stm_nextstate(CURRENT_CALIBRATE); break; case CURRENT_CALIBRATE: foc_current_calibrate(); foc_stm_nextstate(READY_TO_RUN); break; case READY_TO_RUN: foc_pwm_start(true); foc_stm_nextstate(RAMPING_START); ramp_exc(&foc->voltage_ramp); break; case RAMPING_START: foc_set_dq_command(0.0f, ramp_get_target(&foc->voltage_ramp)); printf("target %f\n", ramp_get_target(&foc->voltage_ramp)); if (foc_get_speed() >= RPM_FOR_CLOSE_LOOP){ //foc_stm_nextstate(CLOSED_LOOP); //foc_overide_vdq(false); } break; // case CLOSED_LOOP: // Foc_Speed_Ramp(foc); // foc->mode = FOC_MODE_PI_FULL; // foc_stm_nextstate(RUNNING); // ramp_clear(&foc->voltage_ramp); // break; case RUNNING: Foc_Speed_Ramp(foc); Foc_Calc_Current_Ref(foc); if (foc->foc_fault == foc_brake_error){ foc_stm_nextstate(ANY_STOP); break; } /* if (foc_get_speed() <= RPM_FOR_CLOSE_LOOP){ foc_set_voltage_ramp(speed_to_voltage(foc_get_speed())); ramp_exc(&foc->voltage_ramp); foc_stm_nextstate(RAMPING_START); foc->mode = FOC_MODE_OPEN_LOOP; foc_overide_vdq(true); }*/ break; case ANY_STOP: ramp_clear(&foc->current_ramp); foc_clear(); foc_stm_nextstate(IDLE); break; default: break; } }