PIC18f4431 PID loop implementation

Discussion in 'Embedded Systems and Microcontrollers' started by dmta, Jun 29, 2013.

  1. dmta

    Thread Starter Member

    Mar 24, 2013
    32
    1
    Hi all !!!!!

    I want to implement a PID motor position controller in PIC18F4431. I read the motor position using a quadrature encoder and use the built in QEI to get the motor position. The PID loop is calculated every 0.52S inside the TIMER1 overflow ISR. This is my code (all variables are global).

    How do I now convert this to PWM to drive the motor ?

    Code ( (Unknown Language)):
    1. void interrupt(){
    2.     if(PIR1.TMR1IF==1){                   // every 0.52 seconds the PID O/P is calculated
    3.          
    4.               ERR_P1 = ERR_P2;            // get previous position error
    5.               ERR_P2 = SET_P - POS;       // calculate present position error
    6.               ERR_AC = ERR_AC + ERR_P2;   // calculate accumilated error
    7.               PID_P  = (float)Kp*ERR_P2 + (float)Ki*ERR_AC*0.52 + (float)Kd*(ERR_P2-ERR_P1)/(0.52);
    8.                    
    9.               PIR1.TMR1IF = 0;
    10.     }
    11. }
    BTW I am using a 360 pulses per revolution quadrature encoder and operating in the X4 mode of the QEI module i.e. when the shaft rotates 1 round (360°) the motor max value of "POS" will be 360×4-1=1439
     
    Last edited: Jun 29, 2013
Loading...