View previous topic :: View next topic |
Author |
Message |
BM92
Joined: 04 Oct 2013 Posts: 18
|
How to run a PID? |
Posted: Tue Oct 22, 2013 9:44 am |
|
|
Ok so i have coded a PID using a very good tutorial online. but i am wondering what iis the best way for me to use it.
Am i able to leave the function outside of the main loop and call the function inside the main loop
eg.
Code: | main
{
while(1)
{
PID();
}
} |
Or is this not the correct way to run it? Also would the PID code need to use and interrupt to run or will it just run when it has data available to use |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19537
|
|
Posted: Tue Oct 22, 2013 11:41 am |
|
|
Key thing normally is that 'it depends'....
For a motor PID. you need responses to be quick, but you also need a finite number of updates to the position. You also need to ensure that the position does not update during the calculation.
So typically perhaps you would synchronise the PID to the PWM, perhaps after 8 cycles, and copy the new values into local variables with the interrupts disabled for brief moment, or 'double copy' if they change while being transferred, and then perform the maths. Ideally use scaled integer, rather than float.
I did a PID some time ago, that required quick updates, and used 24bit integers (my own library), scaled by even binary multiples, to get the maths speed fast.
However for something like a heater PID, the update speed can be much slower, so fp maths can be used. Much simpler, but you still need to ensure the values do not change during the calculations.
So, 'it depends'.....
Best Wishes |
|
|
gpsmikey
Joined: 16 Nov 2010 Posts: 588 Location: Kirkland, WA
|
|
Posted: Tue Oct 22, 2013 12:27 pm |
|
|
When I implemented the PID controller for my little heater (keeps the hummingbird feeder from freezing ), I used an "average" of the last 8 readings of both the ambient and heat plate temperatures to make sure one wrong reading would not drive the controller crazy. With something like a heater that has a relatively long time constant, you can update every second or more, but you do have to address the response time of your system - rudder position on a oil tanker is somewhat slower than the flight controls on a supersonic aircraft. The trick is to adjust the update rate as well as the constants in the control so it responds the way you want it to - typically comes go the value you want it to without either a long delay or overshoot etc. That is part of the tuning process. My preference for what I do is to have an interrupt running that triggers the updates although I keep the calculations outside the interrupt routine - it simply updates a counter that I use to determine when the next cycle should begin.
mikey _________________ mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3 |
|
|
BM92
Joined: 04 Oct 2013 Posts: 18
|
|
Posted: Tue Oct 22, 2013 12:32 pm |
|
|
I currently have not been given the specific purpose of this code as i am new to the project and this is just the "training" if you like.
Its for a scientific project which will be receiving data to and ADC. This data will then be entered into a PID and be sent back out through a DAC. This is all i have been told to do so far.
If i want to just use the data as it arrives would the method i have stated work ok or is it simply too difficult to say until i am given more information? |
|
|
gpsmikey
Joined: 16 Nov 2010 Posts: 588 Location: Kirkland, WA
|
|
Posted: Tue Oct 22, 2013 3:22 pm |
|
|
Without knowing the data rate, type of data and response times needed, that is sort of like telling someone to "accurately predict the number of hours that will be needed to handle unforeseen problems during the program". If you at least have a clue as to the data rate/type and response times needed, you can start to think about the hardware and software you will need. Maybe part of the "training" is to see if you have enough experience to go back and push on them for some basic requirements???
mikey _________________ mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3 |
|
|
BM92
Joined: 04 Oct 2013 Posts: 18
|
|
Posted: Tue Oct 22, 2013 3:44 pm |
|
|
Unfortunately the person for me to contact has not been available due to sickness. so was trying to get as far as possible with the little info i have. Thanks for the response though. |
|
|
RF_Developer
Joined: 07 Feb 2011 Posts: 839
|
|
Posted: Wed Oct 23, 2013 1:41 am |
|
|
PID control has to be tuned as a system. There are something like "universal" PID controllers for real world applications, but they all need to be set up - update rate, P, I and D terms - and adjusted for the system in which they are used. PID control works best when the update rate is well-defined as some of the terms are time-related. Though slower systems might well tolerate quite a lot of sampling/computation jitter.
You could write a fairly generic controller which had settable update rate and the three terms, but it would have to use floating point and would necessarily be slow. Faster PID, at least on PICs, involves using carefully scaled fixed point (i.e. scaled integer) arithmetic. I doubt a usefully generic, fully adjustable and FAST PID controller is practical on most PICs; you need more processor power. So, is that what you're being expected to implement? Or is part of the "training" that you are expected to insist on clarification of the requirements? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19537
|
|
Posted: Wed Oct 23, 2013 3:08 am |
|
|
Yes.
I think some remarks:
As RF_Developer says 'generic' PID's, will still require tuning.
To do anything approaching a generic PID, you'd have to use fp maths. Now on fast processors with a hardware maths co-processor, this can be quick enough, but on the PIC, except for 'slow' systems, this is unlikely to be the case.
Once you switch to using integer, the limitations rise, with you having not only to scale the factors themselves, but the choice of sampling time etc..
Also, don't get hooked on 'PID'. Though this is the starting point for most control algorithms in practice it is much more rarely used than you may think!. 'Variants' become the order of the day once in the real world, with often secondary control loops outside the basic control core. I've done ones using PD as the core, followed by I in a slower external loop, and even P^2D, with two external loops outside this to allow the system to compensate for more factors. Unless you are very lucky, and responses are symmetrical in the system itself, at the very least you may well find yourself having to adjust the factors according to the direction of motion (common in systems where gravity or spring loading makes the motion 'dissimilar' in different directions...
I'm afraid that without significant data, the core PID is not going to be much use....
Best Wishes |
|
|
RF_Developer
Joined: 07 Feb 2011 Posts: 839
|
Re: How to run a PID? |
Posted: Wed Oct 23, 2013 4:24 am |
|
|
To refer back to the original question:
BM92 wrote: | Also would the PID code need to use and interrupt to run or will it just run when it has data available to use |
PID needs to sample and compute at fixed intervals; "whenever data is available" won't cut it, generally. The P part is not a problem, but the I and D terms are time sensitive. Slow systems will only need infrequent updates and may tolerate quite a lot of timing error.
To get good timing doesn't necessarily mean having to use interrupts directly, or even at all. Even if interrupts are required to give known update intervals, its generally not a good idea to have all the processing of the loop itself in an interrupt routine. For many systems a clock tick interrupt with the main loop doing the computations when the tick reaches the next update point will be more than good enough. |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Wed Oct 23, 2013 4:48 am |
|
|
Why waste time waiting for your tutor.
Get a few cheap bits, PIC, resistor, thermistor, etc, and throw together a crude temperature control system.
Experiment to find out first hand what the real issues are.
Then, when you're given your task, you'll be well up the learning curve.
Mike |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Wed Oct 23, 2013 1:19 pm |
|
|
a quick comment about PID
not all servos require the I term, as for certain designs like narrow range
temperature controls and large rotor-mass, low speed motors -
the physical/load parameters of the system may provide all the I you can handle. ( and then some!)
the time constant for 'D' and
time between samples becomes a dominant factor
And in other sorts of systems, the D term may be counter productive.
an electrically regulated pendulum system comes to mind in the second case.
PID is not a magic bullet, unless shooting your foot is the target |
|
|
|