做外贸的网站主要有哪些内容,wordpress清理主题,hemi网站怎么做热图,长春建站模板1 PID简介
PID即#xff1a;Proportional#xff08;比例#xff09;、Integral#xff08;积分#xff09;、Differential#xff08;微分#xff09;的缩写。PID控制算法是结合比例、积分和微分三种环节于一体的控制算法。PID算法是连续系统中技术最为成熟、应用最为…1 PID简介
PID即Proportional比例、Integral积分、Differential微分的缩写。PID控制算法是结合比例、积分和微分三种环节于一体的控制算法。PID算法是连续系统中技术最为成熟、应用最为广泛的一种控制算法。 PID控制算法出现于20世纪30至40年代适用于对被控对象模型了解不清楚的场合。实际运行的经验和理论的分析都表明运用这种控制规律对许多工业过程进行控制时都能得到比较满意的效果。 PID控制的实质就是根据输入的偏差值按照比例、积分、微分的函数关系进行运算运算结果用以控制输出。 2 PID控制原理 PID控制是基于反馈的闭环控制根据控制对象输出反馈来进行校正。在测量出实际与计划发生偏差时按定额或标准来进行纠正。比如控制一个电机的转速就得有一个测量转速的传感器并将结果反馈到控制路线上。 PID是比例 (Proportion) 积分 ,(Integral) 微分 ,(Differential coefficient) 的缩写分别代表了三种控制算法。通过这三个算法的组合可有效地纠正被控制对象的偏差从而使其达到一个稳定的状态。 比例KP KP成比例的反应控制系统的偏差信号一旦产生偏差立即会产生控制作用减小偏差。比例控制器的输出u(t)与输入偏差e(t)成正比能迅速反映偏差从而减小偏差但不能消除静差。静差是指系统控制过程趋于稳定时给定值与输出量的实测值之差。偏差存在才能使控制器维持一定的控制量输出因此比例控制器必然存在着静差。由偏差理论知增大虽然可以减小偏差但不能彻底消除偏差。比例控制作用的大小除与偏差e(t)有关之外还取决于比例系数Kp的大小。比例系数Kp越小控制作用越小系统响应越慢反之比例系数Kp越大控制作用也越强则系统响应越快。但是Kp过大会使系统产生较大的超调和振荡导致系统的稳定性能变差。因此不能将Kp选取过大应根据被控对象的特性来折中选取Kp使系统的静差控制在允许的范围内同时又具有较快的响应速度。 积分KI 积分KI主要用于消除静态误差提高系统的无差度。积分作用的强弱取决于积分时间常数TiTi越大积分作用越弱反之则越强。积分控制作用的存在与偏差e(t)的存在时间有关只要系统存在着偏差积分环节就会不断起作用对输入偏差进行积分使控制器的输出及执行器的开度不断变化产生控制作用以减小偏差。在积分时间足够的情况下可以完全消除静差这时积分控制作用将维持不变。Ti越小积分速度越快积分作用越强。但是积分作用太强会使系统超调加大甚至使系统出现振荡。 微分KD 微分KD能反映偏差信号的变化趋势变化速率并能在偏差信号的值变得太大之前在系统中引入一个有效的早期修正信号从而加快系统的动作速度减小调节时间。积分控制作用的引入虽然可以消除静差但是降低了系统的响应速度特别是对于具有较大惯性的被控对象用PI控制器很难得到很好的动态调节品质系统会产生较大的超调和振荡这时可以引入微分作用。在偏差刚出现或变化的瞬间不仅根据偏差量作出及时反应即比例控制作用还可以根据偏差量的变化趋势速度提前给出较大的控制作用即微分控制作用将偏差消灭在萌芽状态这样可以大大减小系统的动态偏差和调节时间使系统的动态调节品质得以改善。微分环节有助于系统减小超调克服振荡加快系统的响应速度减小调节时间从而改善了系统的动态性能但微分时间常数过大会使系统出现不稳定。微分控制作用一个很大的缺陷是容易引入高频噪声所以在干扰信号比较严重的系统中不宜引入微分控制作用。微分控制作用的阶跃响应特性对于一个恒定的偏差量不管其数值有多大微分控制作用均为零。因此微分作用不能消除静差单独使用意义不大一般需要与比例、积分控制作用配合使用构成PD或PID控制。 对于PID控制在控制偏差输入为阶跃信号时立即产生比例和微分控制中作用。由于在偏差输入的瞬时变化率非常大微分控制作用很强此后微分控制作用迅速衰减但积分作用越来越大直至最终消除静差。PID控制综合了比例、积分、微分3种作用既能加快系统响应速度、减小振荡、克服超调亦能有效消除静差系统的静态和动态品质得到很大改善因而PID控制器在工业控制中得到了最为广泛的应用。
3 PID控制的公式 在实际应用中就需要离散化因为时间t不可能无限小。 位置式PID输出的是实际控制值
增量式PID输出的是变化值需要加上原来的值才是实际控制值
4 PID调参
在确定PID控制器参数时可以根据控制器的参数与系统动态性能和稳态性能之间的定性关系用实验的方法来调节控制器的参数。 PID调试一般原则 a.在输出不振荡时增大比例增益P。 b.在输出不振荡时减小积分时间常数Ti。 c.在输出不振荡时增大微分时间常数Td。 参数调整一般步骤 由于自动控制系统被控对象的千差万别PID的参数也必须随之变化调试PID参数的一般步骤 a.确定比例增益 确定比例增益P时首先去掉PID的积分项和微分项一般是令Ti0、Td0PID为纯比例调节。输入设定为系统允许的最大值的60%70%由0逐渐加大比例增益P直至系统出现振荡再反过来从此时的比例增益P逐渐减小直至系统振荡消失记录此时的比例增益P设定PID的比例增益P为当前值的60%70%。比例增益P调试完成。 b.确定积分时间常数 比例增益P确定后设定一个较大的积分时间常数Ti的初值然后逐渐减小Ti直至系统出现振荡之后在反过来逐渐加大Ti直至系统振荡消失。记录此时的Ti设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。 c.确定微分时间常数 微分时间常数Td一般不用设定为0即可。若要设定与确定P和Ti的方法相同取不振荡时的30%。 d.系统空载、带载联调再对PID参数进行微调直至满足要求。
PID常用口诀 参数整定寻最佳从大到小顺次查。 先是比例后积分最后再把微分加。 曲线振荡很频繁比例度盘要放大。 曲线漂浮绕大弯比例度盘往小扳。 曲线偏离回复慢积分时间往下降。 曲线波动周期长积分时间再加长。 理想曲线两个波调节过程高质量。
5 C语言代码实现
5.1位置式PID控制算法Kp,Ki,Kd三个参数调试过程当中对于要求的控制效果可以通过调节这三个量直接进行调节。
// 位置式PID控制算法
struct _pid
{float SetSpeed; //定义设定值float ActualSpeed; //定义实际值float err; //定义偏差值float err_last; //定义上一个偏差值float Kp; //定义比例系数float Ki; //定义积分系数float Kd; //定义微分系数float voltage; //定义电压值控制执行器的变量float integral; //定义积分值
}pid;
void PID_init()
{pid.SetSpeed0.0;pid.ActualSpeed0.0;pid.err0.0;pid.err_last0.0;pid.voltage0.0;pid.integral0.0;pid.Kp0.2;pid.Ki0.015;pid.Kd0.2;
}
float PID_realize(float speed)
{pid.SetSpeedspeed;pid.errpid.SetSpeed-pid.ActualSpeed;pid.integralpid.err;pid.voltagepid.Kp*pid.errpid.Ki*pid.integralpid.Kd*(pid.err-pid.err_last);pid.err_lastpid.err;pid.ActualSpeedpid.voltage*1.0;return pid.ActualSpeed;
}int main()
{PID_init();int count0;while(count1000){float speedPID_realize(100.0);printf(%f\n,speed);count;}return 0;
}5.2 增量型PID控制算法
struct _pid{float SetSpeed; //定义设定值float ActualSpeed; //定义实际值float err; //定义偏差值float err_next; //定义上一个偏差值float err_last; //定义最上前的偏差值float Kp; //定义比例系数float Ki; //定义积分系数float Kd; //定义微分系数
}pid;void PID_init()
{pid.SetSpeed0.0;pid.ActualSpeed0.0;pid.err0.0;pid.err_last0.0;pid.err_next0.0;pid.Kp0.15;pid.Ki0.20;pid.Kd0.25;
}
float PID_realize(float speed)
{pid.SetSpeedspeed;pid.errpid.SetSpeed-pid.ActualSpeed;float incrementSpeedpid.Kp*(pid.err-pid.err_next)pid.Ki*pid.errpid.Kd*(pid.err-2*pid.err_nextpid.err_last);pid.ActualSpeedincrementSpeed;pid.err_lastpid.err_next;pid.err_nextpid.err;return pid.ActualSpeed;
}
int main()
{PID_init();int count0;while(count1000){float speedPID_realize(100.0);printf(%f\n,speed);count;}return 0;
}