找回密码
 立即注册
查看: 162|回复: 6

控速 PID 三个参数 确定流程

[复制链接]
已绑定手机

6

主题

17

回帖

80

积分

注册会员

积分
80
发表于 2026-10-22 11:47:25 | 显示全部楼层 |阅读模式
//=================================== PID计算函数 ===========================================
void        UpdatePID(void)
{
        error = SetPosition - position;                        // 计算误差
        Integral += error;                                                // 计算误差积分
        if(Integral > iMax)        Integral = iMax;        // 积分高限幅
        if(Integral < iMin)        Integral = iMin;        // 积分低限幅
//        if(error >  100.0)        Integral = 0;                // 误差过大不积分, 由误差比例控制, 根据情况可以注销此操作.
//        if(error < -100.0)        Integral = 0;                // 误差过大不积分, 由误差比例控制, 根据情况可以注销此操作.


        pidTerm  = error *    pGain;// / 1000;                // 计算比例项
        pidTerm += Integral * iGain / 1000;                // 计算积分项, 积分项缩小为1/1000,这样积分增益就可以用整数,1对应的就是0.001
        pidTerm -= (position - LastPosition) * dGain / 1000;        // 计算微分项 = 微分增益*(当前位置-前一个位置)
        LastPosition = position;        // 保存当前位置
}


请问 梁工 但是你调试的时候 pid 参数 你是 如何慢慢 定下来的 ?你是 如何调试出来的  这三个参数

回复

使用道具 举报 送花

已绑定手机

307

主题

582

回帖

2957

积分

金牌会员

积分
2957
发表于 2026-10-22 12:41:11 | 显示全部楼层
人家差不多给的,你要自己调
回复

使用道具 举报 送花

83

主题

8317

回帖

1万

积分

超级版主

积分
17932
发表于 2026-10-22 13:43:30 | 显示全部楼层
将目标转速和实时转速数据返回“串口绘图”观察曲线。
1、先调P,设置中速,将I和D的系数设置为0,逐渐增大P,直到实时转速曲线出现震荡,则此时的P系数的一半为初定系数,再设置低速、中速、高速时能稳定,改变负载时也能稳定,有不稳定的,再逐渐缩小P系数直到稳定。
2、设置中速,保持上述P,D为0,逐渐增大I,直到实时转速曲线出现震荡,则此时的I系数的一半为初定系数,再设置低速、中速、高速时能稳定,改变负载时也能稳定,有不稳定的,再逐渐缩小I系数直到稳定。
3、保持上述P、I系数,逐渐增大D,直到实时转速曲线出现震荡,则此时的D系数的一半为初定系数。
然后戈丁不同转速,看其反应曲线,再微调这3个系数,直到稳速迅速,负载改变时响应迅速,过冲小,各种速度都能稳定,即可。
回复

使用道具 举报 送花

已绑定手机

6

主题

17

回帖

80

积分

注册会员

积分
80
 楼主| 发表于 2026-10-22 15:05:19 | 显示全部楼层
梁*** 发表于 2026-10-22 13:43
将目标转速和实时转速数据返回“串口绘图”观察曲线。
1、先调P,设置中速,将I和D的系数设置为0,逐渐增大 ...

非常感谢你的回答  ,太有用了 。 会慢慢按着你的思路去调试,确定出这3个参数。
回复

使用道具 举报 送花

已绑定手机

6

主题

17

回帖

80

积分

注册会员

积分
80
 楼主| 发表于 2026-10-22 17:17:53 | 显示全部楼层
梁*** 发表于 2026-10-22 13:43
将目标转速和实时转速数据返回“串口绘图”观察曲线。
1、先调P,设置中速,将I和D的系数设置为0,逐渐增大 ...

pidTerm -= (position - LastPosition) * dGain / 1000;        // 计算微分项 = 微分增益*(当前位置-前一个位置)
这个是不是写错了? 应该是系数 X(本次误差-上次误差吧)  ,位置式 pid公式 是这样的。

点评

等效的: pre_error = SetPosition - LastPosition; error = SetPosition - position; 则 error - pre_error = (SetPosition - position) - (SetPosition - LastPosition) = LastPosition - position 而 pidTe  详情 回复 发表于 2026-10-22 19:10
回复

使用道具 举报 送花

83

主题

8317

回帖

1万

积分

超级版主

积分
17932
发表于 2026-10-22 19:10:33 | 显示全部楼层
123luo*** 发表于 2026-10-22 17:17
pidTerm -= (position - LastPosition) * dGain / 1000;        // 计算微分项 = 微分增益*(当前位置-前一个位置 ...

等效的:
pre_error = SetPosition - LastPosition;
error = SetPosition - position;
则 error - pre_error = (SetPosition - position) - (SetPosition - LastPosition) = LastPosition - position

而    pidTerm -= (position - LastPosition) * dGain / 1000
等同  pidTerm += (LastPosition - position) * dGain / 1000
而    LastPosition - position = error - pre_error   
回复

使用道具 举报 送花

已绑定手机

6

主题

17

回帖

80

积分

注册会员

积分
80
 楼主| 发表于 2026-10-23 11:48:26 | 显示全部楼层
梁*** 发表于 2026-10-22 19:10
等效的:
pre_error = SetPosition - LastPosition;
error = SetPosition - position;

非常感谢你 梁工。现在我理解了 ,你很多计算都化简了,有好几个地方 靠看你的注释慢慢推导出来的。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 11:00 , Processed in 0.075257 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表