Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
   }
}