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

标签:
单片机直流电机转速pid |
分类: 单片机 |
http://s13/mw690/001Usg0szy7oMCXnFSI1c&690
http://s6/mw690/001Usg0szy7oMCXwTK5f5&690
http://s2/mw690/001Usg0szy7oMCXGktX31&690
http://s5/mw690/001Usg0szy7oMCXLAwcd4&690
http://s5/mw690/001Usg0szy7oMCXOJrmb4&690
http://s6/mw690/001Usg0szy7oMCXwTK5f5&690
http://s2/mw690/001Usg0szy7oMCXGktX31&690
http://s5/mw690/001Usg0szy7oMCXLAwcd4&690
http://s5/mw690/001Usg0szy7oMCXOJrmb4&690
部分单片机源程序:
#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;
}
.........................................................