• Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

PIC18f4431 PID loop implementation

Not open for further replies.


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 ?

void interrupt(){
	if(PIR1.TMR1IF==1){                   // every 0.52 seconds the PID O/P is calculated
        	  ERR_P1 = ERR_P2;            // get previous position error
	          ERR_P2 = SET_P - POS;       // calculate present position error
        	  ERR_AC = ERR_AC + ERR_P2;   // calculate accumilated error
	          PID_P  = (float)Kp*ERR_P2 + (float)Ki*ERR_AC*0.52 + (float)Kd*(ERR_P2-ERR_P1)/(0.52);
        	  PIR1.TMR1IF = 0;
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:


Well-Known Member
Most Helpful Member
Sorry I don't have answer to your question, but I want to say that your equation is kind of a naive way to implement PID. Take a look at this: http://bestune.50megs.com/typeABC.htm
Last edited:


Your code might be somewhat simplistic but you got to start somewhere.... In addition to mrT's advice the attached document show the formulae for a pid implementation for a graphical programming system for PIC18F. Hope this will also help with your project.


Not open for further replies.

Latest threads

EE World Online Articles