PID control of VFD fan based on Static Pressure

I am having and issue and can’t seem to find an applicable example so here is my question / problem/ issue.

I am trying to control a supply fan VFD based on static pressure using a PID. Below I have listed what I believe in all the pertinent info.

Static Pressure Input is 0-5V and the sensor has a range of 0-5in.wc.
VFD output is 0-10V

I have the Static Input Setup as 0-5V signal type and the Range is 0-5v ( number 41) - Label is STATIC
I have the VFD Output setup as 0 to 100% ( 0-10v) - (number 34) - Label is SASPEED
Static Set Point is in a variable called STSP with units set to inches of WC and a value of 2.5

My PID Settings are -
Units - Volts
Set Point - STSP
Action is set to ‘-’
Prop is set to 0
Int is set to 0
Time is set to Min
Der is 0.00
Bias is 0
A/M is Auto

the problem is that when the program sets SASPEED to PID1 it sets the speed to 0 and doesn’t change.

Also the VFD is supposed to have a minimum speed of 10% which I have working in the “Start UP” program but the momemnt the program with the PID use runs it goes to 0.

Wide PB for this application as fan curve is not linear. And it will hunt like crazy. I can help you but need more details

what info do you need that isn’t posted ? I am just trying to get the PID set up correctly.

First set up the pressure sensor, we’ll use the custom analog input range to set a linear table from 0-5V = 0-5 in WC. At Tab1 you can type in the engineering units, WC. At Tab2 you specify we’ll use only two points at the min and max of the table. Tab3 is important, this sets the signal type as the 0-5V transducer mode. Tab4 is where you enter in the minimum and maximum voltages and values for the readings.

Here is whre you define the fan speed analog output, pretty standard setup here. Just make sure you use one of the analog outputs. You can see which type of output hardware it is at Tab4.

Next set up the VAR which will hold the static pressure setpoint.

Next set up the PID, Tab5 is the ‘Input’ or feedback to the system. Tab6 is the variable holding the pressure setpoint. The action is negative, had to wait and watch the output at Tab7 for a few seconds to see that I had it correct. When the pressure is at 0 in WC as it is now, and the setpoint is at 2in WC you would expect the fan to be at 100% which looks good AT Tab7. I have the P term at ‘1’ which is pretty rigid control, you might want to put it larger which will make for a lazier action. Once its working reasonably well you would add some I term in the Int column.

And here’s where all the action happens finally, a program to set the fan speed = to the PID loop in line 20. Line 30 turns the fan off during the unoccupied period, lines further down in the program will override the earlier lines.

10 REM ***** FAN PROGRAM **********
20 FANSPEED = MAX( 10 , PID1 )

1 Like

Be sure to set up a trend log to watch the action over time, if you see short cycling loosen up the P term by making it larger (Big P = Lazy PID). Once you have the system fairly stable add some I term.

The trend log is set up as follows. Add the items to be trended at Tab7 and set the trend interval at Tab8. Notice this device has no SD card so we’ll only be able to see trend logs from while T3000 is open on this trend. If we add an SD card the data will be logged to the SD card. The trend log interval is at 10 seconds here which is more than necessary for the debugging phase. Once everything is commissioned you’ll want to reduce this to 10 minutes or so, otherwise your SD card will fill up fast and it’ll take forever to download the logs for viewing.

You can set the input to manual mode and watch the fan speed change. Dont forget to set it back to auto when you’re done.


I guess I’m confused on something with your PID function. So far what I have seen in the program is when the PID gets to set point the output is always 0. That works great for staging HVAC because yes when you get to setpoint you want everything off.
I have tried to make a physical closed loop that I have done to other controllers and wire the PID output directly to the controlling input. Scaled both 0-100%, the input 0-10VDC and the output 0-10VDC and gave the PID a setpoint of lets say 50%. So when the PID is at 50% it would output 5Vdc to the input that would now read 50%.
However the output needs to remain at 50% to archive this setpoint.
What I see this PID doing is the closer to setpoint it gets the lower the PID, so at setpoint “50%” the output is always trying to get to 0. I tried P at 1 all the way up to 25 and let it run for 24 hours at each setup and it never was able to get to setpoint just constantly hunting up and down.
I’ve inverted the PID output from + to -, I’ve also tried converting the input from 0-100% to 100-0% I get the same results.
So what do I need to do for the PID to maintain the output it takes to achieve setpoint without it going to 0 all the time?
Hopefully this makes since.


For me, I just set the P term to 1 or 2 when using DegC. If its F then double that. This will keep the room comfortable. Once you have the room working well with the P term only then you add some I term which will bump the system along into heat or cool after a long period of getting close but not quite there.

Hopefully the occupants in your building are not so sensitive that you need to dig into the D term.

1 Like

My two cents…
There have been times when I run into a loop that is set to ‘minutes’ and it is as though the loop went to sleep. I have learned that when I change it to hours the loop starts working and then I switch back to minutes. I haven’t yet experienced a loop going to zero at setpoint unless it couldn’t achieve setpoint before going to zero. I have experienced that issue when the ‘-’ or ‘+’ is reversed.
With loops in other systems, I have had to use math; such as multiply by 10 to get a larger value into ‘P’, the input and the setpoint. Sometimes loops deal better with bigger numbers?
One last thing is to setup an unused input or variable to use as an input, a variable for setpoint and an unused output or variable set up as an output and then test the loop by manipulating the input higher and lower until you are certain about which setting ‘-’ or ‘+’ to use.


1 Like