标签:
使用PID控制器,在Cotroller的算法中,使用errori表示误差积分,errord表示误差微分,计算方式为
error := command.signal[1] - feedback.signal[1]; errori:=errori+error; errord:=error-pre(error); pout := Kp * error+Ki*errori+Kd*errord;
调试的步骤为:先调整Kp,将上升时间调到比较低的数值,但是增大Kp使上升时间的同时,超调量会Mp增大,所以下一步是通过调节Kd来调整超调量。增大Kd使超调量减小的同时过大的Kd会使电流震荡变多甚至无法在规定时间内稳定,所以不能调太大。接下来通过调节Ki使稳态误差变小,然后对三者的参数在已调出的参数上稍稍进行小波动的改变得到最后的值。我的调试结果是Kp=12.8;Ki=3;Kd=73;仿真的上升时间tr为0.0150s左右,超调量36%,稳态值59.6836,非常接近60.
block Controller InPort command(n=1); InPort feedback(n=1); OutPort outPort(n=1); Real error; Real errori; Real errord; Real pout; parameter Real Kp=14.75; parameter Real Ki=3; parameter Real Kd=100; parameter Real Max_Output_Pos = 10; parameter Real Max_Output_Neg = -10; algorithm error := command.signal[1] - feedback.signal[1]; errori:=errori+error; errord:=error-pre(error); pout := Kp * error+Ki*errori+Kd*errord; if pout > Max_Output_Pos then outPort.signal[1] := Max_Output_Pos; elseif pout < Max_Output_Neg then outPort.signal[1] := Max_Output_Neg; else outPort.signal[1] := pout; end if; end Controller;
仿真图形:
看起来有些地方的波动比较大比较多,但是实际上是因为计算步长取得太长而算的不精准的原因。前1.5秒的细致图如下:
标签:
原文地址:http://www.cnblogs.com/quartet/p/5527953.html