PID小车

通过PID三个参数实现函数内容完成速度控制PID小车。

PID小车_第1张图片

转化成代码:

void PIDControl()        //pid偏差计算
{
	e=SpeedSet-num;
	duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2));         //+Kd*(e-2e1+e2)//增量式pid
	uk=uk1+duk;
	out=(int)uk;
	if(out>1000)
	{
		out=1000;
	}
	else if(out<=0)
	{
		out=0;
	}
	uk1=uk;
	e2=e1;
	e1=e;
	PWMTime=out;
}

PID小车_第2张图片

PWM输入占空比:

void PWMOUT()
{
	uint cnt;
	for(cnt=0;cnt<1000;cnt++)
	{
		if(cnt100)
		{
			PWM_FC_1=0;
			PWM_FC_2=0;
		}
		if(time==0)
		{
			PWM_FC_1=0;
			PWM_FC_2=0;
			break;
		}
	}
	if(cnt>1000) cnt=0;
}

通过LCD1602显示速度:

 

void display()   
{
    init();   //初始化lcd1602
   
    writeComm(0x80);      //显示地址设置为80H(即00H,)上排第一位
    writeString(table1, 11);
if(Data_Buffer[0] != 0)
    {
         writeData('0'+Data_Buffer[0]);
    }
    for(count = 1; count != 4; count++)
    {
        writeData('0'+ Data_Buffer[count]);
 if(count == 2)
        {
            writeData('.');
        }       
    }
writeComm(0xc0);    //重新设定显示地址为,即下排第1位
    writeString(table2, 11); 
if(Data_Buffer[4] != 0)
    {
         writeData('0'+Data_Buffer[4]);
    }
    for(count = 5; count != 8; count++)
    {
        writeData('0'+Data_Buffer[count]);
 if(count == 6)
        {
            writeData('.');
        }       
    }
}

定时器中断:

void Exit0() interrupt 0
{
	Inpluse++;
}

void t0() interrupt 1
{
   TH0=(65536-10000)/256;    //重新赋值 10ms
   TL0=(65536-10000)%6;
	
	time++;  //转速测量周期
	if(SpeedSet==0)
	{
		PWM_FC_1=0;
		PWM_FC_2=0;
		time=0;
		TR1 =0;
		num=(256*TH1+TL1)*8/20;
		TH1=0x00;                        //计数器1清零,重新开始计数
        TL1=0x00;                              
        TR1=1;
		PIDControl();
	}
	else 
	if(time>100)
	{
		time=0;
		TR1 =0;
		num=(256*TH1+TL1)*8/20;
		TH1=0x00;                        //计数器1清零,重新开始计数
        TL1=0x00;                              
        TR1=1;
		Inpluse=0;
		PIDControl();
	}
}

 

你可能感兴趣的:(嵌入式学习笔记)