|
|
View previous topic :: View next topic |
Author |
Message |
ferkar
Joined: 14 Jul 2007 Posts: 38
|
pid control with pwm output |
Posted: Wed Dec 12, 2007 3:51 am |
|
|
hi everyone,
i would like make a pid controller. i simulated the code that i wrote in a simulation program,İSİS. on the screen i saw everything seemed well, i mean when look at oscillscope the pwm duty ratio varies between 0% to %100 in 10bit configuration. However when i test the code on the real system i realized that there was big dead band, about %50.
now i need some help to understand where the real problem is software or harware.
could anyone tell me where ı should look for digital pid controller flow chart?
thanks indeed... |
|
|
Ttelmah Guest
|
|
Posted: Wed Dec 12, 2007 4:11 am |
|
|
Obvious thing to look at, would be something silly with the variables used to control the PWM. Remember that CCS, 'switches mode', and is an 8bit variable is used, feeds this to just the top eight bits of the PWM control, while if a 'long' is used, give the 10bit output.
There are a couple of very good PID examples, in the Microchip site, under 'servo' control. AN523, gives in particular the process logic diagram for a digital PID loop. I posted sections of a much modified PID program here some time ago. The big problem is keeping the loop processing _fast_. Otherwise 'windup' behaviour in the control is liable to happen, with several loops occuring, before a response is seen, resulting in overcorrection. A lot also depends on the resolution of your encoder setup, and how often changes are likely to be seen.
If you can't find something to help, I'll try to trim the parser, and other stuff out of my code, and post it.
Best Wishes |
|
|
ferkar
Joined: 14 Jul 2007 Posts: 38
|
pid |
Posted: Wed Dec 12, 2007 5:34 am |
|
|
thank you interested in,
i check an523 on microchip site but i disappared. in other sources i read so much about pid. i need a programming support. if you want to see my code i could send it to check if any missing or failure lines..
thanks |
|
|
mmprestine
Joined: 13 Jan 2004 Posts: 29 Location: Green Bay, Wisconsin
|
|
Posted: Wed Dec 12, 2007 8:41 am |
|
|
here is a good reference
http://www.embedded.com/design/embedded/4211211/PID-without-a-PhD
http://www.embedded.com/ContentEETimes/Documents/Embedded.com/2000/f-wescot.pdf
here is code based on it that works well....
Code: |
PID.c
#include <18F452.h>
#device *=16 ADC=10
#use delay(clock=20000000)
#use rs232(baud=38400,xmit=PIN_C6,rcv=PIN_C7)
#include "PID.h"
#INT_TIMER0
TIMER0_isr(){
drive = UpdatePID(&plantPID,(plantCommand - position), position );
}
void main(){
setup_adc_ports ( NO_ANALOGS );
setup_adc ( ADC_OFF );
setup_psp ( PSP_DISABLED );
setup_spi ( FALSE );
setup_wdt ( WDT_OFF );
setup_timer_0 ( RTCC_INTERNAL|RTCC_DIV_8|RTCC_8_bit );
enable_INTerrupts ( INT_TIMER0 );
enable_INTerrupts ( GLOBAL );
setup_oscillator ( False );
while( 1 ) {
}
}
PID.h
typedef struct {
signed int16 dState, // Last position input
iState; // Integrator state
signed int16 iMax,
iMin; // Maximum and minimum allowable integrator state
signed int16 iGain, // integral gain
pGain, // proportional gain
dGain; // derivative gain
} SPid;
SPid plantPID;
signed int16 plantCommand, position, drive;
//PID controller code
signed int16 UpdatePID(SPid *pid, signed int16 error, signed int16 position)
{
signed int16 pTerm,
dTerm,
iTerm;
// calculate the proportional term
pTerm = pid->pGain * error; // calculate the proportional term
// calculate the integral state with appropriate limiting
pid->iState += error;
if ( pid->iState > pid->iMax){
pid->iState = pid->iMax;
}
else if ( pid->iState < pid->iMin){
pid->iState = pid->iMin;
}
iTerm = pid->iGain * pid->iState; // calculate the integral term
dTerm = pid->dGain * ( pid->dState - position);
pid->dState = position;
return (pTerm + dTerm + iTerm);
}
|
Last edited by mmprestine on Fri May 10, 2013 7:07 am; edited 2 times in total |
|
|
s_mack
Joined: 04 Jun 2009 Posts: 107
|
|
Posted: Sat Sep 05, 2009 3:39 pm |
|
|
fascinating. I'm having a difficult time understanding some of your code though. In particular:
Code: | drive = UpdatePID(&plantPID,(plantCommand - position), position ); |
Where does plantCommand come from / what is it? And according to the UpdatePID function, the central term should be related to the desired control value, not the input but you have it relating to the input. That confuses me. Say for example its a cruise control... the input is the pedal and the desired control value is speed. The error would be actual speed - desired speed, not actual speed - pedal position. So not knowing the context I am confused on that middle term.
Finally, where are the iGain, pGain and dGain values set/determined/calculated? i see them being declared but never initialized.
If I can wrap my head around your code this may be just what I've been looking for... a PID loop that doesn't use any floats! |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sun Sep 06, 2009 6:44 am |
|
|
Obviously, the code is rather a principle example than a functional application. As you already found out, part of the code is missing, e.g. initialization of parameters.
There are however more basic issues. As you are looking for fixed point PID code, you may want to check how scaling of product terms is achieved in the code. Unfortunately, it isn't at all. I can't see, how you get a functional PID code this way.
When you are using e.g. int16 variables and parameters, you have to define a scaling, too. You can have e.g. 4 bits left of the implicite decimal point, this is usually called a fractional number format. The multiply int32 result has to be scaled accordingly. To scale back to your your fractional format, you have to drop 4 MS and 12 LS bits. But saturation rather than overflow should be performed on the MSB side.
As another disadvantage of the PID example, it uses an explicite integrator limit, that typically doesn't correspond to the actual manipulated value's limits. But a poor windup suppression is still better than none.
Regarding your pedal and speed setpoint discussion, it isn't specific to the present PID code in any respect. Basically a car's pedal control doesn't involve a feedback controller, it directly sets the drive power. |
|
|
mmprestine
Joined: 13 Jan 2004 Posts: 29 Location: Green Bay, Wisconsin
|
|
Posted: Tue Sep 08, 2009 7:15 am |
|
|
Did you read the article "PID Without a PhD" that was posted with the sample code? |
|
|
s_mack
Joined: 04 Jun 2009 Posts: 107
|
|
Posted: Tue Sep 08, 2009 3:56 pm |
|
|
Yes, of course...
my problem isn't so much the PID theory as it is getting it to work without floats. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|