你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于增量式PID

[复制链接]
zhangxu56726 提问时间:2018-10-27 18:12 /
在网上找到两种增量式PID 算法的程序,有区别,了解增量式PID 算法的高手,麻烦解释下,对增量的计算不同,都是增量式PID,对控制系统的影响有什么区别?

[color=rgb(51, 51, 51) !important]int IncPIDCalc(int NextPoint)

[color=rgb(51, 51, 51) !important]{

[color=rgb(51, 51, 51) !important]register int iError, iIncpid; //当前误差

[color=rgb(51, 51, 51) !important]iError = sptr-》SetPoint - NextPoint; //增量计算

[color=rgb(51, 51, 51) !important]iIncpid = sptr-》Proportion * iError //E[k]项

[color=rgb(51, 51, 51) !important]- sptr-》Integral * sptr-》LastError //E[k-1]项

[color=rgb(51, 51, 51) !important]+ sptr-》Derivative * sptr-》PrevError; //E[k-2]项

[color=rgb(51, 51, 51) !important]//存储误差,用于下次计算

[color=rgb(51, 51, 51) !important]sptr-》PrevError = sptr-》LastError;

[color=rgb(51, 51, 51) !important]sptr-》LastError = iError;

[color=rgb(51, 51, 51) !important]//返回增量值

[color=rgb(51, 51, 51) !important]return(iIncpid);

[color=rgb(51, 51, 51) !important]}


float PID_realize(float speed)
{
    float incrementSpeed;
    pid.SetSpeed = speed;
    pid.err = pid.SetSpeed - pid.ActualSpeed;
     

    incrementSpeed = pid.Kp * (pid.err -pid.err_last ) + pid.Ki*pid.err + pid.Kd*(pid.err -2* pid.err_last + pid.err_last_next);

    pid.ActualSpeed += incrementSpeed;
    pid.err_last = pid.err;
    pid.err_last_next = pid.err_last;
    return pid.ActualSpeed;
}


收藏 评论9 发布时间:2018-10-27 18:12

举报

9个回答
踏平幼稚园 回答时间:2018-10-29 11:33:15
作用是一样的,第二种是公式得到的pid公式,第一种是基于第二种展开化简得到的;
第二种p、i、d参数定义更符合传统pid控制定义;第二种简化公式后的减少了计算量(同时参数的意义也有所变化);
化简过程:
incrementSpeed = pid.Kp * (pid.err -pid.err_last ) + pid.Ki*pid.err + pid.Kd*(pid.err -2* pid.err_last + pid.err_last_next);
展开:
incrementSpeed =pid.Kp * pid.err - pid.Kp * pid.err_last + pid.Ki * pid.err + pid.Kd * pid.err - 2 * pid.Kd pid.err_last + pid.Kd *pid.err_last_next;
合并:
incrementSpeed =(pid.Kp + pid.Ki + pid.Kd) *pid.err - (pid.Kp + 2 * pid.Kd) * pid.err_last + pid.Kd *pid.err_last_next;
替换:
pid.Kp + pid.Ki + pid.Kd = kp;
pid.Kp + 2 * pid.Kd = ki;
pid.Kd = kd;
结果:
incrementSpeed = kp *pid.err - ki * pid.err_last + kd *pid.err_last_next;
这样就和第一个公式一样了







评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

hejun1203 回答时间:2018-10-28 09:13:38
一代睡神的崛起 回答时间:2018-10-29 08:54:39
表示只用过第二种,第一种没看见过
ff321 回答时间:2018-10-29 11:21:31
第一个是增量式PID吗,看着不像啊
leo121_3006061 回答时间:2018-10-29 12:31:23
楼上解释的非常好,增量式适合用于自平衡小车等,位置式适合温控之类的,现在还有模糊PID控制,也可以了解一下
zhangxu56726 回答时间:2018-10-29 15:23:49
leo121_3006061 发表于 2018-10-29 12:31
楼上解释的非常好,增量式适合用于自平衡小车等,位置式适合温控之类的,现在还有模糊PID控制,也可以了解 ...

你好,我要控制温度,要用位置式的PID?
李长风 回答时间:2018-10-29 16:51:06
踏平幼稚园 发表于 2018-10-29 11:33
作用是一样的,第二种是公式得到的pid公式,第一种是基于第二种展开化简得到的;
第二种p、i、d参数定义更 ...

我突然发现我数学没学好。,好难过
zhangxu56726 回答时间:2018-10-30 16:21:21
leo121_3006061 发表于 2018-10-29 12:31
楼上解释的非常好,增量式适合用于自平衡小车等,位置式适合温控之类的,现在还有模糊PID控制,也可以了解 ...

请问,我要做恒温,看你回的贴是用位置式,请问,怎么将温度的差值转换为PWM的占空比,我这边还有个疑问,就是我这边使用电池供电,加热的过程中电池电压是在下降的,那么怎么处理?谢谢
leo121_3006061 回答时间:2018-11-1 15:06:32
zhangxu56726 发表于 2018-10-30 16:21
请问,我要做恒温,看你回的贴是用位置式,请问,怎么将温度的差值转换为PWM的占空比,我这边还有个疑问 ...

我只是举个例子,实际上增量式也可以用于温控,计算量更小,本身是从位置式演化出来的。有现成的电源管理模块,类似于充电宝那种,价格也不贵。你计算出来的的数值去比pwm的精度,比如8位的就是256(0-255),PID参数的调整需要做实验才能计算出来的,如果只做单一的恒温控制就非常简单了。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版