智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3939|回复: 7
打印 上一主题 下一主题

[软件类] 急!!!!PID控制算法改进

[复制链接]

0

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
127
威望
175
贡献
22
兑换币
0
注册时间
2009-5-7
在线时间
0 小时
跳转到指定楼层
1#
发表于 2009-5-7 23:17:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2贡献
本帖最后由 whut_wj 于 2009-5-9 08:49 编辑

把下面的PID算法改成积分分离PID或者PID增量式算法  我查资料 理论上看懂了 可是不知道怎么加到程序上  下面的程序是对了 请大家帮帮忙  谢谢


#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#include "PWM.h"
#include "Bang.h"
#include "video.h"
#include "Image_process.h"



#define  Kp   3
#define  Kd   0
#define  Speed_base 90  //////////////////////////////////////////////////////
// #define  Speed_min 50
#define  Angle_max 30
#define  T_ks  3
#define  Ksc    5
#define  Ksd    6
#define  Kss    7
// #define  Line_Max  50
// #define  Line_Min  10
unsigned char Line_Max,Speed_up,Speed_min,Speed_s;
signed char K_line,U=0; //中间变量
signed char Out_angle,Out_speed;            //输出量
signed char K_line0=0;
signed char K_line1=0;
signed int  Out_ang0=39,Out_ang;
unsigned char Line_middle=39,Y_X_max,Y_X_min,Y_max,Counter=T_ks,D=0,S=0,C=0;
unsigned char Ks=5,Flag=0,M,N;
unsigned char Now_line ;

//*****************************************************************************************
void Out_sp_ang(unsigned char Imagepoint[])
{
unsigned char i,j=0,X_max=0,X_min=255;
signed int  u;


if(Error==0)

  {
     Image_process(&Imagepoint[0]);

   for(i=FirstLine;i<57;i++)
     {
      if(Imagepoint==255)
      break;
     }
Y_max=i-1;

if(Y_max>9)
{  
if(Now_Speed<=Speed_min-10)
    Now_line=Line_Max+10;
else
    Now_line=Line_Max+(Now_Speed-Speed_min)/3;
if(Imagepoint[Now_line]<128)  //第Now_line行有黑点(若第i行无黑点,则Imagepoint=255)
       K_line=Imagepoint[Now_line]-Line_middle;
else
   {
    for(i=10;i<Now_line;i++)
        {    if(Imagepoint<128&&Imagepoint[i+1]==255)     //第i行有黑点
             {
              K_line=(Imagepoint-Line_middle)*Now_line/i;
              break;
             }
             else j=1;           
         }
   }  


/////////////////////////////////////速度////////////////////////////////////   
if(Track==0)
{ Ks=Ksd;
   if(Out_speed>Speed_base+Speed_up)
   Out_speed-=10;
  if(Out_speed<Speed_base+Speed_up)
   Out_speed+=10;

//    if(Out_speed<Speed_base+Speed_up)
//      Out_speed+=20;
//   if(Out_speed>Speed_base+Speed_up)
//      Out_speed=Speed_base+Speed_up;
//   
//    Out_angle=K_line*Kp/Ks;
  }
if(Track==1)
  {Ks=Kss;
  if(Out_speed>Speed_s)
   Out_speed-=10;
  if(Out_speed<Speed_s)
   Out_speed+=10;
  
//  Out_angle=K_line*Kp/Ks;
  }
if(Track==2)
  { Ks=Ksc;
     if(K_line>0)
      {   u=Out_angle ;
        if(Out_speed>Speed_base+Speed_up-(unsigned char)u*u/80)
           Out_speed-=10;
        else Out_speed+=6;
        
//        if(Now_Speed>60)
//        Out_angle=K_line*Kp/Ks+(Now_Speed-60)/3;
//                else Out_angle=K_line*Kp/Ks ;
        
        
//        else
//           Out_speed=Speed_base-K_line;
      }
      
      
    else
      {   u=-Out_angle ;
        if(Out_speed>Speed_base+Speed_up-(unsigned char)u*u/80)
           Out_speed-=10;
        else Out_speed+=6;
//        if(Now_Speed>60)
//        Out_angle=K_line*Kp/Ks+(Now_Speed-Speed_min-1)/15;
//        else Out_angle=K_line*Kp/Ks ;
//        else
//           Out_speed=Speed_base+K_line;
      }
      
  }
   
   
        
/////////////////////////////////////////舵机///////////////////////////////////               
       Out_angle=K_line*Kp/Ks;     
//    {
//     Out_angle=K_line*Kp/Ks+Kd*(K_line+K_line1-2*K_line0);      
//     K_line1=K_line0;
//     K_line0=K_line ;
//    }
}
if(Y_max>32&&Y_max<40)
{
  
  if(C<T_ks)
      C++;
  else C=T_ks;
  D=0;
}
else if(Y_max>40&&Y_max<54)
{
  
  if(D<T_ks)
      D++;
  else D=T_ks;
  C=0;
}
else{C=0;D=0;}

         if(C==T_ks)
         {
         
         if(Out_speed<Speed_base+Speed_up-10)
          Out_speed+=6;
         else Out_speed-=5;
         }
         
         if(D==T_ks)
         {
         
         if(Out_speed<Speed_base+Speed_up)
          Out_speed+=6;
         else Out_speed-=5;
         }
        


if(j==1)
{ if(Out_speed>Speed_min)
            Out_speed-=12;
         else
            Out_speed=Speed_min;
         if(Out_angle>0)
            Out_angle+=2;
         if(Out_angle<=0)
            Out_angle-=2;
      
}
  
///////////////////////////////////////出错////////////////////////////////////     
}
else   
{ if(Out_speed>Speed_min)
            Out_speed-=12;
         else
            Out_speed=Speed_min;
         
         if(Out_angle>0)
            Out_angle+=2;
         if(Out_angle<=0)
            Out_angle-=2;
}

//  PORTB=~Out_speed;


if(Now_Speed>Flag)
     Flag=Now_Speed ;
// PORTB=~Out_angle ;
//PORTB=~Track;
PORTB=~Y_max ;
//PORTB=~(Error*0xff);
}

0

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
925
QQ
威望
451
贡献
382
兑换币
0
注册时间
2008-11-28
在线时间
46 小时
2#
发表于 2009-5-8 08:02:15 | 只看该作者
积分分离没有用,它主要是用在大惯性系统中的,智能车不需要哦
回复

使用道具 举报

14

主题

929

帖子

1

精华

功勋会员

WJ

Rank: 10Rank: 10Rank: 10

积分
6304

特殊贡献奖章

威望
1456
贡献
4674
兑换币
17
注册时间
2008-4-6
在线时间
87 小时
3#
发表于 2009-5-8 10:05:42 | 只看该作者
程序有点乱,看晕了.任何程序要从最简单的开始,
PID,你用P先试试,不要搞得太复杂.
回复

使用道具 举报

0

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
127
威望
175
贡献
22
兑换币
0
注册时间
2009-5-7
在线时间
0 小时
4#
 楼主| 发表于 2009-5-9 00:13:52 | 只看该作者
2# 星空下的学生

恩  谢谢 那其他类型的PID算法呢?!那个比较合适智能车?因为 我还要再用一种另外的PID算法 谢谢
回复

使用道具 举报

9

主题

358

帖子

42

精华

金牌会员

Rank: 6Rank: 6

积分
1296
威望
80
贡献
506
兑换币
206
注册时间
2008-9-18
在线时间
355 小时
5#
发表于 2009-5-11 10:48:38 | 只看该作者
回复

使用道具 举报

0

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
威望
189
贡献
22
兑换币
0
注册时间
2009-2-21
在线时间
30 小时
6#
发表于 2009-6-16 20:06:46 | 只看该作者
程序太长了
回复

使用道具 举报

0

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
威望
228
贡献
31
兑换币
4
注册时间
2010-2-24
在线时间
7 小时
7#
发表于 2010-3-16 16:43:12 | 只看该作者
有点长了,呵呵
回复

使用道具 举报

6

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
397
QQ
威望
305
贡献
40
兑换币
0
注册时间
2010-3-13
在线时间
26 小时
8#
发表于 2010-3-16 17:15:57 | 只看该作者
没注释不好看
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 11:14 , Processed in 0.222312 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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