智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3809|回复: 16
打印 上一主题 下一主题

PID

[复制链接]

10

主题

83

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2604
威望
1500
贡献
760
兑换币
525
注册时间
2011-9-7
在线时间
172 小时
跳转到指定楼层
1#
发表于 2012-3-28 18:29:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问以下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;   
}

0

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
987
威望
574
贡献
253
兑换币
2
注册时间
2011-8-29
在线时间
80 小时
2#
发表于 2012-3-28 20:38:02 | 只看该作者
提示什么错误?
回复 支持 反对

使用道具 举报

0

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
987
威望
574
贡献
253
兑换币
2
注册时间
2011-8-29
在线时间
80 小时
3#
发表于 2012-3-28 21:04:44 | 只看该作者
想请教一个问题,  如果采样周期是固定的,那例如直接调积分参数KI跟调积分时间TI  有什么区别吗?  是调整上方便?  
回复 支持 反对

使用道具 举报

10

主题

83

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2604
威望
1500
贡献
760
兑换币
525
注册时间
2011-9-7
在线时间
172 小时
4#
 楼主| 发表于 2012-3-29 21:25:07 | 只看该作者
klain 发表于 2012-3-28 20:38
提示什么错误?

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

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

10

主题

83

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2604
威望
1500
贡献
760
兑换币
525
注册时间
2011-9-7
在线时间
172 小时
5#
 楼主| 发表于 2012-3-29 21:29:25 | 只看该作者
klain 发表于 2012-3-28 21:04
想请教一个问题,  如果采样周期是固定的,那例如直接调积分参数KI跟调积分时间TI  有什么区别吗?  是调整 ...

我个人觉得没什么区别,但是KI和采样周期T也有关,调节TI应该更好点吧!
回复 支持 反对

使用道具 举报

0

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
987
威望
574
贡献
253
兑换币
2
注册时间
2011-8-29
在线时间
80 小时
6#
发表于 2012-3-30 21:56:06 | 只看该作者
龙游天下明 发表于 2012-3-29 21:29
我个人觉得没什么区别,但是KI和采样周期T也有关,调节TI应该更好点吧!

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

使用道具 举报

0

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
987
威望
574
贡献
253
兑换币
2
注册时间
2011-8-29
在线时间
80 小时
7#
发表于 2012-3-30 22:06:53 | 只看该作者
你把float改成double试试~~  
回复 支持 反对

使用道具 举报

10

主题

83

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2604
威望
1500
贡献
760
兑换币
525
注册时间
2011-9-7
在线时间
172 小时
8#
 楼主| 发表于 2012-3-30 22:17:24 | 只看该作者
klain 发表于 2012-3-30 21:56
一般采样周期是固定的,光编码都是测上一周期电机的速度的~~  你们有变换周期采样么?  要是采样周期固定 ...

我们采样周期不变,不过调参我也不懂,这也是请教别人的,现在不在实验室了。
回复 支持 反对

使用道具 举报

10

主题

83

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2604
威望
1500
贡献
760
兑换币
525
注册时间
2011-9-7
在线时间
172 小时
9#
 楼主| 发表于 2012-3-30 22:22:00 | 只看该作者
klain 发表于 2012-3-30 22:06
你把float改成double试试~~

改成double型也是一样的结果,还是不行。
回复 支持 反对

使用道具 举报

0

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
987
威望
574
贡献
253
兑换币
2
注册时间
2011-8-29
在线时间
80 小时
10#
发表于 2012-3-30 22:40:36 | 只看该作者
龙游天下明 发表于 2012-3-30 22:22
改成double型也是一样的结果,还是不行。

那我建议把那些参数变量,还有误差变量之类的  放在一个结构体里面 ,~~这样引用起来也方便很多···看看会不会再有错误   ·我查了那个错误提示,大部分人说是没有浮点运算的配置设置····我也不是很懂
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 15:08 , Processed in 0.051779 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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