单片机/MCU论坛
直播中

李林

4年用户 3经验值
私信 关注
[问答]

求大佬帮忙看下这个程序能实现智能小车比例控制吗,小白,希望大佬们多给些意见,拜托了

#include
        #include
#define uchar unsigned char
#define uint unsigned int
                 

uchar i=0;
***it IN1=P1^2;
***it IN2=P1^3;
***it IN3=P1^4;
***it IN4=P1^5;
***it ENA=P1^6;
***it ENB=P1^7;
int e ,e1;//偏差
float uk,uk1,duk ;//输出值
float Kp=20;//控制系数        20,
int out=0;
uint SpeedSet=300;
uint cnt=0;
uint Inpluse=0,num=0;//脉冲计数
uint PWMtime=100;//脉冲宽度




void Control();
void SystemInit();
void delay(uchar x);
void PWMOUT();




/**************主函数************/
void main()
{
        SystemInit();
        while(1)
        {
               
                SpeedSet=300;
                PWMOUT();                //输出PWM
        }
}


void Control()        //偏差计算
{
       
        e=SpeedSet-num;                 //误差=设定值-1s采集的脉冲值
        duk=Kp*(e-e1);                 
        uk=uk1+duk;            
        out=(int)uk;   //输出为占空比
        if(out>1000)
        {
                out=1000;
        }
        else if(out<0)
        {
                out=0;
        }
        uk1=uk;                                  //变量值移位
        e1=e;                                  
        PWMTime=out;
}


void delay(uchar x)
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=50;j>0;j--);
}


void PWMOUT()                   //输出PWM脉冲
{
        if(cnt
        {
        ENA=1;
                                ENB=1;
IN1=1;IN2=0;IN3=1;IN4=0;
        }
        else
        {
                ENA=0;
                                ENB=0;


        }
        if(cnt>1000) cnt=0;         
}
void SystemInit()
{
        TMOD=0X21;   //定时器1用来控制pwm,定时器0,用来计算转速  
        TH0=0XF9;
        TL0=0X0F;
        TH1=0xC0;
        TL1=0XC0;
        ET1=1;
        ET0=1;
        TR0=1;
        TR1=1;
        EX0=1;     //中断0用来测量转速
        IT0=1;
        EA=1;
        e =0;                //初始化 差值
        e1=0;
       
}






void int0() interrupt 0
{
        Inpluse++;                    //采集外部脉冲
}
void t0() interrupt 1
{
        static unsigned char Bit=0;//静态变量,退出程序值保留
        static unsigned int time=0;
        TH0=0XF9;         //赋初值
        TL0=0X0F;         //赋初值


        Bit++;
        time++;  //转速测量周期
        if(Bit>8) Bit=0;                  
        P0=0xff;




        if(time>100)
        {
                time=0;
                num=Inpluse*5;                   //算得1s采集的脉冲数
                Inpluse=0;                          
                Control();                   //调用比例控制算法,输出PWM
        }
}
void timer_1()  interrupt 3
{
           cnt++;        //cnt越大占空比越高2.5Khz
}
  

已退回2积分

更多回帖

×
20
完善资料,
赚取积分