加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

基于51单片机直流电机转速测量PID控制程序与仿真设计

(2018-10-29 19:58:01)
标签:

单片机

直流电机转速pid

分类: 单片机
       基于51单片机直流电机转速测量PID控制程序与仿真设计,这是一款由51单片机构成的直流电机转速PID控制系统,采用增量式PID控制算法,闭环控制直流电机转速按照设定的转速运行,系统还可以通过按键设置电机的转速。
       1、程序可直接用于下列单片机:STC89C52、AT89C51/C52、AT89S51/S52。以上几种单片机全部为51系列单片机,除了名字不一样外,功能及应用完全一样,互相兼容。
       2、两个四位一体共阳数码管分别显示设定速度值、实测速度值。
       3、一个开关启动、停止。
       4、两个按键功能:“加速”键按下可使电机设定速度值增加,加速电机运转;“减速”键按下可使电机设定速度值减小,减速电机运转。

部分单片机源程序:
#include‘reg52.h'
#include 'stdio.h’
#define uchar unsigned char 
#define uint unsigned int
#define THC0 0xf8
#define TLC0 0x60   //2ms
unsigned char  code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极数码管,0-9段码表
unsigned char  Data_Buffer[8]={0,0,0,0,0,0,0,0};
 
uchar i=0;
sbit AddSpeed=P1^1;
sbit SubSpeed=P1^2;
sbit PWM_FC=P1^0;
int e ,e1 ,e2 ;//pid 偏差
float uk ,uk1 ,duk ;//pid输出值
float Kp=10,Ki=12,Kd=1.6;//pid控制系数 10,12,1.5
int out=0;
uint SpeedSet=3000;
uint cnt=0;
uint Inpluse=0,num=0;//脉冲计数
uint PWMTime=100;//脉冲宽度
unsigned char  arry[];
void SendString(uint ch);
void PIDControl();
void SystemInit();
void delay(uchar x);
void PWMOUT();
void SetSpeed();
void SegRefre();
void main()
{
SystemInit();
while(1)
{
SetSpeed();
SegRefre();
PWMOUT();
 
}
}

void PIDControl()        //pid偏差计算
{
e=SpeedSet-num;
duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/50;         //+Kd*(e-2e1+e2)
uk=uk1+duk;
out=(int)uk;
if(out>1000)
{
out=1000;
}
else if(out<0)
{
out=0;
}
.........................................................
                                                                 完整源程序及Proteus仿真文件

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有