PID学习笔记

位置闭环控制(位置式PID)

 

 通过将公式写出代码的形式:

float Position_Kp, Position_Ki, Position_Kd;

int Position_PID(int Encoder, int Target)
{
	static float Bias, Pwm, Integral_bais, Last_bais;
	Bias = Encoder - Target;
	Integral_bais += Bias;
	Pwm = Position_Kp * Bias + Position_Ki * Integral_bais +
		Position_Kd * (Bias - Last_bais);
	Last_bais = Bias;
	return Pwm;
}

之后通过定时中断服务调用函数

Moto = Position_PID(Encoder, Target_Position);
Set_Pwm(Moto);

调参步骤

1.首先将I和D的值设置为0,将P的值从0逐渐增加,直到出现振荡,但此时没有出现静差

未出现静差的原因:静差一般出现在P较小而I为0。

2.此时将P减小,发现P较小出现静差,但系统响应速度也相应减小

所以,增大P可以一定程度上消除静差,提高系统相应速度,但会导致系统振荡,而加入微分D可以有效抑制振荡

3.在P出现振荡的基础上,引入D,逐渐增大D可以发现系统振荡得到了抑制,振荡次数减小。

但引入D系统的响应速度会变慢,因为:引入D相当于增大系统的阻尼,此时需要结合PI值进行优化

总结:实际工程中PID对控制器效果都不一样,对于对速度要求高的如倒立摆等,响应速度慢会导致系统失控。而智能家居中对稳定性和准确性要求就高,所有需要控制静差和超调量

所以对于位置控制的调节可以总结为:先使用P控制,增大P系数至出现振荡,之后加入微分以增大阻尼,消除振荡后在根据系统要求来消除系统对响应和静差等要求,调节P和I。

一般而言,对于系统控制难易程度取决于系统的转动惯量和对响应速度的要求。

转动惯量小,对响应速度要求低,PID就约不敏感。

如果要求控制直流电机转动一定角度,则需要严格控制超调量和静差,但对响应速度要求不高,因其转动惯量在轻载小,所以P应该小,而应该增大阻尼防止超调即D应该大,同时加入I减小静差

速度闭环控制(增量式PID)

 增量式PI代码

float Velocity_Kp, Velocity_Ki;

int Incremental_PI(int Encoder, int Target)
{
	static float Bias, Pwm, Last_bias;
	Bias = Encoder - Target;
	Pwm += Velocity_Kp * (Bias - Last_bias) + Velocity_Ki * Bias;
	Last_bias = Bias;
	return Pwm;
}

关于平衡小车的调试

首先需要知道平衡小车的平衡原理,此处省略,具体详见网上教程

小车平衡需要分两个步骤,一是让小车保持直立的状态也即倾角保持0度,二是小车的前行速度为0.  二者所用PID分别为位置式和速度式,所以在调参时应先将直立环的参数调好后再去调整速度环。

直立环的调试:

一般直立环采用PD上述已经讲解,直立环保证的是其响应的速度,所以需增大P提高响应速度,但会带来振荡,消除振荡就需要引入D。

而I则是用来消除偏差的所以可以不用加。

以平衡车的直立环为例,如下为PD控制

int balance(float Angle,float Gyro)
{  
   float Bias;
	 int balance;
	 Bias=Angle-ZHONGZHI;                       //===求出平衡的角度中值 和机械相关
	 balance=Balance_Kp*Bias+Gyro*Balance_Kd;   //===计算平衡控制的电机PWM  PD控制   kp是P系数 kd是D系数 
	 return balance;
}

其中ZHONGZHI指的是小车平衡时所处的机械位置,也就是平衡时的角度

Angle是当前的倾角,而Gyro是小车倾斜转动的角速度。

对于陀螺仪,需明白其原理,陀螺仪的X,Y轴反应的是其转动的角度,根据位置式PID公式,Kd乘的是微分项,而离散式的微分可以用差分来代替,故Gyro实际上就是陀螺仪经过角度差分得出的角速度。

调节PD时需先调节P也是根据PID的调参顺序而来,其中Kp调节如下(Kd=0):

1.确定平衡中值:也即平衡角度。

2.确定Kp的极性:对于硬件上的调节来说,显然较麻烦,首先需要先估计Kp的取值,对于PWM输出其最大我们设置的7200所以如果Kp为720的话,每转动10度就超幅了,故可以选定0-720之间,先假设为200,若电机和小车倾斜方向转动一样则极性正确,若不一样则需要取相反数

3.确定大小:Kp调节原则是Kp一直增大,直到出现低频振荡

当逐渐增大至出现低频振荡后,就可以开始调节Kd了

Kd调节如下:

1.确定极性(Kp=0):由于MPU6050输出的最大值不会超过4位数,而PWM最大为7200所以可以知道Kd为0-2之间,先设置Kd=0.5若拿起小车后电机朝着小车倾斜方向转动则极性为正否则为负。

2.确定大小(取Kp的最大值就是刚刚出现低频振荡的值):Kd调节原则是Kd增大,直到出现高频振荡

低频振荡和高频的区别是 其抖动的频率也就是抖动的里不厉害

当出现高频振荡时应立即关闭电机防止损坏电机

小车设定的Kd=1.7为最大值

最后工程我们要对KD KP的最大值乘以0.6作为最终的取值此时直立环调节完毕


速度环调试

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值