PID调节经验总结
PID调节经验总结PID控制器参数选择的方法很多,例如试凑法、临界比例度法、扩充临界比例度法等。但是,对于PID控制而言,参数的选择始终是一件非常烦杂的工作,需要经过不断的调整才能得到较为满意的控制效果。依据经验,一般PID参数确定的步骤如下:
(1) 确定比例系数Kp
确定比例系数Kp时,首先去掉PID的积分项和微分项,可以令Ti=0、Td=0,使之成为
纯比例调节。输入设定为系统允许输出最大值的60%~70%,比例系数Kp由0开始逐渐增大,直至系统出现振荡;再反过来,从此时的比例系数Kp逐渐减小,直至系统振荡消失。记录此时的比例系数Kp,设定PID的比例系数Kp为当前值的60%~70%。
(2) 确定积分时间常数Ti
比例系数Kp确定之后,设定一个较大的积分时间常数Ti,然后逐渐减小Ti,直至系统出现振荡,然后再反过来,逐渐增大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。
(3) 确定微分时间常数Td
微分时间常数Td一般不用设定,为0即可,此时PID调节转换为PI调节。如果需要设定,则与确定Kp的方法相同,取不振荡时其值的30%。
(4) 系统空载、带载联调
对PID参数进行微调,直到满足性能要求。
PID代码
//定义变量
float Kp; //PI调节的比例常数
float Ti; //PI调节的积分常数
float T; //采样周期
float Ki;
float ek; //偏差e
float ek1; //偏差e
float ek2; //偏差e
float uk; //u
signed int uk1; //对u四舍五入取整
signed int adjust; //调节器输出调整量
//变量初始化
Kp=4;
Ti=0。005;
T=0.001;
// Ki=KpT/Ti=0.8,微分系数Kd=KpTd/T=0.8,Td=0.0002,根据实验调得的结果确定这些参数
ek=0;
ek1=0;
ek2=0;
uk=0;
uk1=0;
adjust=0;
int piadjust(float ek)//PI调节算法
{
if( gabs(ek)<0.1 )
{
adjust=0;
}
else
{
uk=Kp*(ek-ek1)+Ki*ek;//计算控制增量
ek1=ek;
uk1=(signed int)uk;
if(uk>0)
{
if(uk-uk1>=0.5)
{
uk1=uk1+1;
}
}
if(uk<0)
{
if(uk1-uk>=0.5)
{
uk1=uk1-1;
}
}
adjust=uk1;
}
return adjust;
}
下面是在AD中断程序中调用的代码。
。。。。。。。。。。。
else //退出软启动后,PID调节,20ms调节一次
{
EvaRegs.CMPR3=EvaRegs.CMPR3+piadjust(ek);//误差较小PID调节稳住
if(EvaRegs.CMPR3>=890)
{
EvaRegs.CMPR3=890; //限制PWM占空比
}
}
本文来自: DSP交流网(www.hellodsp.com) 详细出处参考:http://www.hellodsp.com/bbs/viewthread.php?tid=688 觉得还可以的话 不要忘了顶噢!! 要顶 一般PI就够用了。加D应该速度会更快一些吧 mark! 看看 是挺详细的并专业!顶下 PID,通俗。。 顶贴 记下, Mark 顶贴 mark mark uk1=(signed int)uk;
if(uk>0)
{
if(uk-uk1>=0.5)
{
uk1=uk1+1;
}
}
if(uk<0)
{
if(uk1-uk>=0.5)
{
uk1=uk1-1;
}
这部分干什么用的啊 ?感觉怪 uk1=(signed int)uk;
if(uk>0)
{
if(uk-uk1>=0.5)
{
uk1=uk1+1;
}
}
if(uk<0)
{
if(uk1-uk>=0.5)
{
uk1=uk1-1;
}
这部分干什么用的啊 ?感觉怪 不错学习了 不错。。。。。顶啊 要顶 顶一个 回复【14楼】wwwzxfeng
-----------------------------------------------------------------------
小数处理,相当于四舍五入。 PID还没用过 MARK mark 收藏 怎么知道超调了,怎么测呢??楼主 受教了,有价值。 需要学习一下,马上就要用了 有用 ! 很有用,谢谢楼主的辛苦! mark 顶贴,正找呢!谢谢哈 收藏 回复【31楼】li408326758li
-----------------------------------------------------------------------
我的做法是使用Delphi编写了一个靠串口通信的上位机软件时刻监测结果这样可以观察控制信号响应 顶 顶 MARK 虽然不错 但很笼统 懂了就不难,不懂就很难。哈哈。。。 顶! 学习 感谢楼主分享!!
对PID算法不太熟悉,程序有点看不懂。。。我再慢慢琢磨。。。 MARK 回复【楼主位】pcbddd
-----------------------------------------------------------------------
这玩意用到数字测量和闭环里头很有用 感谢分享,顶一下! 谢谢分享 顶 mark mark 按照楼主的程序,kp=4,ki=0.8怎么发散到最后溢出了啊 楼主来给卢克卢克:
uk= uk1 + kp*(ek-ek1)+ki*ek;
ek1=ek;
ek=aim-uk;
uk1=uk;
循环调整,最后双精度都溢出了。。。 mark 最近我也在看关于PID的,谢谢楼主了 实在愚钝,经过几次才集中精神看了一下,明白了 pid有自整定的。 mark 学习 MARK PID很好 收藏! 收藏! 呵呵,过来看看 不错的资料,收了,谢谢楼主 留下记号备用。 mark 好贴要顶 mark 不错! 好 顶了,十分感谢! MARK 坛子里面之前有人发过 mark MARK., 回复【楼主位】pcbddd
-----------------------------------------------------------------------
学习中 帮顶 学习了。 回复【3楼】kim5257
一般pi就够用了。加d应该速度会更快一些吧
-----------------------------------------------------------------------
加d会减小上升时间,同时减小振荡 MARK mark,要顶一下 收藏..... MARK一下,正在学习捏。 定~!!{:handshake:} 收藏了,谢谢啊 通俗易懂!! mark 新手学习了 关注,顶贴 不错,好资料,好好学习 这计算出来的uk1和占空比有什么关系啊?就是怎么转化为占空比捏 我觉得挺好的,大家的看法呢 位置式PID {:sad:}{:sad:} wwwzxfeng 发表于 2011-8-13 16:57 static/image/common/back.gif
uk1=(signed int)uk;
if(uk>0)
{
应该是限幅的吧!!猜的 不错,学习了 必须顶起! 好东西,顶一下
gabs( ) 这个函数是什么?哪里的? mark。。。 PID的P,I系数确实是个问题
顶下了,努力总结哦
页:
[1]
2