智能车制作
标题: 我觉得位置式PI和增量式PI都会有积分饱和现象,很多资料上说:增量式不会出现积 [打印本页]
作者: 卧听南窗雨 时间: 2013-11-3 22:05
标题: 我觉得位置式PI和增量式PI都会有积分饱和现象,很多资料上说:增量式不会出现积
本帖最后由 卧听南窗雨 于 2013-11-3 22:08 编辑
void speed(void) //每50ms 调用一次 位置式PI
{
e=Speed_Target-Speed; // 求e(k)
fP = e * Kp;
fI = e * Ki;
g_fSpeedControlIntegral += fI; //积分累加
SPWMnew = fP + g_fSpeedControlIntegral; //求出当前的控制量
}
void speed(void) //每50ms 调用一次 增量式PID
{
e=Speed_Target-Speed; // 求e(k)
de=e-last_e; // 求e(k)-e(k-1)
dde=de-last_de; // 求e(k)-2e(k-1)+e(k-2)
last_e=e; // 把e(k)保存为e(k-1)供下次计算使用
last_de=de; // 把e(k)-e(k-1)保存为e(k-1)-e(k-2)
dPWM=Kp*de+Ki*e+Kd*dde; // 根据公式求出PWM份数需要改变量
SPWMnew+=dPWM; // 由公式求出当前PWM份数并输出
}
红色字体部分显示两种算法都有积分累加项呀,只是在程序不同的部位累加的,但是最终的累加效果应该是一样吧。难道是我理解错了?求大神指导呀
作者: rubick 时间: 2013-11-3 22:25
积分项是将控制量的积分和目标的积分比较,其差值乘以I系数。
所以你可以只保存这个差值。
而这个差值是在零附近的。
作者: 卧听南窗雨 时间: 2013-11-3 22:42
rubick 发表于 2013-11-3 22:25
积分项是将控制量的积分和目标的积分比较,其差值乘以I系数。
所以你可以只保存这个差值。
而这个差值是在 ...
积分项是将控制量的积分和目标的积分比较,其差值乘以I系数。
这句话不太理解呀,积分项不是对以前所有的目标值与实际值的差求和吗?
作者: Jyoun 时间: 2013-11-3 23:49
其实增量式计算时基本把积分项减掉了,所以积分项只在0附近,甚至直接忽略处理成0。
作者: rubick 时间: 2013-11-4 00:05
卧听南窗雨 发表于 2013-11-3 22:42
积分项是将控制量的积分和目标的积分比较,其差值乘以I系数。
这句话不太理解呀,积分项不是对以前所有 ...
对,一样的。系统的稳定性保证这个值是接近零的。所以不会饱和。
否则系统就不稳定了。
也就是说只要平衡车不倒,这一项总是接近零的。
作者: 东京蓝调° 时间: 2013-11-4 00:14
作者: 林JJ 时间: 2013-11-4 11:06
我才Ki应该很小吧
作者: nxdliuquan 时间: 2013-11-4 19:00
楼主觉得哪个更好?
作者: 卧听南窗雨 时间: 2013-11-4 19:12
nxdliuquan 发表于 2013-11-4 19:00
楼主觉得哪个更好?
本人很菜,觉得还是先用官方的比较稳妥
作者: 卧听南窗雨 时间: 2013-11-4 19:14
Jyoun 发表于 2013-11-3 23:49
其实增量式计算时基本把积分项减掉了,所以积分项只在0附近,甚至直接忽略处理成0。
从什么地方能够体现积分项基本被减掉了呢?
作者: 柒年ヾ追梦 时间: 2013-11-4 19:56
ki应该是很小的
作者: Jyoun 时间: 2013-11-4 20:01
卧听南窗雨 发表于 2013-11-4 19:14
从什么地方能够体现积分项基本被减掉了呢?
增量式是相邻两次位置式相减的结果,因为相邻两次位置式的积分项很接近,减掉之后就很小了。
作者: 辛少 时间: 2013-11-4 22:13
last_de=de; // 把e(k)-e(k-1)保存为e(k-1)-e(k-2)
这句话不对吧, last_de是ek-2, last_de=last-e吧
作者: 辛少 时间: 2013-11-4 22:22
ek2=ek1;
ek1=ek;
Kp*(ek-ek1)+Kd*(ek-2*ek1+ek2)+Ki*ek
欢迎光临 智能车制作 (http://111.231.132.190/) |
Powered by Discuz! X3.2 |