找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1104|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机控制L298n电机PI闭环控制程序错误

[复制链接]
跳转到指定楼层
楼主
ID:661195 发表于 2019-12-13 17:59 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
下面是我从网上找的程序,修改了下,想要达到通过更改期望速度来改变实际速度的目的。但经过测试发现不行,程序在下,希望大佬指出错误。


#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;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表