Electronic – Convert PID parameters to Q15 format

control systemdspMATLABpid controller

I have calculated the transfer function of my system to apply a PID to it. With MATLAB and the PID Tuner tool I got the Kp, Ki and Kd parameters of my PID controller. For example in my case they are 0.175, 371.22 and 0 respectively.

Now, I need to use this values in my DSP but the PID algorithm uses the Q15 fractional format for everything. I know how I should scale the input and output values of my PID:

  • If the max input value is x, divide it by x if it goes from -x to x, or do (x/2)-1 if it goes from 0 to x and then convert to Q15 fractional

  • For the output value just scale it to your needs

But how do I convert my PID parameters Kp, Ki and Kd to Q15 correctly? If I apply some factor to them like I do for the input and output values I'm actually changing the loop response so how is this done? I think this should be a fairly common thing to do when designing digital PIDs.

Best Answer

First at all the maximum representables values of the Q15 format are -1 and 0.9999. So you might have a problem with your Ki.

The most common solution for converting a double to a Q15 is to multiply it with 2^15.

I am usually using this macro:

#define Q15(x)(s16) ((x<0.0) ? (s16)(32768*(x) - 0.5):(s16)(32768*(x) + 0.5))

But because of your Ki is not working with the Q15 format you should use another Q-format. eg: Q6 or Q7.

For further information you could check wikipedia.