|
@@ -33,14 +33,24 @@ void foc_init(void) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void foc_defulat_value(void){
|
|
static void foc_defulat_value(void){
|
|
|
- memset(&mFOC, 0, sizeof(mFOC));
|
|
|
|
|
mFOC.state = IDLE;
|
|
mFOC.state = IDLE;
|
|
|
mFOC.mosGate = false;
|
|
mFOC.mosGate = false;
|
|
|
mFOC.vbus = MAX_VBUS_VOLTAGE;
|
|
mFOC.vbus = MAX_VBUS_VOLTAGE;
|
|
|
mFOC.state = IDLE;
|
|
mFOC.state = IDLE;
|
|
|
mFOC.mode = FOC_MODE_OPEN_LOOP;
|
|
mFOC.mode = FOC_MODE_OPEN_LOOP;
|
|
|
|
|
+ mFOC.alpha_beta.alpha = 0;
|
|
|
|
|
+ mFOC.alpha_beta.beta = 0;
|
|
|
|
|
+ mFOC.dq_ref.Id = 0;
|
|
|
|
|
+ mFOC.dq_ref.Iq = 0;
|
|
|
|
|
+ mFOC.foc_fault = foc_success;
|
|
|
|
|
+ mFOC.is_ready = false;
|
|
|
|
|
+ mFOC.rpm_ref = -1;
|
|
|
|
|
+ memset(&mFOC.phase_time, 0, sizeof(mFOC.phase_time));
|
|
|
|
|
+ mFOC.sector = 0;
|
|
|
|
|
+ mFOC.dq_v.Id = 0;
|
|
|
|
|
+ mFOC.dq_v.Iq = 0;
|
|
|
phase_current_init(&mFOC.current_samp);
|
|
phase_current_init(&mFOC.current_samp);
|
|
|
- ramp_ctrl_init(&mFOC.start_ramp);
|
|
|
|
|
|
|
+ ramp_ctrl_init(&mFOC.voltage_ramp);
|
|
|
ramp_ctrl_init(&mFOC.current_ramp);
|
|
ramp_ctrl_init(&mFOC.current_ramp);
|
|
|
ramp_ctrl_init(&mFOC.speed_ramp);
|
|
ramp_ctrl_init(&mFOC.speed_ramp);
|
|
|
pi_clear(&mFOC.PI_id);
|
|
pi_clear(&mFOC.PI_id);
|
|
@@ -64,57 +74,59 @@ void foc_clear(void) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
u32 foc_get_speed(void) {
|
|
u32 foc_get_speed(void) {
|
|
|
- return abs(hall_sensor_get_speed()/mFOC.motor_p.poles);
|
|
|
|
|
|
|
+ float speed = hall_sensor_avg_speed()/(mFOC.motor_p.poles);
|
|
|
|
|
+ //printf("avg speed %f, %d\n", speed, mFOC.motor_p.poles);
|
|
|
|
|
+ return abs(speed);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool foc_is_ready(void){
|
|
bool foc_is_ready(void){
|
|
|
return mFOC.is_ready;
|
|
return mFOC.is_ready;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void foc_set_ready(bool ready) {
|
|
|
|
|
- mFOC.is_ready = ready;
|
|
|
|
|
|
|
+foc_fault_t foc_set_ready(bool ready) {
|
|
|
|
|
+ if (ready == foc_is_ready()) {
|
|
|
|
|
+ return foc_success;
|
|
|
|
|
+ }
|
|
|
|
|
+ normal_task_enable(false);
|
|
|
|
|
+ if (foc_stm_nextstate(ready?START:ANY_STOP) == NoError) {
|
|
|
|
|
+ mFOC.is_ready = ready;
|
|
|
|
|
+ normal_task_enable(true);
|
|
|
|
|
+ return foc_success;
|
|
|
|
|
+ }
|
|
|
|
|
+ normal_task_enable(true);
|
|
|
|
|
+ return foc_not_allowed;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
-void foc_set_current_ramp(float final){
|
|
|
|
|
- ramp_set_target(&mFOC.current_ramp, mFOC.dq_v.Vq, final, START_RAMP_DURATION);
|
|
|
|
|
|
|
+void foc_set_voltage_ramp(float final){
|
|
|
|
|
+ printf("voltage %f\n", final);
|
|
|
|
|
+ ramp_set_target(&mFOC.voltage_ramp, mFOC.dq_v.Vq, final, START_RAMP_DURATION);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void foc_set_speed_ramp(u16 rpm){
|
|
void foc_set_speed_ramp(u16 rpm){
|
|
|
ramp_set_target(&mFOC.speed_ramp, foc_get_speed(), rpm, SPEED_RAMP_DURATION);
|
|
ramp_set_target(&mFOC.speed_ramp, foc_get_speed(), rpm, SPEED_RAMP_DURATION);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/*
|
|
|
void foc_set_start_ramp(float v) {
|
|
void foc_set_start_ramp(float v) {
|
|
|
- ramp_set_target(&mFOC.start_ramp, mFOC.dq_v.Vq, v, START_RAMP_DURATION);
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ ramp_set_target(&mFOC.voltage_ramp, mFOC.dq_v.Vq, v, START_RAMP_DURATION);
|
|
|
|
|
+}*/
|
|
|
|
|
|
|
|
void foc_set_ref_speed(u16 rpm) {
|
|
void foc_set_ref_speed(u16 rpm) {
|
|
|
normal_task_enable(false);
|
|
normal_task_enable(false);
|
|
|
|
|
+ if (mFOC.state == IDLE || mFOC.state == ANY_STOP) {
|
|
|
|
|
+ normal_task_enable(true);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
mFOC.rpm_ref = rpm;
|
|
mFOC.rpm_ref = rpm;
|
|
|
if (mFOC.mode == FOC_MODE_OPEN_LOOP) {
|
|
if (mFOC.mode == FOC_MODE_OPEN_LOOP) {
|
|
|
- foc_set_start_ramp(speed_to_voltage(rpm));
|
|
|
|
|
- ramp_exc(&mFOC.start_ramp);
|
|
|
|
|
- }else if (mFOC.mode == FOC_MODE_PI_CURRENT) {
|
|
|
|
|
- foc_set_current_ramp(speed_to_current(rpm));
|
|
|
|
|
- ramp_exc(&mFOC.current_ramp);
|
|
|
|
|
|
|
+ foc_set_voltage_ramp(speed_to_voltage(rpm));
|
|
|
|
|
+ ramp_set_target(&mFOC.speed_ramp, rpm, rpm, SPEED_RAMP_DURATION);
|
|
|
|
|
+ ramp_exc(&mFOC.voltage_ramp);
|
|
|
}
|
|
}
|
|
|
normal_task_enable(true);
|
|
normal_task_enable(true);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-foc_fault_t api_set_ready(bool ready) {
|
|
|
|
|
- if (ready == foc_is_ready()) {
|
|
|
|
|
- return foc_success;
|
|
|
|
|
- }
|
|
|
|
|
- normal_task_enable(false);
|
|
|
|
|
- if (foc_stm_nextstate(ready?START:ANY_STOP) == NoError) {
|
|
|
|
|
- foc_set_ready(ready);
|
|
|
|
|
- normal_task_enable(true);
|
|
|
|
|
- return foc_success;
|
|
|
|
|
- }
|
|
|
|
|
- normal_task_enable(true);
|
|
|
|
|
- return foc_not_allowed;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
foc_fault_t foc_start_motor(void){
|
|
foc_fault_t foc_start_motor(void){
|
|
|
return foc_stm_nextstate(START);
|
|
return foc_stm_nextstate(START);
|
|
|
}
|
|
}
|
|
@@ -167,13 +179,13 @@ void foc_overide_set_theta(float theta){
|
|
|
void foc_overide_set_vdq(float d, float q){
|
|
void foc_overide_set_vdq(float d, float q){
|
|
|
mFOC.override.vdq.Vd = d;
|
|
mFOC.override.vdq.Vd = d;
|
|
|
mFOC.override.vdq.Vq = q;
|
|
mFOC.override.vdq.Vq = q;
|
|
|
|
|
+ //printf("%f, %f\n", d, q);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
float foc_get_vbus_voltage(void){
|
|
float foc_get_vbus_voltage(void){
|
|
|
return mFOC.vbus;
|
|
return mFOC.vbus;
|
|
|
}
|
|
}
|
|
|
static u32 foc_measure_task(void){
|
|
static u32 foc_measure_task(void){
|
|
|
- gas_sample_voltage();
|
|
|
|
|
vbus_sample_voltage();
|
|
vbus_sample_voltage();
|
|
|
ntc_sensor_sample();
|
|
ntc_sensor_sample();
|
|
|
LowPass_Filter(mFOC.vbus, vbus_get_voltage(), 0.1f);
|
|
LowPass_Filter(mFOC.vbus, vbus_get_voltage(), 0.1f);
|