智能车制作

标题: PID [打印本页]

作者: 龙游天下明    时间: 2012-3-28 18:29
标题: PID
请问以下PID程序哪出错了,我找不出。
#include <hidef.h>
#include<  MATH.H>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
float Kp;             //PID 调节的比例常数
float Ti;             //PID 调节的积分常数
float T;              //采样周期
float Td;             //PID 调节的微分时间常数
float a1;
float a2;
float a3;
float ek=0;             //偏差 e[k]
float ek1=0;             //偏差 e[k-1]
float ek2=0;             //偏差 e[k-2]
float uk;             //u[k]
float uk1;             //对 uk 四舍五入求整
int adjust;           //最终输出的调整量
int t2=0;
float gabs(float t)
{
      if(t<0)
      {
      t=0-t;
      }
      return t;
}
  
int pid(int t1)  //增量式pid   
{           
     a1=Kp*(1+T/Ti+Td/T);
     a1=-Kp*(1+2*Td/T);
     a2=Kp*Td/T;
       // Ki=KpT/Ti=0.8,微分系数 Kd=KpTd/T=0.8,Td=0.0002,根据实验调得的结果确定这些参数
     ek=t1-t2;
     t2=t1;
                 
     if(gabs(ek)>=0&&gabs(ek)<=1) //误差的阀值左右水平传感器小于一定值不做 PID 调整,避免误差较小时频繁调节引起震荡。ee 的值可自己设
     {
         adjust=0;
     }  
                  
     else  if(gabs(ek)>=2&&gabs(ek)<=5)
     {        
                                   
         Kp=0.4;         
         Ti=0.1;            
         T=0.2;              
         Td=1;                  
     }
     else
     {        
        Kp=0.8;         
        Ti=0.9;            
        T=0.5;              
        Td=0.1;
     }
     uk=a1*ek+a1*ek1+a2*ek2;
     ek2=ek1;
     ek1=ek;
     uk1=(int)uk;
     if(uk>0)
     {
        if(uk-uk1>=0.5)
        {
           uk1=uk1+1;
        }
      }
     else  if(uk<0)
     {
         if(uk1-uk>=0.5)
         {
            uk1=uk1-1;
         }
      }
      
     adjust=uk1;         
                                    
    return adjust;   
}

作者: klain    时间: 2012-3-28 20:38
提示什么错误?
作者: klain    时间: 2012-3-28 21:04
想请教一个问题,  如果采样周期是固定的,那例如直接调积分参数KI跟调积分时间TI  有什么区别吗?  是调整上方便?  
作者: 龙游天下明    时间: 2012-3-29 21:25
klain 发表于 2012-3-28 20:38
提示什么错误?

提示错误如下(截图):
在附件里。
                                                            

作者: 龙游天下明    时间: 2012-3-29 21:29
klain 发表于 2012-3-28 21:04
想请教一个问题,  如果采样周期是固定的,那例如直接调积分参数KI跟调积分时间TI  有什么区别吗?  是调整 ...

我个人觉得没什么区别,但是KI和采样周期T也有关,调节TI应该更好点吧!
作者: klain    时间: 2012-3-30 21:56
龙游天下明 发表于 2012-3-29 21:29
我个人觉得没什么区别,但是KI和采样周期T也有关,调节TI应该更好点吧!

一般采样周期是固定的,光编码都是测上一周期电机的速度的~~  你们有变换周期采样么?  要是采样周期固定,直接调参数,不调时间,应该更直接一点~~对了,想问一下,你们怎么调节参数的?“微分系数 Kd=KpTd/T=0.8,Td=0.0002,根据实验调得的结果确定这些参数 ”    可以给点意见么···

作者: klain    时间: 2012-3-30 22:06
你把float改成double试试~~  
作者: 龙游天下明    时间: 2012-3-30 22:17
klain 发表于 2012-3-30 21:56
一般采样周期是固定的,光编码都是测上一周期电机的速度的~~  你们有变换周期采样么?  要是采样周期固定 ...

我们采样周期不变,不过调参我也不懂,这也是请教别人的,现在不在实验室了。
作者: 龙游天下明    时间: 2012-3-30 22:22
klain 发表于 2012-3-30 22:06
你把float改成double试试~~

改成double型也是一样的结果,还是不行。
作者: klain    时间: 2012-3-30 22:40
龙游天下明 发表于 2012-3-30 22:22
改成double型也是一样的结果,还是不行。

那我建议把那些参数变量,还有误差变量之类的  放在一个结构体里面 ,~~这样引用起来也方便很多···看看会不会再有错误   ·我查了那个错误提示,大部分人说是没有浮点运算的配置设置····我也不是很懂
作者: klain    时间: 2012-3-30 22:42
龙游天下明 发表于 2012-3-30 22:17
我们采样周期不变,不过调参我也不懂,这也是请教别人的,现在不在实验室了。

那可以问问帮你调的那个人么···我想知道你们一些思路,因为调参数很繁琐,我想简单点调···主要是可观测效果的调节···用到哪些东西?   谢谢交流
作者: 龙游天下明    时间: 2012-3-31 22:36
klain 发表于 2012-3-30 22:42
那可以问问帮你调的那个人么···我想知道你们一些思路,因为调参数很繁琐,我想简单点调···主要是可 ...

不好意思,他不在学校了,他是研究生,上学期见他的,这学期我都没见过他了,不知道忙什么。其实我们也很想请他帮忙的,但是没找到他。以后多多交流!
作者: 龙游天下明    时间: 2012-3-31 22:39
klain 发表于 2012-3-30 22:40
那我建议把那些参数变量,还有误差变量之类的  放在一个结构体里面 ,~~这样引用起来也方便很多···看看 ...

多谢了!今天别人告诉我在建工程时没设置成包含浮点型数据,改过之后没有这个问题了。
作者: klain    时间: 2012-4-3 13:40
龙游天下明 发表于 2012-3-31 22:39
多谢了!今天别人告诉我在建工程时没设置成包含浮点型数据,改过之后没有这个问题了。

哦哦~~对于参数,你们车性能变化下··参数就改变了···你们现在还有进行调节么···可观测效果在上位机显示??
作者: 龙游天下明    时间: 2012-4-3 16:37
klain 发表于 2012-4-3 13:40
哦哦~~对于参数,你们车性能变化下··参数就改变了···你们现在还有进行调节么···可观测效果在上位 ...

在调节,我们没有用上位机,我也不懂上位机,现在只求能平稳跑一下了。你们的如何?
作者: klain    时间: 2012-4-4 19:35
龙游天下明 发表于 2012-4-3 16:37
在调节,我们没有用上位机,我也不懂上位机,现在只求能平稳跑一下了。你们的如何?

我们的还没跑起来~~
想着先把基本的做好~~好让调节的时候方便点···

作者: cqhb小麦    时间: 2013-1-20 21:47
上传一个资料,,




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2