智能车制作

标题: 一个简单的PID [打印本页]

作者: denghongjian    时间: 2010-3-3 16:59
标题: 一个简单的PID


复制代码

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <mc9s12xs128.h>
//定义PID参数
#define VV_KPVALUE 3       //比例
#define VV_KIVALUE 40     //积分
#define VV_KDVALUE 3     //微分
#define VV_MAX 10000       //返回的最大值,是pwm的周期值
#define VV_MIN 0
#define VV_DEADLINE 0X08   //速度PID,设置死区范围
typedef struct PID       //定义数法核心数据
{
signed int vi_Ref;      //速度PID,速度设定值
signed int vi_FeedBack;  //速度PID,速度反馈值


signed long vi_PreError;  //速度PID,前一次,速度误差,,vi_Ref - vi_FeedBack
signed long vi_PreDerror; //速度PID,前一次,速度误差之差,d_error-PreDerror;


unsigned int v_Kp;      //速度PID,Ka = Kp
unsigned int v_Ki;      //速度PID,Kb = Kp * ( T / Ti )
unsigned int v_Kd;      //速度PID,
   
signed long vl_PreU;    //电机控制输出值
  
}PID;
PID  sPID;                //  PID Control Structure

void PIDInit(void)
{
sPID.vi_Ref = 0 ;        //速度设定值
sPID.vi_FeedBack = 0 ;  //速度反馈值
  
sPID.vi_PreError = 0 ;   //前一次,速度误差,,vi_Ref - vi_FeedBack
sPID.vi_PreDerror = 0 ;   //前一次,速度误差之差,d_error-PreDerror;

sPID.v_Kp = VV_KPVALUE;
sPID.v_Ki = VV_KIVALUE;
sPID.v_Kd = VV_KDVALUE;
  
sPID.vl_PreU = 0 ;      //电机控制输出值
}                                   
unsigned int v_PIDCalc( PID *pp )
{
signed long  error,d_error,dd_error;
   
  error = (signed long)(pp->vi_Ref - pp->vi_FeedBack); // 偏差计算   
  d_error = error - pp->vi_PreError;
  dd_error = d_error - pp->vi_PreDerror;
  pp->vi_PreError = error; //存储当前偏差
pp->vi_PreDerror = d_error;
if( ( error < VV_DEADLINE ) && ( error > -VV_DEADLINE ) ); //设置调节死区
              //速度PID计算
  pp->vl_PreU += (signed long)(  pp -> v_Kp * d_error + pp -> v_Ki * error  + pp->v_Kd*dd_error);
  
else if( pp->vl_PreU >= VV_MAX )   //速度PID,防止调节最高溢出
  pp->vl_PreU = VV_MAX;
  
else if( pp->vl_PreU <= VV_MIN ) //速度PID,防止调节最低溢出
  pp->vl_PreU = VV_MIN;
else
;
   return ( pp->vl_PreU  );  // 返回预调节占空比

}



void main(void) {
  /* put your own code here */
  
   InitMCu();
    IncPIDInit();
int g_CurrentVelocity=0;   //全局变量也初始化
int g_Flag=0;                //全局变量也初始化

EnableInterrupts;
  While(1)
{
   if (g_Flag&&vi_FeedBack)
      {
          PWMOUT+=  v_PIDCalc( PID *pp );
            g_Flag&=~ vi_FeedBack;
}
}
}
  for(;;) {
    _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}
作者: zhou040609    时间: 2010-3-5 12:38
学习学习
作者: chuchiwolong    时间: 2010-3-5 15:46
学习了
作者: lmmarkham001    时间: 2010-3-6 20:06
学习了
作者: lmmarkham001    时间: 2010-3-6 20:14
好好待我分析下
作者: 新手大兵    时间: 2010-3-9 11:54
好好 研究一下
作者: 法拉利    时间: 2010-3-9 13:38
学习学习
作者: huhuazhi    时间: 2010-3-9 17:11
seesee
作者: wangxiaojian    时间: 2010-3-9 22:19
谢谢~刚开始学呢~先分享再说~呵呵
作者: Brucedeng    时间: 2010-3-9 22:43
我刚开始玩智能车,这个收藏了,
另外,谢谢
作者: jiao19880804    时间: 2010-3-10 12:09
thanks
作者: kjlilin1101    时间: 2010-3-10 12:52
学习学习
作者: qnbs1    时间: 2010-3-10 15:36
注释应该再详细点呀
作者: qnbs1    时间: 2010-3-10 15:49
还是很不错的。收藏了
作者: dkmy    时间: 2010-3-12 15:59
学习ing。。。

谢谢!!!
作者: YUZHIBOYI    时间: 2010-3-19 13:38
学习一下
作者: ksxz    时间: 2010-3-20 15:27
谢谢
作者: zhoutianjun    时间: 2010-3-21 21:41
非常感谢啊!
作者: yuanle9527    时间: 2010-3-22 22:20
学习了
作者: zou317    时间: 2010-3-23 23:35
CC
作者: puwenzheng    时间: 2010-3-24 08:59
回复 5# lmmarkham001


   
作者: chenbing0627    时间: 2010-3-24 12:51
收藏了,谢谢!
作者: benny    时间: 2010-3-28 16:55
不错不错
作者: 时代还怪    时间: 2010-3-28 20:38
请问,死区是什么,能解释一下嘛?
作者: 635842142    时间: 2010-3-29 12:53
学习了
作者: 44822886    时间: 2010-3-29 15:27


不错,感谢分享。。。
作者: starjiajia    时间: 2010-4-3 17:15
先收下了  谢谢
作者: shenchaobaby    时间: 2010-4-4 12:38

作者: xyz2782350    时间: 2010-4-7 21:45
真复杂呀
作者: xyz2782350    时间: 2010-4-7 21:45

作者: justing88    时间: 2010-4-13 16:32
为什么网上基本上的资料都是关于PID的增量式的,而不是位置式的
你有位置式的程序吗??看了好几届的程序,还是感觉有点模糊
作者: 霜~哀伤    时间: 2010-4-15 18:42
我第一个看的PID程序,占位留念。
作者: francis    时间: 2010-4-15 19:04
谢谢
作者: shuxinxiaozi    时间: 2010-4-18 16:30
O(∩_∩)O~,学习了!
作者: zhixiaolei    时间: 2010-4-23 00:07
好东西怎能不顶
作者: zhixiaolei    时间: 2010-4-23 00:09
好东西怎能不顶
作者: 786892880    时间: 2010-4-23 00:38
学习。。。。
作者: zhuzhu0    时间: 2010-5-3 01:31
学习
作者: yinshengxu    时间: 2010-5-4 20:27
学习一下
作者: zhenhao1122    时间: 2010-5-4 22:14

作者: _XIANGBEI    时间: 2010-5-9 17:01
顶起来~!
作者: lbjhdu    时间: 2010-5-9 20:02
还不错,学习了
作者: williamkmcn    时间: 2010-5-9 23:40
多謝你的指導,,謝謝
作者: ljl0731    时间: 2010-5-10 15:29
研究
作者: xiaomao3338    时间: 2010-5-12 20:45
为什么编译的时候说少了个“}”
作者: ~~逍遥骑士~~    时间: 2010-5-13 13:01
学习
作者: 时代还怪    时间: 2010-5-18 15:37
谢谢~~小弟受教!
作者: Zwelson    时间: 2010-5-22 17:08
很实在
作者: yuanchenxu    时间: 2010-5-25 12:27
谢楼主
作者: shenyoujin    时间: 2010-5-28 14:29
mark
作者: motor    时间: 2010-5-28 17:37
学习学习
作者: ljl0731    时间: 2010-6-2 19:39
看看,能否用上
作者: qnbs1    时间: 2010-6-7 18:30
怎么用于自己的程序中?
作者: 好拿就拿    时间: 2010-6-20 10:40
研究下
作者: 安杰    时间: 2010-7-4 21:22
谢了
作者: xiaozhongde    时间: 2010-7-7 11:32

作者: 安杰    时间: 2010-7-7 16:10
看啊看
作者: 尖刀阿利亚    时间: 2010-7-8 15:37
先收藏了,谢谢LZ~
作者: tanglin2007    时间: 2010-7-14 16:07
好好学习
作者: tanglin2007    时间: 2010-7-14 16:07
好好学习
作者: huabit    时间: 2010-8-19 16:49
谢楼主的分享
作者: SONGYI    时间: 2010-10-5 19:07
支持
作者: harry1874    时间: 2010-10-18 13:37
好~~学习
作者: jianchi08    时间: 2010-10-18 22:44
很不简单
作者: chenxh0203    时间: 2010-10-28 20:55
d_error = error - pp->vi_PreError;
  dd_error = d_error - pp->vi_PreDerror;
第二句话好像有问题。
作者: yayadianzhang    时间: 2010-12-29 23:45
谢谢lz啦
作者: kai3611100    时间: 2010-12-30 13:59
回复 1# denghongjian


    先谢谢了。拿回去看看!
作者: lovechezu    时间: 2011-1-19 13:03
呵呵~~看明白了。
作者: anxingle    时间: 2011-1-26 12:34
谢谢。
作者: 求学6    时间: 2011-2-11 17:06
看看,研究下
作者: linyujin    时间: 2011-2-17 10:53
学习了哈!谢谢楼主!
作者: chongnwpu    时间: 2011-2-26 20:59
不错的分享,谢谢
作者: CCGOGO    时间: 2011-2-27 14:24
学习学习
作者: kui13575728208    时间: 2011-2-27 16:08
看下
作者: zhangcanwang    时间: 2011-3-13 18:43
hao
作者: az22985342    时间: 2011-3-13 20:26
学习!
作者: 极品小白菜    时间: 2011-3-14 20:43
猜猜我是誰
作者: ailsacqx    时间: 2011-3-15 10:12
学习学习,谢谢楼主
作者: zjt    时间: 2011-3-17 22:52
那么,请教,VV_MAX 和VV_MIN 该怎么确定呢?PID算法的输出直接就可以给PWMDTYx来控制占空比?
作者: shmcclmm    时间: 2011-3-27 21:19
可以参考参考~
作者: vgjkl    时间: 2011-5-31 13:01
围观
作者: qiaobingli    时间: 2011-6-3 20:47
谢谢楼主
作者: aifei7320    时间: 2011-7-1 22:17
有点看不懂啊
作者: qiyixi123    时间: 2011-7-8 12:27
暑假回去学习学习嘿嘿
作者: 紫色轮回    时间: 2011-7-11 20:52
烦死我了。。。PID
作者: 紫色轮回    时间: 2011-7-11 20:56
#include       /* common defines and macros */
#include "derivative.h"      /* derivative-specifi ...
denghongjian 发表于 2010-3-3 16:59



   pp->vl_PreU += (signed long)(  pp -> v_Kp * d_error + pp -> v_Ki * error  + pp->v_Kd*dd_error);

这个东西,error应该是积分项吧?derror应该是微分项吧?积分应该是累加的吧?
作者: 坚持每一次123    时间: 2011-11-9 19:50
看看
作者: 云端暮雪    时间: 2011-11-12 23:09
程序好像有问题吧?!在计算PID那一段。。。
作者: 下下西    时间: 2011-11-14 17:01
嘿嘿,看不懂啊?
作者: 1013343553    时间: 2011-12-10 20:12
研究研究,谢楼主!
作者: 二硫碘化钾    时间: 2012-1-16 11:44
了解一下
作者: midanshen1    时间: 2012-2-1 10:31
楼主啊   我编译了一下有错误啊!
求解释!
作者: 七年之痒    时间: 2012-2-7 16:14
如果附上一篇PID调节的说明分析,对初学者就更好了
作者: haozhuaifeipo    时间: 2012-2-27 01:36

作者: yssdsz    时间: 2012-3-3 17:48
标题: RE: 一个简单的PID
新手收藏了~
作者: yssdsz    时间: 2012-3-3 17:48
标题: RE: 一个简单的PID
新手收藏了~多谢分享~
作者: Vlanes    时间: 2012-3-7 08:44

作者: 1002828597    时间: 2012-4-8 22:34
云端暮雪 发表于 2011-11-12 23:09
程序好像有问题吧?!在计算PID那一段。。。

再回来看看那一段,因为在其他地方也有看到这样用。
作者: MusicMe    时间: 2012-4-21 22:34
谢谢楼主!
作者: 封号式寂寞    时间: 2012-5-7 12:47
待我研究再说




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