Sunday, March 27, 2011

CrazyEngineers Forum - Other Engineering Trades

CrazyEngineers Forum - Other Engineering Trades


My PID Code in C on PIC18F - Help

Posted: 26 Mar 2011 04:30 PM PDT

I'm making a PID controller using a PIC18F452 in C.

Code:

   
    signed int pid_error;
    short ProportionalGain;
    short IntegralGain;
    short DerivitiveGain;
    double AccumError;
    short LastError;
    short TotalGain;
    signed int pid_output;
    unsigned char reverse;
    unsigned int Kp;
    unsigned int Ki;
    unsigned int Kd;   
    Kp = 2;
    Ki = 0;
    Kd = 0;
    reverse = 0;

    setpoint = 50;
    T0CONbits.TMR0ON    = 0;        //Turn off tmr0
    LastError = pid_error;

    if (reverse = 0)
    {
        pid_error = ADRESH - setpoint;    //Forward
    }
    else
    {
        pid_error = setpoint - ADRESH;    //Reverse
    }
   
    AccumError = AccumError + pid_error;
   
    ProportionalGain = pid_error*Kp;
    IntegralGain = Kp * AccumError / Ki;
    DerivitiveGain = Kp * Kd * (pid_error - LastError);
    TotalGain = ProportionalGain + IntegralGain + DerivitiveGain;
    pid_output = setpoint + TotalGain;

My input is coming from ADRESH, 8-bit value from 1 - 5V, and my output is going to an external 8-bit I2C DAC. How can I convert "pid_error" to an 8-bit number. Also if anyone has some general comments about my code, I'll take suggestions.

Note: this is my first version, I plan on adding integral limits, derivitive spike prevention, auto/manual control, ect.

No comments:

Post a Comment