|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
| Thread Tools | Rate Thread | Display Modes |
|
#1
|
||||
|
||||
|
PID In-Range Ideas
Does anyone have any ideas about how to determine if a PID loop has settled out yet? We have our PID loop running relatively well, but I am trying to find a way to sense if the loop has settled out in order to trigger our intake system to shoot the ball. I tried if ERROR < 5 then RUN INTAKE. But it runs momentarily on the overshoot and undershoot. I was able to partially fix this by only allowing it to shoot after 3 seconds, but I feel that there is a better way to do this?
Patrick |
|
#2
|
||||
|
||||
|
Re: PID In-Range Ideas
We accomplished by averaging. If the average was in range, then fire.
|
|
#3
|
||||
|
||||
|
Re: PID In-Range Ideas
Is there a VI that will do averaging for you? If not, how do you do it?
|
|
#4
|
|||||
|
|||||
|
Re: PID In-Range Ideas
You combine a check of error with a timer.
The psudocode would be: Code:
int timer = 0; //Make sure you use a signed type to prevent underflow int delta_t = time_now - time_last; //delta_t is millisecond loop time - in LabVIEW it would be a Tick Count block and a shift register/feedback node to store the last time if(abs(error) < threshold) timer += delta_t; else timer -= delta_t; if(timer <= 0) timer = 0; if(timer >= threshold) fire(); |
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|