我正在尝试在http://en.wikipedia.org/wiki/PID_controller
之后实现PID控制器我尝试控制的机制如下: 我有一个可以控制的输入变量。典型值为0.5 ... 10。 我有一个我每天测量的输出值。我的输出目标大致在同一范围内。
这两个变量具有很强的相关性 - 当过程参数上升时,输出通常会上升,但会有相当多的噪音。
我在这里执行: http://code.activestate.com/recipes/577231-discrete-pid-controller/
现在PID似乎与误差项相关,而不是测量的输出水平。所以我的猜测是我不应该将它原样用于过程变量,而是作为对当前值的一些修正?这怎么可能完全正常工作?
例如,如果我们取Kp = 1,Ki = Kd = 0,则进程(输入)变量为4,当前输出级别为3,我的目标值为2,我得到以下结果:
错误= 2-3 = -1 PID = -1
然后我应该将过程变量设置为-1?或4-1 = 3?
答案 0 :(得分:0)
您需要考虑PID控制器纠正操纵变量(MV)的错误,并且您需要使用I项来达到目标稳态结果。 I术语是PID如何保留并应用系统先前行为的记忆。
如果您考虑控制器的输出是MV中的变化,则它更多地是“速度形式”PID,并且先前错误和行为的存储器被集成并累积在先前的MV设置中。
从您的示例中,似乎操纵值-1不可行,并且您希望控制器建议像3这样的值以获得2的过程输出(PV)。对于PID控制器来使用“过程(输入)变量是4,...”(我的术语中的MV)Ki必须是非零的,如果系统处于稳态,则积分中积累的任何值(sum_e = sum(e) ))将精确等于4 / Ki,所以:
Kp= Ki = 1 ; Kd =0
error = SV - PV = 2 - 3 = -1
sum_e = sum_e + error = 4/Ki -1
MV = PID = -1(Kp) + (4/Ki -1)Ki = -1Kp + 4 - 1*Ki = -1 +4 -1 = 2
如果使用较慢的Ki而不是1,它会更加平滑噪音而不会如此快速地调整MV:
Ki = 0.1 ;
MV = PID = -1(Kp) + (4/Ki -1)Ki = -1Kp + 4 - 1*Ki = -1 +4 -0.1 = 2.9
在目标稳定状态(PV = SV)时,sum_e * Ki应该产生稳态MV:
PV = SV
error = SV - PV = 0
Kp * error = 0
MV = 3 = PID = 0 * Kp + Ki * sum_e
了解PID控制器的一个好方法是将单位放在所有内容上,并将Kp,Ki,Kd视为过程错误,累积误差* timeUnit和错误/ timeUnit变化率的转换。操纵变量,受控系统将控制器的操纵变量转换为输出单位。