增量PID算法

本文详细介绍了PID控制器的三个组成部分:比例(P)、积分(I)和微分(D)部分。比例部分即时响应偏差,积分部分消除静态误差,微分部分则预测并提前纠正偏差趋势。此外,文章还探讨了位置式和增量式PID算法的公式及实际应用中的参数调整影响。

1、P - 比例部分

比例环节的作用是对偏差瞬间作出反应。偏差一旦产生控制器立即产生控制作用, 使控制量向减少偏差的方向变化。 控制作用的强弱取决于比例系数Kp, 比例系数Kp越大,控制作用越强, 则过渡过程越快, 控制过程的静态偏差也就越小; 但是Kp越大,也越容易产生振荡, 破坏系统的稳定性。 故而, 比例系数Kp选择必须恰当, 才能过渡时间少, 静差小而又稳定的效果。

2、I - 积分部分

从积分部分的数学表达式可以知道, 只要存在偏差, 则它的控制作用就不断的增加; 只有在偏差e(t)=0时, 它的积分才能是一个常数,控制作用才是一个不会增加的常数。 可见,积分部分可以消除系统的偏差。

积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,增加系统的超调量。积分常数Ti越大,积分的积累作用越弱,这时系统在过渡时不会产生振荡; 但是增大积分常数Ti会减慢静态误差的消除过程,消除偏差所需的时间也较长, 但可以减少超调量,提高系统的稳定性。

当 Ti 较小时, 则积分的作用较强,这时系统过渡时间中有可能产生振荡,不过消除偏差所需的时间较短。所以必须根据实际控制的具体要求来确定Ti 。

3、D - 微分部分

实际的控制系统除了希望消除静态误差外,还要求加快调节过程。在偏差出现的瞬间,或在偏差变化的瞬间, 不但要对偏差量做出立即响应(比例环节的作用), 而且要根据偏差的变化趋势预先给出适当的纠正。为了实现这一作用,可在 PI 控制器的基础上加入微分环节,形成 PID 控制器。

微分环节的作用使阻止偏差的变化。它是根据偏差的变化趋势(变化速度)进行控制。偏差变化的越快,微分控制器的输出就越大,并能在偏差值变大之前进行修正。微分作用的引入, 将有助于减小超调量, 克服振荡, 使系统趋于稳定, 特别对髙阶系统非常有利, 它加快了系统的跟踪速度。但微分的作用对输入信号的噪声很敏感,对那些噪声较大的系统一般不用微分, 或在微分起作用之前先对输入信号进行滤波。

位置式PID:△u(k)=Kp * e(k)+Ki / T * ∫ e(k) dt+Kd*d e(k);

求导

增量式PID:△u(k)=Kp * e(k-1)+Ki *e(k) +Kd *(e(k)-2e(k-1)+e(k-2));

实际PID输出:u(k)=Kp * e(k-1)+Ki *e(k) +Kd *(e(k)-2e(k-1)+e(k-2))+u(k-1);

u(k):本次实际输出量

u(k-1):上次的输出量

△u(k):输出变化量

Kp : 比例系数

Ki : 积分系数

Kd :微分系数

e(k-1):上一次的目标和实际的误差值

e(k) :这次的目标和实际的误差值

e(k-2):上上次目标和实际的误差值


增量式PID:u(k)=Kp * e(k-1)+Ki *e(t) +Kd *(e(k)-2e(k-1)+e(k-2))typedef struct{
	float kp ;		//比例系数
	float ki ;		//积分系数
	float kd ;	    //微分系数
	float error;    //误差值
	float lastError;	//上一个误差值
	float dError;        //上次误差和这次误差的变化值
	float ddError;       //上次误差变化值和这次误差的变化值的变化值
	float dError_last;   //上上次误差和上次次误差的变化值
	float output;         //输出值
	float output_last;    //上次的输出值
	float output_new;
}pid_info;

void reset_pid(pid_info *pid,float kp,float ki,float kd)
{
	pid->kp = kp;
	pid->ki = ki;
	pid->kd = kd;
	pid->error = 0;
	pid->lastError = 0;
	pid->dError = 0 ;
	pid->ddError = 0;
	pid->dError_last = 0;
	pid->output = 0 ;
	pid->output_last = 0;
}

float increment_pid(float error,pid_info *pid)//增量式PID
{
	pid->error = error;
	pid->dError = error - pid->lastError;
	pid->ddError = pid->dError - pid->dError_last;
	pid->lastError = error;
	pid->dError_last = pid->dError;
	pid->output =(pid->kp*pid->dError)+(pid->ki*error)+(pid->kd*pid->ddError) + pid->output_last; 
	pid->output_last = pid->output;	
   // int32_t pidoutput= (int32_t)pid->output;
	return pid->output;
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值