资源简介

基于51单片机PID算法的直流电机测速控速设计,测量精度很高,控制精度也很高,误差在1r/min内,这是经过本人长期调试所得出的成果!程序里的PID参数是在大量实验过程得到的,很具有参考价值!希望对大家有所帮助!

资源截图

代码片段和文件信息

#include 
#define  uchar unsigned char
#define  uint unsigned int
sbit LCD_RS = P2^4;   //液晶1602  RS端口
sbit LCD_RW = P2^5;          
sbit LCD_EP = P2^6;   //液晶1602  EN端口
sbit PWM=P2^2;//p1.1口产生pwm
sbit input2=P2^0;
sbit input1=P2^1;
sbit  key1=P1^0;         //设置转速
sbit  key2=P1^1;         // 加
sbit  key3=P1^2;   // 减
sbit  key4=P1^3;   //  正反转
//sbit  key5=P1^4;   // 停
//sbit  key6=P1^5;   // 启

uchar code table[] = {“SDSD=00000r/s“};   //设定速度初始化
uchar code table1[] = {“speed=00000r/s“}; //  动态显示初始化
uchar n  ixtable2[5]table3[5]zhuansugeshibaiqianwanflag1key1ntemp;
unsigned char timer1 timer3n0n1n2; 
unsigned int vvaltemp2temp1pidoutv1;  //储存电机转速    6
unsigned char count;  //储存定时器T0中断次数
bit flagflag2=1;      //计满1秒钟标志位
float  mm;
void  init();
void display_val(unsigned int zhuan);
 void keyscan();
/***********延时1MS程序***/
void  delay(uint z)
{  
uint xy;
   for(x=z;x>0;x--)
   for(y=110;y>0;y--);

}


///*
//PID Function
//The PID function is used in mainly
//control applications.PIDCalc performs one iteration of the PED
//algorithm.
//While the PID function worksmain is just a dummy program shouwing
//a typical usage
//*/
//typedef struct PID
//{
// int SetPoint;//设定目标Desired Value
// long SumError;//误差累计
// double Proportion;//比例常数Proportional Const
// double Integral;//积分常数Integral const
// double Derivative;//微分常数Derivative Const
// int LastError;//Error[-1]
// int PrevError;//Error[-2]
//}PID;
//
//static PID sPID;
//static PID *sptr = &sPID;
//
///*
//Initialize PID Structrue PID参数初始化
//*/
//void IncPIDInit(void)
//{
// sptr->SumError = 0;
// sptr->LastError = 0;//Error[-1]
// sptr->PrevError = 0;//Error[-2]
// sptr->Proportion = 0;//比例常数Proportional Const
// sptr->Integral = 0;//积分常数Integral Const
// sptr->Derivative = 0;//微分常数Derivative Const
// sptr->SetPoint = 0;
//}
//
///*
//增量式PID计算部分
//*/
//int IncPIDCalc(int usetint NextPoint)
//{
// register int iErroriIncpid;//当前误差
// sptr->SetPoint = uset;
// iError = sptr->SetPoint-NextPoint;//增量计算
// iIncpid = sptr->Proportion*iError//E[k]项
// -sptr->Integral*sptr->LastError//E[k-1]项
// +sptr->Derivative*sptr->PrevError;//E[k-2]项
// //存储误差,用于下次计算
// sptr->PrevError = sptr->LastError;
// sptr->LastError = iError;
// //返回增量值
// return(iIncpid);
//}


#define kp 0.45    //比例系数
#define ki 0.0115 //积分系数
#define kd  0  //微分系数0.02 

float eeeeh;    //PID误差
  
float PIDcontrol(float uset  float feedback)
{   
float dukDI;
    eeh=ee;  
ee=uset-feedback;
I = ee + I;    
D = ee -eeh;
    duk=kp*ee+ki*I-kd*D;
return duk;
}


 /******液晶写命令************/
 void  write_com(uchar com)
 {  LCD_RS=0;
   LCD_RW=0;
P0=com ;
delay(1);
LCD_EP=1;
delay(1);
LCD_EP=0;
 }
/*****************/
/********液晶写数据***********/
void  write_data(uchar  date)
{   LCD_RS=1;
  LCD_RW=0;
P0=date ;
delay(1);
LCD_EP=

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     548864  2013-03-04 21:28  电机控速.doc

     文件      17639  2013-03-03 12:23  直流电机测速调试V6\motor

     文件       6459  2013-03-03 12:23  直流电机测速调试V6\motor.hex

     文件         68  2013-03-03 12:23  直流电机测速调试V6\motor.lnp

     文件      23742  2013-03-03 12:23  直流电机测速调试V6\motor.M51

     文件       6170  2013-03-03 09:11  直流电机测速调试V6\motor.plg

     文件      73296  2013-03-02 23:20  直流电机测速调试V6\motor.uvopt

     文件      13433  2013-03-02 23:20  直流电机测速调试V6\motor.uvproj

     文件          0  2013-03-02 21:13  直流电机测速调试V6\motor_uvproj.bak

     文件       6376  2009-05-07 14:37  直流电机测速调试V6\STARTUP.A51

     文件      14048  2013-03-03 12:23  直流电机测速调试V6\STARTUP.LST

     文件        749  2013-03-03 12:23  直流电机测速调试V6\STARTUP.OBJ

     文件       9982  2013-03-03 12:23  直流电机测速调试V6\直流电机PID调速.c

     文件      22481  2013-03-03 12:23  直流电机测速调试V6\直流电机PID调速.LST

     文件      19624  2013-03-03 12:23  直流电机测速调试V6\直流电机PID调速.OBJ

     目录          0  2013-03-03 17:07  直流电机测速调试V6

----------- ---------  ---------- -----  ----

               762931                    16


评论

共有 条评论