搜索
bottom↓
回复: 8

飞思卡尔PID车速控制函数问题?

[复制链接]

出0入0汤圆

发表于 2014-5-24 21:13:14 | 显示全部楼层 |阅读模式
我在智能车论坛上看到这样一段PID车速控制函数
typedef struct
{
double dState; // Last position input
double iState; // Integrator state
double iMax, iMin;
// Maximum and minimum allowable integrator state
double        iGain, // integral gain
pGain, // proportional gain
dGain; // derivative gain
} SPid;
double UpdatePID(SPid * pid, double error, double position)
{
double pTerm,
dTerm, iTerm;
pTerm = pid->pGain * error;
// calculate the proportional term
// calculate the integral state with appropriate limiting
pid->iState += error;
if (pid->iState > pid->iMax) pid->iState = pid->iMax;
else if (pid->iState
<
pid->iMin) pid->iState = pid->iMin;
iTerm = pid->iGain * iState; // calculate the integral term
dTerm = pid->dGain * (position - pid->dState);
pid->dState = position;
return pTerm + iTerm - dTerm;
}
有两个问题
1、这个函数采用的是位置式函数,还是增量式
2、double position 这个变量啥作用, 谢谢!

出0入0汤圆

发表于 2014-5-25 00:18:50 | 显示全部楼层
位置式的,你看那误差不是没有记录累加和保存的过程,而是直接返回了么(这一点看P这部分是不是累加的即可快速判断)。

那个Position恕我眼拙,半天没看出来怎么算的微分量(一阶差分)……

出0入0汤圆

发表于 2014-5-25 14:08:28 | 显示全部楼层
这PID还带有死区么?怎么感觉还带有死区功能呢?

出0入0汤圆

 楼主| 发表于 2014-5-25 16:54:47 | 显示全部楼层
alcohol 发表于 2014-5-25 00:18
位置式的,你看那误差不是没有记录累加和保存的过程,而是直接返回了么(这一点看P这部分是不是累加的即可 ...

恩,找你的分析是位置式的,这个公式出自智能车论坛,http://www.znczz.com/thread-684-1-1.html  , 发公式的人找不见了。
1、我最近在看一些PID控制方面的文档;
发现许多文档说,智能车PID最好用增量式的,可我感觉增量式的PID a,b,c 三个系数不仅含义复杂,而且不好调,而位置式的kp ki kd 含义明确。
调某个量的时候,效果立竿见影。   增量式的 a ,b ,c 每个参数都和 kp Ti  Td 相联系,调的时候牵一发而动全身,不知我这样说对不?
2、还有一个疑问就是 采用给电机PWM 波赋值问题
是不是这样的?
增量式的  就  pwm_register=上一次pwm的值(或者某一固定的值)+ PID函数的返回值
位置式的 就  pwm_register=PID函数的返回值;
也就是说 增量式的就是返回一个 △pwm 而 位置式返回的就是要给pwm_register赋的值。            

出0入0汤圆

发表于 2014-5-27 12:31:05 | 显示全部楼层
本帖最后由 alcohol 于 2014-5-27 12:32 编辑

你说的第二点是对的,形式就如你说的,但是可能还有其他的比如 占空比范围限制、非直接占空比输出等形式,但是最简化的是这样的。有了这一点的认识,下面再回来讨论你说的第一点:

第一点主要是从增量式与位置式PID的控制结果上讨论的,比如:前几拍的传感器数据都是对的,但是到了当前一拍,传感器返回数据出错(或算法解算不正确),这就导致当前一拍的控制输出是不对的(如果没有相应约束及预测算法等纠正)。位置式会直接输出一个错误的位置,而增量式输出的是一个错误的差值。这两者的结果是,由于位置为直接输出式,那么在下一拍正确的数据到来前,其误差动作很大,而增量式是在前一拍的控制输出上减去一个错误的误差值(此值往往比位置式的变化值小),输出变化没有位置式大,尽管也有错误动作,但是错误动作比位置式的小,也就是当糟糕的状况来临时,增量式更靠谱一些。

至于你说的那三个a b c,那是方便讨论输出与输入“形式”而提取出来的,如果你仍然采用kp、Ti、Td,那么调节的仍然是含义明确的这三个量,而不是a b c(也就是说,这三个量数学意义明确,但是物理意义不明确)。

出0入0汤圆

 楼主| 发表于 2014-6-4 20:13:18 | 显示全部楼层
本帖最后由 索达客 于 2014-6-4 20:24 编辑


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-6-4 20:23:12 | 显示全部楼层
alcohol 发表于 2014-5-27 12:31
你说的第二点是对的,形式就如你说的,但是可能还有其他的比如 占空比范围限制、非直接占空比输出等形式, ...

谢谢,您的回答解决困扰我很久的问题, 我以后调PID  就调 Kp Ti Td ,然后通过公式转化到各种系数当中。
下面是我写的电机增量式PID 函数,
int16 IncMotorPID()
{
    int16 dev,i;
    int16 value;
    Speed_Now=SpeedGet();
    dev=Speed_Set-Speed_Now;
    for(i=9;i>0;i--)
        DevStore=DevStore[i-1];
    DevStore[0]=dev;      // 滑动存储前10次的偏差值
   value=(int16)(Kp*((DevStore[0]-DevStore[1])+T*DevStore[0]/Ti+Td*(DevStore[0]-2*DevStore[1]+DevStore[2])/T));
   return value;
}
主循环中
    MotorValue+=IncMotorPID();// 增量叠加
    MotorSet(MotorValue); //  电机赋值
         

没加什么逻辑控制,完全按照增量式PID原始式子来的。先学习下最基本的。
  
有些疑问,
1、我的主循环用示波器测试10ms一次,算是控制周期吧, 采样周期也是10ms
请问这里的上面PID函数中 采样周期T 如何取值?  真要按实际的采样周期取值吗 T=0.01

   
2、这样给电机赋值有问题吗?
    MotorValue+=IncMotorPID();// 增量叠加
    MotorSet(MotorValue); //  电机赋值

出0入0汤圆

发表于 2014-6-5 12:10:56 | 显示全部楼层
索达客 发表于 2014-6-4 20:23
谢谢,您的回答解决困扰我很久的问题, 我以后调PID  就调 Kp Ti Td ,然后通过公式转化到各种系数当中。 ...

这两点疑问都是对的。

那个ABC在调差不多或是单片机运算乘除法满,影响速度可以直接设置为ABC而不是K Ki Kp,知道原理即可。

出0入0汤圆

 楼主| 发表于 2014-6-5 13:23:55 | 显示全部楼层
谢谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 05:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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