找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大神改个模糊PID控制

[复制链接]
跳转到指定楼层
楼主
ID:81401 发表于 2015-5-28 19:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个基于单片机的智能水泵控制系统,要把里面最简单的PID控制,改成模糊PID控制,电路图如下,原程序什么的都有,就是把里面的PID算法改成模糊PID

QQ截图20150528191253.png (21.31 KB, 下载次数: 103)

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

使用道具 举报

沙发
ID:81084 发表于 2015-5-28 19:45 | 只看该作者
有详细介绍模糊pid算法的吗。
回复

使用道具 举报

板凳
ID:81401 发表于 2015-5-28 20:09 | 只看该作者
wthdyfg2004 发表于 2015-5-28 19:45
有详细介绍模糊pid算法的吗。

网上有好多,论文也有和我差不多的那种类型
回复

使用道具 举报

地板
ID:81401 发表于 2015-5-29 08:42 | 只看该作者
来人啊。。程序我先贴出来,看着不难(可我就是不会)。#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint date1;
uchar  flagdat,tflag,num,date,qian1,bai1,shi1,ge1,bai,shi,ge;
uchar   period=200;   
uchar   high;
uchar   time=0;
uchar code table[]="Zhi Neng gong shui xi tong  jia hai dong";
uchar code table1[]="Pres:   mPa Speed:    kRPM Temp:       C";
uchar code table2[]="6.826.275.243.892.831.780.360.00"        ;
//sbit kaiguan=P2^6;
sbit wr=P3^2;
sbit rd=P3^7;
sbit rs=P3^3;
sbit e=P3^4;
sbit cs=P3^6;
sbit P3_5=P3^5;
sbit dq=P2^7;
sbit deng1=P2^0;
sbit deng2=P2^1;
sbit deng3=P2^2;
sbit deng4=P2^3;
sbit deng5=P2^4;
sbit deng6=P2^5;
void delay(uint z)
{
        uint t1,y;
        for(t1=z;t1>0;t1--)
            for(y=110;y>0;y--);
}

void write_com(uchar com)
{
        rs=0;
        P0=com;
        delay(5);
        e=1;
        delay(5);
        e=0;
}

void write_data(uchar date)
{
        rs=1;
        P0=date;
        delay(5);
        e=1;
        delay(5);
        e=0;
}
void delay_18B20(unsigned int i)//延时1微秒
{
        while(i--);
}

void ds1820rst()/*ds1820复位*/
{  unsigned char x=0;
         dq = 1;          //DQ复位
         delay_18B20(4);  //延时
         dq = 0;          //DQ拉低
         delay_18B20(100); //精确延时大于480us
         dq = 1;          //拉高
         delay_18B20(40);         
   }  
  
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
         unsigned char dat = 0;
         for (i=8;i>0;i--)
         {   dq = 0; //给脉冲信号
                  dat>>=1;
                  dq = 1; //给脉冲信号
                  if(dq)
                  dat|=0x80;
                  delay_18B20(10);
         }
        return(dat);
}

void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
    for (i=8; i>0; i--)
   { dq = 0;
     dq = wdata&0x01;
     delay_18B20(10);
     dq = 1;
     wdata>>=1;
   }
}

  read_temp()/*读取温度值并转换*/
{uchar a,b;
  ds1820rst();   
  ds1820wr(0xcc);//*跳过读序列号*/
  ds1820wr(0x44);//*启动温度转换*/
  ds1820rst();   
  ds1820wr(0xcc);//*跳过读序列号*/
  ds1820wr(0xbe);//*读取温度*/
  a=ds1820rd();
  b=ds1820rd();
  date1=b;
  date1<<=8;
  date1=date1|a;
    if(date1<0x0fff)
   tflag=0;
    else
   {date1=~date1+1;
         tflag=1;
   }
date1=date1*(0.625);//温度值扩大10倍,精确到1位小数
        return(date1);
  }         
void init()
{
    P2=0x00;
        //kaiguan=0;
        cs=0;
        e=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
        for(num=0;num<40;num++)
                {
                        write_data(table[num]);
                }
        write_com(0x80+0x40);
        for(num=0;num<40;num++)
                {
                        write_data(table1[num]);
                }
        TMOD=0x01;   /*定时器0方式1*/   
    TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
    ET0=1;   /*开定时器0中断*/   
    TR0=1;    /*启动定时器0*/

}
void   timer0()   interrupt   1   using   1   
  {   
        TH0=(65536-1000)/256;
            TL0=(65536-1000)%256;
            time++;
          
                        if(time==high)   /*高电平持续时间结束,变低*/   
               P3_5=0;                 /*经过反相器反相*/
                            
                            
            else   if(time==period)     /*周期时间到,变高*/   
                      {   time=0;   
                          P3_5=1;                /*经过反相器反相*/  
                      }   
                              
}
void AD()
{
           wr=1;
        wr=0;
        wr=1;
        rd=0;
        delay(10);
}
void displaypres()
{
                 date=P1;
                bai=date/100;
            shi=date%100/10;
            ge=date%10;                       
                delay(10);
                write_com(0x80+0x40+0x05);
                write_data(0x30+bai);
                write_data(0x30+shi);
            write_data(0x30+ge);
}
void displayspeed()
{
            write_com(0x80+0x40+0x12);
                if (date<25)
                 {
                         high=1;
                         EA=1;
                        for(num=0;num<4;num++)
                    {
                          write_data(table2[num]);
                    }
                 }
                else       
                 if(date>=25)
                 {
                                 if(date<=50)
                                {
                                        high=15;
                                        EA=1;
                                        for(num=4;num<8;num++)
                                    {
                                          write_data(table2[num]);
                                    }
                                }
                                else
                                if(date<=100)
                                {
                                        high=50;
                                        EA=1;
                                        for(num=8;num<12;num++)
                                    {
                                          write_data(table2[num]);
                                    }
                                }
                                else
                                if(date<=125)
                                {
                                        high=90;
                                        EA=1;
                                        for(num=12;num<16;num++)
                                    {
                                          write_data(table2[num]);
                                    }
                                }
                                else
                                if(date<=150)
                                {
                                        high=120;
                                        EA=1;
                                        for(num=16;num<20;num++)
                                    {
                                          write_data(table2[num]);
                                    }
                                }
                                else
                                if(date<=190)
                                {
                               
                                        high=150;
                                        EA=1;
                                        for(num=20;num<24;num++)
                                    {
                                          write_data(table2[num]);
                                    }
                                }
                                else
                                if(date<=220)
                                {
                                         high=190;
                                        EA=1;
                                  for(num=24;num<28;num++)
                                    {
                                          write_data(table2[num]);
                                    }
                       
                                }
                                else
                                if(date<=250)
                                {
                                   EA=0;
                                  for(num=28;num<32;num++)
                                    {
                                          write_data(table2[num]);
                                    }
                                }
                 }
  if(date<=48)
  {
     deng2=0;
         deng3=0;
           deng1=1;       
  }
  else
          if(date>=220)
        {
            deng1=0;
                deng2=0;
                deng3=1;
        }
        else
        {
         deng1=0;
         deng3=0;
         deng2=1;
        }       
}
void displaytemp()
{
        read_temp();//读取温度
                qian1=date1/1000;
                bai1=date1%1000/100;
            shi1=date1%1000%100/10;
            ge1=date1%10;                       
                delay(10);
                if(tflag==0)
                {
               if(date1>950)
                      {
                            deng6=0;
                        deng5=0;
                        deng4=1;
                      }
                   else
                     {
                                 deng5=1;
                                deng4=0;
                                deng6=0;
                         }
            }
                else
                {
                    deng4=0;
                    deng5=0;
                        deng6=1;
                }
                if(tflag==0)
            flagdat=0x20;//正温度不显示符号
        else
        flagdat=0x2d;//负温度显示负号:-
                write_com(0x80+0x40+0x20);
                write_data(flagdat);
                write_data(0x30+qian1);
                write_data(0x30+bai1);
                write_data(0x30+shi1);
            write_data(0x2e);//显示小数点        
            write_data(0x30+ge1);
                write_data(0xDF);
       
}
void main()
{
        init();
        while(1)
        {
        AD();
                displaypres();
                displayspeed();
                   displaytemp();
        }
}

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:81648 发表于 2015-5-31 13:57 | 只看该作者
有算法吗
回复

使用道具 举报

6#
ID:81977 发表于 2015-6-3 23:54 | 只看该作者
PID算法网上很多 可以直接用的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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