智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 28804|回复: 101
打印 上一主题 下一主题

[电机与驱动] 一个简单的PID

  [复制链接]

4

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
威望
265
贡献
21
兑换币
0
注册时间
2009-11-21
在线时间
16 小时
跳转到指定楼层
1#
发表于 2010-3-3 16:59:09 | 只看该作者 回帖奖励 |正序浏览 |阅读模式


复制代码

#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 */
}

4

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
306
QQ
威望
173
贡献
101
兑换币
0
注册时间
2011-10-15
在线时间
16 小时
102#
发表于 2012-9-25 12:35:09 | 只看该作者
回复 支持 反对

使用道具 举报

6

主题

69

帖子

0

精华

高级会员

Rank: 4

积分
869
QQ
威望
493
贡献
306
兑换币
32
注册时间
2011-3-23
在线时间
35 小时
101#
发表于 2012-7-6 15:43:50 | 只看该作者
justing88 发表于 2010-4-13 16:32
为什么网上基本上的资料都是关于PID的增量式的,而不是位置式的
你有位置式的程序吗??看了好几届的程序, ...

位置式的需要累加  工作量大  而且我们电机给的值是一个增量值 不是位置式的说给多少就是多少  
回复 支持 反对

使用道具 举报

5

主题

560

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3867

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
2373
贡献
182
兑换币
711
注册时间
2012-4-15
在线时间
656 小时
100#
发表于 2012-5-7 12:47:23 | 只看该作者
待我研究再说
回复 支持 反对

使用道具 举报

2

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
威望
212
贡献
65
兑换币
0
注册时间
2011-12-2
在线时间
16 小时
99#
发表于 2012-4-21 22:34:34 | 只看该作者
谢谢楼主!
回复 支持 反对

使用道具 举报

1

主题

62

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1120
威望
654
贡献
156
兑换币
8
注册时间
2011-8-9
在线时间
155 小时
98#
发表于 2012-4-8 22:34:08 | 只看该作者
云端暮雪 发表于 2011-11-12 23:09
程序好像有问题吧?!在计算PID那一段。。。

再回来看看那一段,因为在其他地方也有看到这样用。
回复 支持 反对

使用道具 举报

23

主题

186

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4310

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
1935
贡献
891
兑换币
672
注册时间
2011-7-15
在线时间
742 小时
97#
发表于 2012-3-7 08:44:26 | 只看该作者
回复 支持 反对

使用道具 举报

21

主题

273

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2915
威望
1628
贡献
643
兑换币
264
注册时间
2012-1-15
在线时间
322 小时
96#
发表于 2012-3-3 17:48:29 | 只看该作者

RE: 一个简单的PID

新手收藏了~多谢分享~
回复 支持 反对

使用道具 举报

21

主题

273

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2915
威望
1628
贡献
643
兑换币
264
注册时间
2012-1-15
在线时间
322 小时
95#
发表于 2012-3-3 17:48:20 | 只看该作者

RE: 一个简单的PID

新手收藏了~
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
128
威望
106
贡献
22
兑换币
0
注册时间
2012-2-27
在线时间
0 小时
毕业学校
塔里木
94#
发表于 2012-2-27 01:36:21 | 只看该作者
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-28 19:21 , Processed in 0.101694 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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