资源简介

本设计为基于51单片机的直流电机PID指定转速控制,利用4x4矩阵键盘对电机的转速进行设定,并可以根据电机的反馈脉冲显示电机的实时转速,利用PID调节对实时速度进行调整,最终达到设定的目标速度。 压缩包内含keil程序(详细注释)、proteus7.1和8.6两个版本的仿真文件以及使用方法。

资源截图

代码片段和文件信息

/*PID的参数设置可以参照以下来进行:  
  参数整定找最佳,从小到大顺序查;  
  先是比例后积分,最后再把微分加;  
  曲线振荡很频繁,比例度盘要放大;  
  曲线漂浮绕大湾,比例度盘往小扳;  
  曲线偏离回复慢,积分时间往下降;  
  曲线波动周期长,积分时间再加长;  
  曲线振荡频率快,先把微分降下来;  
  动差大来波动慢。微分时间应加长;  
  理想曲线两个波,前高后低4比1 ; 
  一看二调多分析,调节质量不会低;
*/
#include 
#include 
#define uchar unsigned char 
#define uint unsigned int

sbit RS = P2^5;  //LCD1602数据命令选择端口 
sbit RW = P2^6;  //LCD1602读写选择端口
sbit EN = P2^7;  //LCD1602使能端口
sbit IN2=P3^3;   //L298输入端2
sbit IN1=P3^4;   //L298输入端1
sbit PWM_FC=P3^5;//L298使能端口
uchar aa[]={‘T‘‘a‘‘r‘‘g‘‘e‘‘t‘‘ ‘‘ ‘‘ ‘‘ ‘‘ ‘‘r‘‘/‘‘m‘‘i‘‘n‘};//目标转速:Target  r/min
uchar cc[]={‘A‘‘c‘‘t‘‘u‘‘a‘‘l‘‘ ‘‘ ‘‘ ‘‘ ‘‘ ‘‘r‘‘/‘‘m‘‘i‘‘n‘};//实测转速: Actual  r/min
uchar displayflag;  //显示标志位变量
uint SetSpeed=500;  //声明设定速度变量
uint ActualSpeed=0; //声明实际速度变量
int e e1 e2 ;     //声明当前偏差值变量、之后偏差值变量、再后偏差值变量
int out=0;          //PID调节后输出偏差值变量
uint cnt=0;         //定时器1中断次数变量
uint Inpluse=0;     //声明脉冲计数变量、
uint PWMTime=100;   //声明脉冲宽度时间变量
float uk uk1 duk ;//声明目前总偏差值变量、之后偏差值总变量、偏差值总变量
float Kp=0.36Ki=0.05Kd=0.016;//pid控制系数p=0.36,i=0.05,d=0.016。
uchar countsign1;
uchar key;

  void DelayUs2x(unsigned char t)
  {     
   while(--t);
  }
  void DelayMs(unsigned int t)
  {
   while(t--)
   {
    DelayUs2x(245);
    DelayUs2x(245);
   }
  }

 uchar key_scan (void)
 {
uchar temptemp2;
uchar num;
P1 = 0xf0;//让P1输出0xf0
temp = P1;//读入P1的值
if (temp != 0xf0) //当P1读入的值不等于0xf0
{
DelayMs(5);//延迟5ms
temp = P1;//再读入P1口的值
if (temp != 0xf0)//如果P1读入的值不等于
{  //0xf0,就说明有按键按下
temp2 = temp;//保留P1读入值得高四位  
P1 = 0x0f;//再让P1口输出0x0f
DelayMs(5);
temp = P1;//再读入P1口的值
temp2 |= temp;//保留此读入值的低四位
}
}
switch(temp2)
{
case 0xee: num = 0;break;
case 0xde: num = 1;break;
case 0xbe: num = 2;break;
case 0x7e: num = 3;break;
case 0xed: num = 4;break;
case 0xdd: num = 5;break;
case 0xbd: num = 6;break;
case 0x7d: num = 7;break;
case 0xeb: num = 8;break;
case 0xdb: num = 9;break;
case 0xbb: num = 10;break;
case 0x7b: num = 11;break;
case 0xe7: num = 12;break;
case 0xd7: num = 13;break;
case 0xb7: num = 14;break;
case 0x77: num = 15;break;
default :num=16;break;
}
return num;
 }
  void write_com(uchar com)//写命令
  {
   RS=0;
   RW=0;
   P0=com;
   DelayMs(5);
   EN=1;
   DelayMs(5);
   EN=0;
  }
  void write_data(uchar date)//写一个字符
  {
   RS=1;
   RW=0;
   P0=date;
   DelayMs(5);
   EN=1;
   DelayMs(5);
   EN=0;
  }
  void init()//初始化
  {
   write_com(0x38);
   write_com(0x0c);
   write_com(0x06);
   write_com(0x01);
  }
  void LCD_Write_String(uchar xuchar yuchar *s)//写字符串 
  {     
   if (y == 0) 
   {     
    write_com(0x80 + x);     
   }
   else 
   {     
    write_com(0xC0 + x);     
   }        
   while (*s) 
   {     
     write_data( *s);     
     s++;     
   }
  }
  void PIDControl()                    //pid偏差计算
  {
   e=SetSpee

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2020-07-15 15:40  直流电机转速控制\
     目录           0  2020-07-15 15:41  直流电机转速控制\仿真7版本\
     文件        6966  2020-07-15 13:47  直流电机转速控制\仿真7版本\main.hex
     文件         792  2020-07-15 15:41  直流电机转速控制\仿真7版本\无刷直流电机转速控制.PWI
     文件      114431  2020-07-15 15:39  直流电机转速控制\仿真7版本\直流电机转速控制.DSN
     目录           0  2020-07-15 15:40  直流电机转速控制\仿真8.6版本\
     文件        6966  2020-07-15 13:47  直流电机转速控制\仿真8.6版本\main.hex
     文件       23738  2020-07-15 12:34  直流电机转速控制\仿真8.6版本\直流电机转速控制.pdsprj
     文件         631  2020-07-15 15:40  直流电机转速控制\先看我.txt
     目录           0  2020-07-15 13:47  直流电机转速控制\程序\
     文件       14983  2020-07-15 13:47  直流电机转速控制\程序\main
     文件         957  2020-07-15 13:47  直流电机转速控制\程序\main.build_log.htm
     文件        7874  2020-07-15 13:47  直流电机转速控制\程序\main.c
     文件        6966  2020-07-15 13:47  直流电机转速控制\程序\main.hex
     文件          25  2020-07-15 13:47  直流电机转速控制\程序\main.lnp
     文件       13331  2020-07-15 13:47  直流电机转速控制\程序\main.LST
     文件       19824  2020-07-15 13:47  直流电机转速控制\程序\main.M51
     文件       17311  2020-07-15 13:47  直流电机转速控制\程序\main.OBJ
     文件         256  2020-06-21 21:57  直流电机转速控制\程序\main.plg
     文件       70950  2020-07-14 23:02  直流电机转速控制\程序\main.uvgui.Administrator
     文件       91018  2020-07-15 13:47  直流电机转速控制\程序\main.uvgui.世兴哥哥
     文件        5025  2020-07-15 00:22  直流电机转速控制\程序\main.uvopt
     文件       14246  2020-07-14 23:16  直流电机转速控制\程序\main.uvproj
     文件       54873  2020-06-16 00:07  直流电机转速控制\程序\main_uvopt.bak
     文件       13558  2020-05-10 22:42  直流电机转速控制\程序\main_uvproj.bak

评论

共有 条评论