智能车制作

标题: 我觉得位置式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