/// <summary> /// computes PID output /// </summary> /// <param name="setpointMks"></param> /// <param name="measuredValueMks"></param> /// <param name="millis">current time value</param> /// <returns></returns> private double ComputeServoInput(double setpointMks, double measuredValueMks, ulong millis) { double servoInputMks; // = setpointMks; pidA.mySetpoint = setpointMks; pidA.myInput = measuredValueMks; pidA.Compute(millis); servoInputMks = measuredValueMks + pidA.myOutput; //servoInputMks = pidA.myOutput; return(servoInputMks); }
/// <summary> /// computes PID output /// </summary> /// <param name="setpointMks"></param> /// <param name="measuredValueMks"></param> /// <param name="millis">current time value</param> /// <returns></returns> private double ComputeServoInputWithPID(double servoInputMks, double setpointMks, double measuredValueMks, ulong millis) { // we come here every 50ms, millis is a very large number increasing by 50 every time //servoInputMks = setpointMks; // don't allow PID inputs exceed platform limitations: setpointMks = GeneralMath.constrain(setpointMks, (double)panKinectMksMin, (double)panKinectMksMax); measuredValueMks = GeneralMath.constrain(measuredValueMks, (double)panKinectMksMin, (double)panKinectMksMax); pidA.mySetpoint = setpointMks; // around 1500. Where we want to be. pidA.myInput = measuredValueMks; // around 1500. Where we currently are. pidA.Compute(millis); // pidA operates on error=mySetpoint - myInput // produces pidA.myOutput - a number around 0, limited by pidA.SetOutputLimits() //Tracer.Trace("pidA: setpointMks=" + setpointMks + " measuredValueMks=" + measuredValueMks + " millis=" + millis + " pidA.myOutput=" + pidA.myOutput); // don't allow PID output exceed platform limitations: servoInputMks = GeneralMath.constrain(servoInputMks + pidA.myOutput, (double)panKinectMksMin, (double)panKinectMksMax); return(servoInputMks); }