void applyPID(void) { float left_spd, right_spd; float left_ds, right_ds; left_spd = control.speeds.linear_speed - control.speeds.angular_speed; right_spd = control.speeds.linear_speed + control.speeds.angular_speed; left_ds = left_spd - wheels_spd.left; right_ds = right_spd - wheels_spd.right; control.speeds.pwm_left = PIDCompute(&PID_left, left_ds); control.speeds.pwm_right = PIDCompute(&PID_right, right_ds); }
void FCURun(FCDataBaseDef *FC) { switch (systemState) { case POWERON: //Éϵç״̬ { FC->State.Sys.Solo.Started = 0; FC->State.Sys.Solo.RelayH = 0; FC->State.Sys.Solo.RelayM = 0; FC->State.Sys.Solo.RelayL = 0; FC->State.Sys.Solo.FloatRelayOn = 1; FC->State.Sys.Solo.FloatRelayOff = 0; FC->Buff.AnalogOut01 = 0; FC->Buff.AnalogOut02 = 0; FC->FCpid.ITerm = 0; FC->Buff.WorkTimer.OpenTimer = FC->Run.SolenoidValveMax * 100; FC->Buff.WorkTimer.CloseTimer = 0; systemState = POWERONSTAY; } break; case POWERONSTAY: //ÉϵçµÈ´ý״̬ { if (!FC->Buff.Flag.solo._1000msFlag) { return; } FC->State.Sys.Solo.RelayH = 0; FC->State.Sys.Solo.RelayM = 0; FC->State.Sys.Solo.RelayL = 0; FC->Buff.AnalogOut01 = 0; FC->Buff.AnalogOut02 = 0; FC->FCpid.ITerm = 0; FloatTimerDeal(FC); } break; case CLOSEIDLE: //¹Ø»ú¿ÕÏÐ״̬ { if (FC->Buff.WorkTimer.OnOffDelayTimer > 0) { return; } FC->State.Sys.Solo.RelayH = 0; FC->State.Sys.Solo.RelayM = 0; FC->State.Sys.Solo.RelayL = 0; FC->Buff.AnalogOut01 = 0; FC->Buff.AnalogOut02 = 0; FC->FCpid.ITerm = 0; if (FC->State.Sys.Solo.Started) { systemState = VALVEDEAL; // FC->FCpid.myOutput = } FloatTimerDeal(FC); } break; case VALVEDEAL: { KeyControl(FC); PIDCompute(&FC->FCpid); FanCompute(FC); FloatCompute(FC); if (!FC->State.Sys.Solo.Started) { systemState = CLOSEIDLE; FC->Buff.WorkTimer.OpenTimer = 0; FC->Buff.WorkTimer.CloseTimer = FC->Run.SolenoidValveMax * 100; } else if (FC->FCpid.myOutput > FC->FCpid.outMax * 30 / 100) { FC->Buff.WorkTimer.OpenTimer = FC1.Run.SolenoidValveMax * 100; systemState = FANDEAL; } } break; case FANDEAL: { KeyControl(FC); PIDCompute(&FC->FCpid); if (!FC->State.Sys.Solo.Started) { systemState = CLOSEIDLE; FC->Buff.WorkTimer.OpenTimer = 0; FC->Buff.WorkTimer.CloseTimer = FC->Run.SolenoidValveMax * 100; } if (FC->FCpid.myOutput <= FC->FCpid.outMax * 30 / 100) { FC->Buff.WorkTimer.OpenTimer = 0; systemState = VALVEDEAL; } FloatTimerDeal(FC); FanCompute(FC); } break; } }