标题: 51单片机控制L298n电机PI闭环控制程序错误 [打印本页]

作者: 求助111    时间: 2019-12-13 17:59
标题: 51单片机控制L298n电机PI闭环控制程序错误
下面是我从网上找的程序,修改了下,想要达到通过更改期望速度来改变实际速度的目的。但经过测试发现不行,程序在下,希望大佬指出错误。


#include<reg51.h>


sbit pwm=P1^0;
sbit IN2=P1^1;
unsigned int value;


unsigned int Inlpuse=0;
unsigned int countl=0;
unsigned int time=0;
unsigned int Proportion=5;//比例常数 Proportional Const
unsigned int Integral=1.5;//积分常数 Integral Const
unsigned int LastError=0;//Error[-1]
unsigned int PrevError=0;//Error[-2]
unsigned int Error=0;//Error[0]
int          Out=0;//outcome
unsigned int expc_speed=600;
unsigned int real_speed=0;


void main()
{
   TMOD = 0x21;

   TH0= 0x3c;
   TL0 = 0xb0;        //50ms
   TH1 = 0x9c;
   TL1 = 0x9c;
   EA=1;
   ET0 = 1;
   ET1 = 1;
   EX0 = 1;
   IT0 = 1;
   TR1=1;
   IT0=1;


}








  int  PIDControl()
{
     Error=expc_speed-real_speed;//计算偏差
     //进行增量式PID计算
     Out=Out+
         Proportion*(Error-LastError)+
         Integral*Error;

     //进行误差更新
     PrevError=LastError;
     LastError=Error;

     //上下限幅处理
      if(Out<0)
       Out=0;//驱动电机的电压不可能小于零,故当输出小于零时,输出应该值为零
     if(Out>250)
       Out=100;//
           value=Out;
           return value;


        

}

   void exter0() interrupt 0 //外部中断脉冲计数
{    //M法测速度(外部中断0和定时器0用在M法测速

   Inlpuse++;
}

void timer0() interrupt 1
{
       TH0 = 0x3c;

       TL0 = 0xb0;

       time++;

  if(time>=10) //1s 钟读取次转

   {
       EX0 = 0;

       TR0 = 0;

       real_speed=Inlpuse;

       Inlpuse=0;

    PIDControl();//100ms控制一次

       Inlpuse=0;
       EX0=1;
       TR0=1;
}
}

void  T1_time() interrupt 3
{
    countl++;
    if(countl>= 100)
         countl = 0;

    if(countl <value)
        pwm = 1;
        else pwm=0;
}







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1