搜索
bottom↓
回复: 1

PID例子

[复制链接]

出0入0汤圆

发表于 2012-2-7 22:12:46 | 显示全部楼层 |阅读模式
[电机与驱动] 一个简单的PID
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 */
}
点击此处下载 ourdev_716698UC9JVE.doc(文件大小:28K) (原文件名:PID例子.doc)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-2-26 19:08:46 | 显示全部楼层
学习了  谢谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 20:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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