pid



另外友情提示一下:这里的Kp,Ki,Kd不是真正的PID参数,这里的K们是离散后的常系数,不同的采样周期如果用相同的PID参数,离散后的K们不相同。所以建议写参数的时候用原始的PID参数。然后对应的计算离散后的K们。这样在调参数的时候直接调PID参数就行,不用考虑离散后的K们。而且参数辨识和建模仿真等一些操作中都是用的PID参数。

代码修改如下(参考):

float pid_output = 10;    //初始化一个控制器输出

int error0=0;
int error1=0;
int error2=0;
double Kp=1;            //PID中的P,越大系统响应越快

double Ti = 0.1;        //积分时间常数,越小积分作用越强,系统响应越快,系统越不稳定

double Td = 0.1;        //微分时间常数

double T = 0.1;            //采样周期
double ki=Kp*T/Ti;    //离散后常数
double kd=Kp*Td/T;
int PID_control(unsigned int e)
{  
int pid_output;
error0=e;
delta=(error0-error1)*kp+error0*ki+(error0-2*error1+error2)*kd;
pid_output =  delta;    //原文中的(1023/28.00)直接考虑到PID参数中,无需单独乘
error2=error1;
error1=error0;   
return pid_output;
}

上面函数中定义你的PID参数和采样周期后,对应的就可以算出离散后的Kp,Ki,Kd参与计算。调参数只需调PID参数和采样周期即可。

    由上面公式可以看出,增量式PID当误差为0时,控制器输出也为零。这就要求执行机构有积分保持特性,你确定你的执行机构在控制器输出为零时,能保持输出吗?如果不能,则应该用位置式PID。

    上面公式得到的只是增量,位置式输出是上一时刻的PID输出加上这个增量。即

     u(k)=u(k-1)+Δu(k)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值