打印

春阳老师,PID到底该怎么表达啊. 看了您的回复说很复杂

[复制链接]
3907|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xusnwise|  楼主 | 2010-11-29 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pid, ST, ui, tv, TE
本帖最后由 xusnwise 于 2010-11-29 16:56 编辑

春阳老师,PID到底该怎么表达啊。
我做的PID也是就一句代码啊
我也贴上来大家拍我, 很拍,我的就一句话。 看来我还不懂PID
typedef        struct
{
        int kp;  
        int ki;
        int kd;
        int      errV;
        int      curV;
        int      errLast;        
        uint32_t PIDMax;
        uint32_t PIDMin;
} Motor_PID;

Motor_PID  v_pid;

uint32_t        Calc_PIDOut(void)
{
        int        pid_out;        
        
        errV += SetV - v_pid.curV;

        pid_out  = v_pid.kp*(SetV - v_pid.curV) + v_pid.ki*errV+\
                                  v_pid.kd*(v_pid.errV-v_pid.errLast);

        v_pid.errLast  = v_pid.errV;
   
               return  pid_out
}

到底什么才是真正的PID呢

相关帖子

沙发
xusnwise|  楼主 | 2010-11-29 16:31 | 只看该作者
我用PID来调单相交流异步电机的。
我把PID的计算结果对应到可控硅的导通时间上去了, 目前能控制转速
但感觉速度不很稳定。 目前调节范围30--1200转。

使用特权

评论回复
板凳
huangbb| | 2010-11-29 16:35 | 只看该作者
这个不是PID,看你的表达式,当v_pid.curV=SetV时,输出pid_out=0,系统肯定出问题的。

使用特权

评论回复
地板
xusnwise|  楼主 | 2010-11-29 16:51 | 只看该作者
剪贴的代码,少拷贝了一句
现在改过了

使用特权

评论回复
5
Siderlee| | 2010-11-29 17:03 | 只看该作者
模拟的我会

写成程序没有做过

要写成差分方程的

s-z-差分方程

使用特权

评论回复
6
yinchunhua| | 2010-11-29 17:30 | 只看该作者
怎么不是PID了?PID不要说的这么玄乎,其实主要是PID的P,I,D这3个参数需要实践,不断调试整定,才能得到好的响应曲线。PID也有好多改进的算法,当然还需要考虑计算量。如果你的程序是运算在单片机上,则注意变量的减法是否会超出范围(如果你用的是无符号变量的话).

使用特权

评论回复
7
hdp7891000| | 2010-11-29 18:28 | 只看该作者
同意楼上,pid的代码本来就很简单,主要是调节参数过程

使用特权

评论回复
8
chunyang| | 2010-11-29 18:57 | 只看该作者
PID再简单也不是几条语句就搞定的,建议去看看大学教材《自控原理》,这实在不是小篇幅**可以描述的,非自控专业都是一学期的重头课。

使用特权

评论回复
9
chunyang| | 2010-11-29 19:00 | 只看该作者
先不管你的表达式对不对,如此计算式:
pid_out  = v_pid.kp*(SetV - v_pid.curV) + v_pid.ki*errV+\v_pid.kd*(v_pid.errV-v_pid.errLast)即使在数学上正确,也不能在MCU上得到正确的结果,即使使用32位MCU也不行,更何况普通的8位机,一点计算精度都不会有。

使用特权

评论回复
10
hengttt| | 2010-11-29 20:35 | 只看该作者
是啊

使用特权

评论回复
11
hengttt| | 2010-11-29 20:35 | 只看该作者
同意楼上,pid的代码本来就很简单,主要是调节参数过程

使用特权

评论回复
12
程序匠人| | 2010-11-29 21:27 | 只看该作者
PID,难在参数整定

使用特权

评论回复
13
zeadoit| | 2010-11-29 21:33 | 只看该作者
某自动化专业学生路过,现在刚好在学PID,计算精度的确是一个问题

使用特权

评论回复
14
xusnwise|  楼主 | 2010-11-29 21:34 | 只看该作者
说明下,
我用的MCU是 新唐的 cortex-m0, 工作在50MHZ
所有的参数都用的整数, 计算前都放大8倍计算,得到的输出结果再右
移3位相当除以8。
大概就这个样子

使用特权

评论回复
15
yewuyi| | 2010-11-29 22:11 | 只看该作者
基本算法,做工程不能如此简单。

使用特权

评论回复
16
huangbb| | 2010-11-30 08:25 | 只看该作者
即使先计算精度问题,但是表达式错误,建议楼主看看pid的差分表达形式,就说积分吧,应该是累计和形式而不能简单的用偏差×系数的形式。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

294

帖子

0

粉丝