打印

PID_GR_MACRO(v) pid算法求助

[复制链接]
1749|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangrunpeng|  楼主 | 2016-4-6 14:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define PID_GR_MACRO(v)                                                                                                                                                                \
                                                                                                                                                                                                        \
        /* proportional term */                                                                                                                                                 \
        v.data.up = _IQmpy(v.param.Kr, v.term.Ref) - v.term.Fbk;                                                                                \
                                                                                                                                                                                                        \
        /* integral term */                                                                                                                                                         \
        v.data.ui = _IQmpy(v.param.Ki, _IQmpy(v.data.w1, (v.term.Ref - v.term.Fbk))) + v.data.i1;        \
        v.data.i1 = v.data.ui;                                                                                                                                                        \
                                                                                                                                                                                                        \
        /* derivative term */                                                                                                                                                         \
        v.data.d2 = _IQmpy(v.param.Kd, _IQmpy(v.term.c1, (_IQmpy(v.term.Ref, v.param.Km) - v.term.Fbk))) - v.data.d2;        \
        v.data.ud = v.data.d2 + v.data.d1;                                                                                                                                \
        v.data.d1 = _IQmpy(v.data.ud, v.term.c2);                                                                                                                \
                                                                                                                                                                                                        \
        /* control output */                                                                                                                                                         \
        v.data.v1 = _IQmpy(v.param.Kp, (v.data.up + v.data.ui + v.data.ud));                                                        \
        v.term.Out= _IQsat(v.data.v1, v.param.Umax, v.param.Umin);                                                                        \
        v.data.w1 = (v.term.Out == v.data.v1) ? _IQ(1.0) : _IQ(0.0);                                                                        \
       
#endif // __PID_GRANDO_H__
我想知道PID算法是对两个参数的差值进行计算,那么输出与输入的关系是什么那,在做速度闭环时候,PID输出为什么直接就决定了pwm占空比,输出是不是应该逐渐逼近PID设定的目标值

相关帖子

沙发
zhangmangui| | 2016-4-6 22:58 | 只看该作者
应该是增量吧   计算的结果加到当前值上

使用特权

评论回复
板凳
edishen| | 2016-4-6 23:23 | 只看该作者
应该是增量式PID

使用特权

评论回复
地板
edishen| | 2016-4-6 23:24 | 只看该作者
PID调节经验总结(搜索资源)
    PID控制器参数选择的方法很多,例如试凑法、临界比例度法、扩充临界比例度法等。但是,对于PID控制而言,参数的选择始终是一件非常烦杂的工作,需要经过不断的调整才能得到较为满意的控制效果。依据经验,一般PID参数确定的步骤如下:
(1)确定比例系数Kp
    确定比例系数Kp时,首先去掉PID的积分项和微分项,可以令Ti=0、Td=0,使之成为纯比例调节。输入设定为系统允许输出最大值的60%~70%,比例系数Kp由0开始逐渐增大,直至系统出现振荡;再反过来,从此时的比例系数Kp逐渐减小,直至系统振荡消失。记录此时的比例系数Kp,设定PID的比例系数Kp为当前值的60%~70%。
(2)确定积分时间常数Ti
    比例系数Kp确定之后,设定一个较大的积分时间常数Ti,然后逐渐减小Ti,直至系统出现振荡,然后再反过来,逐渐增大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的 150%~180%。
(3)确定微分时间常数Td
    微分时间常数Td一般不用设定,为0即可,此时PID调节转换为PI调节。如果需要设定,则与确定Kp的方法相同,取不振荡时其值的30%。
(4)系统空载、带载联调
    对PID参数进行微调,直到满足性能要求。

    程序是自己编的,根据多方资料改写了一部分,为增量式PID算法。程序采用浮点形式,如果MCU速度不够快,可根据需求转换定点运算。
    关键变量:ref——设置的参数;feb——采样反馈;根据实际情况修改这两个变量即可。
    相关参数:Kp、Ti、Td、T:根据各项目的控制对象不同而修改其定义值。

使用特权

评论回复
5
wangrunpeng|  楼主 | 2016-4-10 20:21 | 只看该作者
zhangmangui 发表于 2016-4-6 22:58
应该是增量吧   计算的结果加到当前值上

关键是增量式pid,他的输出为什么直接就给到pwm占空比,我感觉是不死应该加上原来的占空比。因为他只是一个增量,如果他是位置式pid就不用加上原来的值吗,就可以直接给定到占空比?

使用特权

评论回复
6
wangrunpeng|  楼主 | 2016-4-10 20:22 | 只看该作者
edishen 发表于 2016-4-6 23:23
应该是增量式PID

关键是增量式pid,他的输出为什么直接就给到pwm占空比,我感觉是不死应该加上原来的占空比。因为他只是一个增量,如果他是位置式pid就不用加上原来的值吗,就可以直接给定到占空比?

使用特权

评论回复
7
wangrunpeng|  楼主 | 2016-4-10 20:24 | 只看该作者
zhangmangui 发表于 2016-4-6 22:58
应该是增量吧   计算的结果加到当前值上

程序如下pwm1.DutyFunc = (int16)_IQtoQ15(pid1_spd.term.Out)  pwm1.DutyFunc 是pwm占空比。
他输出直接给定到pwm占空比,并没有加上原来的值,如果他是位置式是不是可以拿

使用特权

评论回复
8
wangrunpeng|  楼主 | 2016-4-10 21:18 | 只看该作者
zhangmangui 发表于 2016-4-6 22:58
应该是增量吧   计算的结果加到当前值上

v.data.ui = _IQmpy(v.param.Ki, _IQmpy(v.data.w1, (v.term.Ref - v.term.Fbk))) + v.data.i1;        \
         v.data.i1 = v.data.ui;   这段程序是位置式pid公式吧  相当于对差值的不断积累呀

使用特权

评论回复
9
chuntian2016| | 2016-4-12 12:19 | 只看该作者
这个需要根据PID算法的公式分析分解的,然后采用语言写出来的。

使用特权

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

本版积分规则

11

主题

40

帖子

0

粉丝