搜索
bottom↓
回复: 15

巡线小车pid算法的实现?真正用的实践中的

[复制链接]

出0入0汤圆

发表于 2010-11-15 13:22:54 | 显示全部楼层 |阅读模式
我们的小车提速行驶时就会很不稳定,目前想运用pid算法,但是看得pid都只是原理,真正在实践中如何运用?第一次做巡线小车,还有很多的不懂,大侠们给点建议吧,非常感谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-11-15 17:16:47 | 显示全部楼层
用不着,把参数调好就没问题

出0入0汤圆

发表于 2010-11-19 18:58:07 | 显示全部楼层
1楼能说清楚点吗,参数是指哪些啊

出0入0汤圆

发表于 2011-1-24 20:29:07 | 显示全部楼层
不懂。。

出0入0汤圆

发表于 2011-1-24 21:22:09 | 显示全部楼层
贴一个我这两天写的离散PID模块吧,已经成功的用于舵机控制。PID是最简单的控制,无法掌握规律的时候用不错。

这个是在ucos里用的,如果裸机跑的话,把FP32换成float。
水平有限,望过路的同学指正。

PID的运作原理是每个控制周期,获取反馈模块提供的当前值,与上级模块提供的目标值进行比较,得到误差值,同时移位更新误差历史。然后output = A*e0 - B*e1 + C*e2就能得到控制输出值。这个控制输出值在不同的上下文中有不同的含义,如果是控制电机,这个控制值可以是转速。
简单的例子就是利用三个位置误差历史,通过运算得到电机的转速,以实现准确定位。

具体的解释这里有一篇论文。
点击此处下载 ourdev_613203OBSZGV.pdf(文件大小:1.30M) (原文件名:基于增量式PID控制实现高精度跟踪机构设计研究.pdf)

头文件:

#ifndef DISCRETE_PID_H_
#define DISCRETE_PID_H_
#include "includes.h"

/*Data Structure*/
typedef struct pid_parameterpack
{
        FP32 fKp;
        FP32 fKi;
        FP32 fKd;
}PID_PP;

typedef struct pid_runtimepack
{
        FP32 fA;
        FP32 fB;
        FP32 fC;
        FP32 fError[3];
}PID_RP;

typedef struct pid_module
{
        PID_PP cPP;
        PID_RP cRP;
}PID_MODULE;

void PID_Reset(PID_MODULE *pPID,FP32 fTargetVal, FP32 fCurrentVal);
FP32 PID_CalculateControlOutput(PID_MODULE *pPID,FP32 fTargetVal, FP32 fCurrentVal);
#endif /* DISCRETE_PID_H_ */

源文件:
void PID_Reset(PID_MODULE *pPID,FP32 fTargetVal, FP32 fCurrentVal)
{
        //calculate factors
        pPID->cRP.fA = pPID->cPP.fKp + pPID->cPP.fKi +  pPID->cPP.fKd;
        pPID->cRP.fB = pPID->cPP.fKp + 2*pPID->cPP.fKd;
        pPID->cRP.fC = pPID->cPP.fKd;

        //set 3 errors to current error
        pPID->cRP.fError[0] = fCurrentVal - fTargetVal;
        pPID->cRP.fError[1] = pPID->cRP.fError[0];
        pPID->cRP.fError[2] = pPID->cRP.fError[0];
}

FP32 PID_CalculateControlOutput(PID_MODULE *pPID,FP32 fTargetVal, FP32 fCurrentVal)
{
        FP32 fPIDVal;
        //update errors 0->1->2
        pPID->cRP.fError[2] = pPID->cRP.fError[1];
        pPID->cRP.fError[1] = pPID->cRP.fError[0];
        pPID->cRP.fError[0] = fCurrentVal - fTargetVal;

        //calculate pid value
        fPIDVal = pPID->cRP.fError[0] * pPID->cRP.fA
                        - pPID->cRP.fError[1] * pPID->cRP.fB
                        + pPID->cRP.fError[2] * pPID->cRP.fC;

        return (fPIDVal);
}

出0入0汤圆

发表于 2011-1-24 21:41:50 | 显示全部楼层
MARK。。。。。。。。
一定要顶楼上的。。。。
之前做过小车。。。没用PID车子跑得乱七八糟。。。

出0入0汤圆

发表于 2011-1-24 22:10:46 | 显示全部楼层
翻翻别人的论文吧。智能车论坛上有好多。

出0入0汤圆

发表于 2011-1-24 22:28:28 | 显示全部楼层
手机mark

出0入0汤圆

发表于 2012-11-15 23:53:36 | 显示全部楼层
我顶一个

出0入0汤圆

发表于 2012-11-16 12:24:58 | 显示全部楼层
very good !
但是, 没用 PID 真的就不行吗? 我很怀疑.

出0入0汤圆

发表于 2012-12-1 17:11:43 | 显示全部楼层
顶一下了

出0入0汤圆

发表于 2012-12-2 13:49:16 | 显示全部楼层
没用pid的  也不会的  飘过

出0入0汤圆

发表于 2012-12-2 14:47:45 | 显示全部楼层
syuanwang 发表于 2011-1-24 21:22
贴一个我这两天写的离散PID模块吧,已经成功的用于舵机控制。PID是最简单的控制,无法掌握规律的时候用不错 ...

学习下!

出0入0汤圆

发表于 2012-12-2 19:55:41 | 显示全部楼层
好东西 学习下

出0入0汤圆

发表于 2014-10-17 13:01:21 | 显示全部楼层
hclin 发表于 2012-11-16 12:24
very good !
但是, 没用 PID 真的就不行吗? 我很怀疑.

没用PID也可以!算法什么的都是用来解决问题的。只是算法比我们自己的更加精炼,毕竟是好多人好多年搞的,验证的东西

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 17:17

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

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