Ejemplo n.º 1
0
void ControlClass::update()
{
    prevError = error;

    error.phi = PICInterface.rx.pitch - AHRS.orientation.phi;
    error.psi = PICInterface.rx.roll - AHRS.orientation.psi;
    error.theta = PICInterface.rx.yaw - AHRS.calibratedData.r; //Yaw uses rate control instead of angle

    differential.phi = (error.phi - prevError.phi) / Timer.dt;
    differential.psi = (error.psi - prevError.psi) / Timer.dt;
    differential.theta = (error.theta - prevError.theta) / Timer.dt;

    integral.phi += error.phi * Timer.dt;
    integral.psi += error.psi * Timer.dt;
    integral.theta += error.theta * Timer.dt;
    
    constrain_ (&integral.phi, 0.5);
    constrain_ (&integral.psi, 0.5);
    constrain_ (&integral.theta, 0.5);

    pid.phi = pidconstants.kp * error.phi + pidconstants.kd * differential.phi + pidconstants.ki * integral.phi;
    pid.psi = pidconstants.kp * error.psi + pidconstants.kd * differential.psi + pidconstants.ki * integral.psi;
    pid.theta = yawPIDConstants.kp * error.theta;// + yawPIDConstants.kd * differential.theta;


    PICInterface.pwmwidths.frontleft = ((PICInterface.rx.throttle * (MOTOR_MAX - MOTOR_MIN)) + MOTOR_MIN) - pid.phi - pid.psi + pid.theta;
    PICInterface.pwmwidths.frontright = ((PICInterface.rx.throttle * (MOTOR_MAX - MOTOR_MIN)) + MOTOR_MIN) + pid.phi - pid.psi - pid.theta;
    PICInterface.pwmwidths.rearright = ((PICInterface.rx.throttle * (MOTOR_MAX - MOTOR_MIN)) + MOTOR_MIN) + pid.phi + pid.psi + pid.theta;
    PICInterface.pwmwidths.rearleft = ((PICInterface.rx.throttle * (MOTOR_MAX - MOTOR_MIN)) + MOTOR_MIN) - pid.phi + pid.psi - pid.theta;
    PICInterface.setPWM();
}
Ejemplo n.º 2
0
void ControlClass::altitudeControl_() {
    altitudePID.prevError = altitudePID.error;
    altitudePID.error = targetAltitude_ - AHRS.calibratedData.altitude;
    altitudePID.differential = (altitudePID.error - altitudePID.prevError) / Timer.dt;
    altitudePID.output = altitudePID.constants.kp * altitudePID.error + altitudePID.differential * altitudePID.error;
    constrain_(&altitudePID.output, 500);
}