智能车 PID 调试
学习目的
- 使电机速度和舵机转向更精准,有利于导航控制。
- 利用传感器反馈值实现闭环控制,消除不必要的干扰误差。
- 让整个系统更稳定。
开环控制与闭环控制
开环控制
当操作者启动系统,使之进入运行状态后,系统将操作者的指令一次性输向受控对象。此后,操作者对受控对象的变化便不能作进一步的控制。
闭环控制
当操作者启动系统后,通过系统运行将控制信息输向受控对象,并将受控对象的状态信息反馈到输入中,以修正操作过程,使系统的输出符合预期要求。
小结
小车的控制使用开环控制很容易漂移或者跑偏,也不够灵活,不利于导航系统的运行,所以应当选取闭环控制,PID 就是一种经典闭环控制算法。
PID 概述
简介
将偏差的比例(Proportion)、积分(Integral)和微分(Differential)通过线性组合构成控制量,用这一控制量对被控对象进行控制,这样的控制器称 PID 控制器。
PID 算法应用广泛,多用于自动控制领域,如机器人,小车,洗衣机等,在智能车中广泛用于电机控制。
PID 公式:
U
(
t
)
=
K
p
?
e
r
r
(
t
)
+
T
i
∫
e
r
r
(
t
)
d
t
+
T
d
?
d
e
r
r
(
t
)
d
t
U(t) = K_p * err(t) + T_i \int err(t)d_t + T_d * \frac{derr(t)}{d_t}
U(t)=Kp??err(t)+Ti?∫err(t)dt?+Td??dt?derr(t)?
Kp:控制器的比例系数,对误差信号进行放大或衰减,其大小决定了控制作用的强弱。该系数过大可能导致系统震荡,使得稳定性变差,降低系统的相对稳定性;系数过小会导致控制效果不明显,反应迟钝,不能有效修正干扰的影响;且该系数不能完全消除系统的稳态误差。
Ti : 控制器的积分时间,也称积分系数,通过对误差累积的作用影响控制器的输出,并通过系统给出的负反馈减小偏差,理论上只要时间足够,积分控制可以消除稳态误差。该系数过大可能导致系统积分超调,使得调整时间过长;过小可能导致收敛过长,不能及时克服干扰影响。
Td: 控制器的微分时间,也称微分系数,该系数能够反映出误差信号变化的速度,在误差刚出现时就产生很大的控制作用,具有超前的控制作用,有利于减小调整时间,改善系统动态品质。该系数过大会引起系统震荡,导致系统稳定性下降;过小可能导致改善效果不明显。同时,微分容易引入高频噪声,导致系统不稳定。
总结一下,PID 三个字母,大致可以说是 P 主管响应,I 减小静差,D 抑制震荡,但使用不当会有反作用。
舵机 PID
分析
舵机控制一般选用位置式 PID ,因为舵机本次的控制量输出值与上次控制量输出值关系不大,只与过去状态有关,舵机需要的是快速转到某个角度。而位置式 PID 正好不需要对控制量进行记忆,而是直接对偏差值进行计算得出期望的控制量。 位置式 PID 可由 PID 公式离散化得出,进行离散化是由于计算机控制是一种采样控制,它只能根据采样时刻的偏差计算控制量,而不能像模拟控制那样连续输出控制量量,进行连续控制。由于这一特点,PID 公式中的积分项和微分项不能直接使用,必须进行离散化处理。 离散化后则得到位置式 PID,也称全量式 PID :
u
(
k
)
=
K
p
?
e
(
k
)
+
K
i
?
∑
i
=
0
k
e
(
i
)
+
K
d
?
[
e
(
k
)
?
e
(
k
?
1
)
]
u(k) = K_p * e(k) + K_i * \sum_{i = 0}^ke(i) + K_d * [e(k) - e(k-1)]
u(k)=Kp??e(k)+Ki??∑i=0k?e(i)+Kd??[e(k)?e(k?1)]
k ―― 采样序号, k =0,1,2,……; u(k) ―― 第 k 次采样时刻的计算机输出值; e(k) ―― 第 k 次采样时刻输入的偏差值; e(k-1) ―― 第 k -1 次采样时刻输入的偏差值;
K
i
K_i
Ki? ――积分系数;
K
d
K_d
Kd? ――微分系数;
算法
C语言算法:
typedef struct
{
float Kp;
float Ki;
float Kd;
float Ek;
float Ek1;
float Ek2;
float LocSum;
}PID_TypeDef;
float PID_Loc(float SetValue, float ActualValue, PID_TypeDef *PID)
{
float PWM;
PID->Ek = SetValue - ActualValue;
PID->LocSum += PID->Ek;
PWM = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd
* (PID->Ek1 - PID->Ek);
PID->Ek1 = PID->Ek;
if(PWM > Servo_max)
{
PWM = Servo_max;
}
else if(PWM < Servo_min)
{
PWM = Servo_min;
}
return PWM;
}
该算法中的反馈值可由陀螺仪所测偏航角提供。
电机 PID
分析
电机一般选用增量式 PID,所谓增量式 PID 是指控制器的输出只是控制量的增量
Δ
u
(
k
)
\Delta u(k)
Δu(k)。当执行机构需要的控制量是增量,而不是位置量的绝对数值时,可以使用增量式 PID 控制算法进行控制。 设
Δ
u
(
k
)
=
u
(
k
)
?
u
(
k
?
1
)
\Delta u(k) = u(k)-u(k-1)
Δu(k)=u(k)?u(k?1)可得增量式 PID :
Δ
u
(
k
)
=
K
p
?
[
e
(
k
)
?
e
(
k
?
1
)
+
K
i
?
e
(
k
)
+
K
d
?
[
e
(
k
)
?
2
?
e
(
k
?
1
)
+
e
(
k
?
2
)
]
]
\Delta u(k)=K_p*[e(k)-e(k-1)+K_i*e(k)+K_d*[e(k)-2*e(k-1)+e(k-2)]]
Δu(k)=Kp??[e(k)?e(k?1)+Ki??e(k)+Kd??[e(k)?2?e(k?1)+e(k?2)]]
增量式PID根据公式可以很好地看出,一旦确定了
K
p
,
K
i
,
K
d
K_p, K_i, K_d
Kp?,Ki?,Kd?,只要使用前后三次测量值的偏差, 即可由公式求出控制增量。 而得出的控制量
Δ
u
(
k
)
\Delta u(k)
Δu(k)对应的是近几次位置误差的增量,而不是对应与实际位置的偏差,没有误差累加。 也就是说,增量式PID中不需要累加。控制增量Δu(k)的确定仅与最近 3 次的采样值有关,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作。 增量式 PID 控制算法与位置式 PID 算法相比,计算量小的多,因此在实际中得到广泛的应用。 而位置式 PID 控制算法也可以通过增量式控制算法推出递推计算公式:
u
(
k
)
=
u
(
k
?
1
)
+
Δ
u
(
k
)
u(k) = u(k-1) + \Delta u(k)
u(k)=u(k?1)+Δu(k) 也就是目前在计算机控制中广泛应用的数字递推 PID 控制算法。
算法
C语言算法:
typedef struct
{
float Kp;
float Ki;
float Kd;
float Ek;
float Ek1;
float Ek2;
float LocSum;
}PID_TypeDef;
float PID_Inc(float SetValue, float ActualValue, PID_TypeDef *PID)
{
float PWM;
PID->Ek = SetValue - ActualValue;
PID->LocSum += PID->Ek;
PWM = PID->Kp * (PID->Ek - PID->Ek1) + PID.Ki * EK +
PID.Kd * (PID.Ek - 2 * PID.Ek1 + PID.Ek2);
PID->Ek2 = PID->Ek1;
PID->Ek1 = PID->Ek;
if(PWM > motor_Max)
{
PWM = motor_Max;
}
else if(PWM < motor_Min)
{
PWM = motor_Min;
}
return PWM;
}
该算法中的实际值可由编码器等传感器提供。
调试口决
参数整定找最佳,从小到大顺序查 先是比例后积分,最后再把微分加 曲线振荡很频繁,比例度盘要放大 曲线漂浮绕大湾,比例度盘往小扳 曲线偏离回复慢,积分时间往下降 曲线波动周期长,积分时间再加长 曲线振荡频率快,先把微分降下来 动差大来波动慢。微分时间应加长 理想曲线两个波,前高后低四比一 一看二调多分析,调节质量不会低 ------------------------------------------------------(摘取自百度百科)
注意事项
-
增量式算法不需要做累加,控制量增量的确定仅与最近几次偏差采样值有关,计算误差对控制 量计算的影响较小。而位置式算法要用到过去偏差的累加值,容易产生较大的累加误差。 -
增量式算法得出的是控制量的增量,只输出变化部分,影响小,必要时还可通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作。而位置式的输出直接对应对象的输出,因此对系统影响较大。 -
增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机,而位置式PID适用于执行机构不带积分部件的对象,如舵机。 -
在进行PID控制时,位置式PID和增量式PID需要输出限幅,不然容易烧毁电机或舵机。
|