예제 #1
0
double BH280::PositionControlC(int m)
{
	LowPass(m,0.3);
  double out=0.0;
  double dt=diffclock(&now,&lc);
  double Kf=0.5/20.0;
  //P
	double qd=Cons.cValues[m];
	double qf=Kf*Deadzone(m,0.30);
	double q= Meas.Position[m];
	double e= qd-q-qf;
	//Meas.m280[2][m]=qd-q-qf;
  //D
	double pqd=pCons.cValues[m];
	double pqf=Kf*Deadzone(m,0.30);
	double pq= pMeas.Position[m];
	double pe= pqd-pqf-pq;
	double de=pe/dt;
  out=reg.P[m]*e;// + reg.D[m]*de;

  if (out>reg.maxV[m]) 		out=reg.maxV[m];
  if (out<-reg.maxV[m]) 	out=-reg.maxV[m];
 
  return out;
}
예제 #2
0
	void ApplyDeadzone(f64 deadzone, bool linear)
	{
		if (linear)
		{
			f64 fX = Deadzone(X, deadzone, dzk);
			f64 fY = Deadzone(Y, deadzone, dzk);
			SetPoint(fX, fY);
		}
		else
		{
			f64 radius = Deadzone(r, deadzone, dzk);
			SetRadius(radius);
		}
	}