示例#1
0
pidController *
PidControllerInit( float Kp, float Ki, float Kd, tSensors port, short sensor_reverse = 0 )
{
    pidController   *p;

    if( nextPidControllerPtr == MAX_PID ) {
        return(NULL);
    }

    p = (pidController *)&_pidControllers[ nextPidControllerPtr++ ];

    // pid constants
    p->Kp    = Kp;
    p->Ki    = Ki;
    p->Kd    = Kd;
    p->Kbias = 0.0;

    // zero out working variables
    p->error           = 0;
    p->last_error      = 0;
    p->integral        = 0;
    p->derivative      = 0;
    p->drive           = 0.0;
    p->drive_cmd       = 0;
    if(Ki != 0)
        p->integral_limit  = (PIDLIB_INTEGRAL_DRIVE_MAX / Ki);
    else
        p->integral_limit  = 0;

    p->error_threshold = 10;

    // sensor port
    p->sensor_port     = port;
    p->sensor_reverse  = sensor_reverse;
    p->sensor_type     = SensorType[ port ];
    p->sensor_value    = 0;

    p->target_value    = 0;

    // We need a valid sensor for pid control, pot or encoder
    if( ( p->sensor_type == sensorPotentiometer ) ||
        ( p->sensor_type == sensorQuadEncoder ) ||
        ( p->sensor_type == sensorQuadEncoderOnI2CPort ) ||
        ( p->sensor_type == sensorGyro )
      )
        p->enabled    = 1;
    else
        p->enabled    = 0;

    PidControllerMakeLut();

    return(p);
}
示例#2
0
pidController *
PidControllerInit( float Kp, float Ki, float Kd, tVexSensors port, int16_t sensor_reverse )
{
    pidController   *p;

    if( nextPidControllerPtr == MAX_PID )
        return(NULL);

#ifndef PIDLIB_USE_DYNAMIC
    p = (pidController *)&_pidControllers[ nextPidControllerPtr++ ];
#else
    p = chHeapAlloc( NULL, sizeof( pidController ) );
#endif

    // pid constants
    p->Kp    = Kp;
    p->Ki    = Ki;
    p->Kd    = Kd;
    p->Kbias = 0.0;

    // zero out working variables
    p->error           = 0;
    p->last_error      = 0;
    p->integral        = 0;
    p->derivative      = 0;
    p->drive           = 0.0;
    p->drive_cmd       = 0;
    if(Ki != 0)
        p->integral_limit  = (PIDLIB_INTEGRAL_DRIVE_MAX / Ki);
    else
        p->integral_limit  = 0;

    p->error_threshold = 10;

    // sensor port
    p->sensor_port     = port;
    p->sensor_reverse  = sensor_reverse;
    p->sensor_value    = 0;

    p->target_value    = 0;

    // We need a valid sensor for pid control, pot or encoder
    // different sensor use in ConVEX, always enable for now
    if( 1 )
        p->enabled    = 1;
    else
        p->enabled    = 0;

    PidControllerMakeLut();

    return(p);
}