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

关于增量式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
表示只用过第二种,第一种没看见过
FF_胖子 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版