智能车制作

 找回密码
 注册

扫一扫,访问微社区

楼主: Quixote
打印 上一主题 下一主题

【代码】发个PID的代码

    [复制链接]

4

主题

45

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1441
威望
729
贡献
448
兑换币
466
注册时间
2013-10-12
在线时间
132 小时
毕业学校
安徽工程大学
1#
发表于 2014-12-13 22:45:31 | 显示全部楼层
本帖最后由 慎独 于 2014-12-13 22:47 编辑

#include <stdio.h>
#include <math.h>
struct PID
{
        float        SetSpeed;
        float        ActualSpeed;
        float        err;
        float        err_last;
        float        Kp,Ki,Kd;
        float        voltage;
        float        integral;
        float         umax;
        float        umin;
}pid;
void PID_init()
{
        printf("PID_init begin \n");
        pid.SetSpeed=0.0;
        pid.ActualSpeed=0.0;
        pid.err=0.0;
        pid.err_last=0.0;
        pid.voltage=0.0;
        pid.integral=0.0;
        pid.Kp=0.2;
        pid.Ki=0.1;
        pid.Kd=0.2;
        pid.umax=400;
        pid.umin=-200;
        printf("PID_init end \n");
}
float PID_realize(float speed)
{
        int index;
        pid.SetSpeed=speed;
        pid.err=pid.SetSpeed-pid.ActualSpeed;
        if(pid.ActualSpeed>pid.umax)//抗积分饱和     
        {
                if(fabs(pid.err)>200)        //积分分离过程         
                        index=0;
                else
                {
                        index=1;
                        if(pid.err<0)
                                pid.integral+=pid.err;
                }
        }
        else if(pid.ActualSpeed<pid.umin)
        {
                if(fabs(pid.err)>200)        //积分分离过程         
                        index=0;
                else if(fabs(pid.err)<180)
                {
                        index=1;
                        if(pid.err>0)
                                pid.integral+=pid.err;
                }
                else
                {
                        index=(int)(200-fabs(pid.err))/20;
                        if(pid.err>0)
                                pid.integral+=pid.err;
                }
        }
        else
        {
                if(fabs(pid.err)>200)//积分分离过程         
                        index=0;
                else
                {
                        index=1;
                        if(pid.err>0)
                                pid.integral+=pid.err;
                }
        }
        pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral/2+pid.Kd*(pid.err-pid.err_last);
        pid.err_last=pid.err;
        pid.ActualSpeed=pid.voltage*1.0;
        return pid.ActualSpeed;
}以前自己写的PID,感觉还行,在大神面前献丑一番

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

4

主题

45

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1441
威望
729
贡献
448
兑换币
466
注册时间
2013-10-12
在线时间
132 小时
毕业学校
安徽工程大学
2#
发表于 2014-12-13 22:53:49 | 显示全部楼层
Quixote 发表于 2014-12-13 22:51
PID这种看调试

这话讲的还真对,但算法的好坏是能起到一定的弥补作用的
回复 支持 反对

使用道具 举报

4

主题

45

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1441
威望
729
贡献
448
兑换币
466
注册时间
2013-10-12
在线时间
132 小时
毕业学校
安徽工程大学
3#
发表于 2014-12-14 09:55:44 | 显示全部楼层
Quixote 发表于 2014-12-13 23:34
你是指控制器的传递函数?

不,我指的是对传统PID的改进,譬如梯形积分PID,带死区PID,微分现行PID等
回复 支持 反对

使用道具 举报

4

主题

45

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1441
威望
729
贡献
448
兑换币
466
注册时间
2013-10-12
在线时间
132 小时
毕业学校
安徽工程大学
4#
发表于 2014-12-14 18:23:22 | 显示全部楼层
Quixote 发表于 2014-12-14 11:19
那些也只是改变传递函数的结构而已啦。真正用的时候都是随便用的。

不,这些PID是能够在一定范围内降低超调量和减少过渡时间的,这个我试过
回复 支持 反对

使用道具 举报

4

主题

45

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1441
威望
729
贡献
448
兑换币
466
注册时间
2013-10-12
在线时间
132 小时
毕业学校
安徽工程大学
5#
发表于 2014-12-19 22:13:33 | 显示全部楼层
Quixote 发表于 2014-12-15 10:58
这些都很基础,只是非线性地用一些东西。

这些PID在跟随性上的改进,使得PID才能在各种恶劣条件下使用,以及后续的模糊PID,自适应PID的出现也是基于改进PID的思路,很多时候经典PID已经不再使用,仅仅作为例子来说明PID的思想。具体到小车上,PID无非用于速度闭环和循迹控制。速度闭环,确实经典PID足够了,改进PID想用的也不能说不行;而在循迹控制中,舵机控制中优良的跟随性是能够减少很多无谓路程的,对于提升成绩而言,是有帮助的,而算法的跟随性在飞思卡尔智能车比赛中对舵机控制跟随性的地位无意是很重要的,除了正确的判线外,就数算法了。
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-20 03:22 , Processed in 0.041198 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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