久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2864|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)繼電器版本的PID水溫調(diào)節(jié)?有這個(gè)咋不行?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:190577 發(fā)表于 2020-3-22 15:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char           //宏定義
#define LCD1602 P0
sbit SET=P3^2;                            //定義調(diào)整鍵
sbit DEC=P3^3;                            //定義減少鍵
sbit ADD=P3^4;                            //定義增加鍵
sbit BUZZ=P3^7;                            //定義蜂鳴器
sbit PWM=P1^0;                                //定義燈光報(bào)警
sbit ALAM1=P1^4;
sbit DQ=P1^1;                             //定義DS18B20總線I/O        
sbit RS = P2^7;
sbit EN = P2^6;
sbit rw=P2^5;
bit shanshuo_st;                            //閃爍間隔標(biāo)志
bit beep_st;                                     //蜂鳴器間隔標(biāo)志
uchar x=0;                                      //計(jì)數(shù)器
uchar code tab1[]={"Now Tem:   .  C "};
uchar code tab2[]={"TH:   C  TL:   C"};
uint c;
uchar Mode=0;                             //狀態(tài)標(biāo)志
signed char TH=40;                  //上限報(bào)警溫度,默認(rèn)值為40
signed char TL=10;                   //下限報(bào)警溫度,默認(rèn)值為10
#define Kp 18        //比例系數(shù) 18
#define Ki 13 //積分系數(shù)  13
#define Kd 0.8        //微分系數(shù) 0.3
int Real_temp;                //實(shí)際溫度值
int Set_temp;                //設(shè)置溫度
int Disp_temp;                //顯示溫度
int last_error;                //上次誤差
float I_term;                //前面溫差和
bit        key_hold;
int PID_MAX;
unsigned int out,PWMT,counter,kk,outp;
unsigned char test_temp;                //溫度檢定標(biāo)志

int time;        //脈沖觸發(fā)時(shí)刻

//============================================================================================
//====================================DS18B20=================================================
//============================================================================================
/*****延時(shí)子程序*****/
void Delay_DS18B20(int num)
{
  while(num--) ;
}
void delay(uint xms)//延時(shí)函數(shù),有參函數(shù)
{
        uint x,y;
        for(x=xms;x>0;x--)
         for(y=110;y>0;y--);
}
/*****初始化DS18B20*****/
void Init_DS18B20(void)
{
  unsigned char x=0;
  DQ = 1;         //DQ復(fù)位
  Delay_DS18B20(8);    //稍做延時(shí)
  DQ = 0;         //單片機(jī)將DQ拉低
  Delay_DS18B20(80);   //精確延時(shí),大于480us
  DQ = 1;         //拉高總線
  Delay_DS18B20(14);
  x = DQ;           //稍做延時(shí)后,如果x=0則初始化成功,x=1則初始化失敗
  Delay_DS18B20(20);
}
/*****讀一個(gè)字節(jié)*****/
unsigned char ReadOneChar(void)
{
  unsigned char i=0;
  unsigned char dat = 0;
  for (i=8;i>0;i--)
  {
    DQ = 0;     // 給脈沖信號(hào)
    dat>>=1;
    DQ = 1;     // 給脈沖信號(hào)
    if(DQ)
    dat|=0x80;
    Delay_DS18B20(4);
  }
  return(dat);
}
/*****寫一個(gè)字節(jié)*****/
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    DQ = 0;
    DQ = dat&0x01;
    Delay_DS18B20(5);
    DQ = 1;
    dat>>=1;
  }
}
/*****讀取溫度*****/
unsigned int ReadTemperature(void)
{
  unsigned char a=0;
  unsigned char b=0;
  unsigned int t=0;
  float tt=0;
  Init_DS18B20();
  WriteOneChar(0xCC);  //跳過讀序號(hào)列號(hào)的操作
  WriteOneChar(0x44);  //啟動(dòng)溫度轉(zhuǎn)換
  Init_DS18B20();
  WriteOneChar(0xCC);  //跳過讀序號(hào)列號(hào)的操作
  WriteOneChar(0xBE);  //讀取溫度寄存器
  a=ReadOneChar();     //讀低8位
  b=ReadOneChar();    //讀高8位
  t=b;
  t<<=8;
  t=t|a;
  tt=t*0.0625;
// t= tt*10+0.5;     //放大10倍輸出并四舍五入
  t= tt*10+0.5;
  return(t);
}

/*****讀取溫度*****/
void check_wendu(void)
{
        c=ReadTemperature();                          //獲取溫度值并減去DS18B20的溫漂誤差

}

/********液晶寫入指令函數(shù)與寫入數(shù)據(jù)函數(shù),以后可調(diào)用**************/

void write_1602com(uchar com)//****液晶寫入指令函數(shù)****
{
        RS=0;//數(shù)據(jù)/指令選擇置為指令
        rw=0; //讀寫選擇置為寫
        LCD1602=com;//送入數(shù)據(jù)
        delay(1);
        EN=1;//拉高使能端,為制造有效的下降沿做準(zhǔn)備
        delay(1);
        EN=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
}


void write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****
{
        RS=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
        rw=0; //讀寫選擇置為寫
        LCD1602=dat;//送入數(shù)據(jù)
        delay(1);
        EN=1; //en置高電平,為制造下降沿做準(zhǔn)備
        delay(1);
        EN=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
}


void lcd_init()//***液晶初始化函數(shù)****
{
        uchar a;
        write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
        write_1602com(0x0c);//開顯示不顯示光標(biāo)
        write_1602com(0x06);//整屏不移動(dòng),光標(biāo)自動(dòng)右移
        write_1602com(0x01);//清顯示

        write_1602com(0x80);//日歷顯示固定符號(hào)從第一行第1個(gè)位置之后開始顯示
        for(a=0;a<16;a++)
        {
                write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號(hào)部分
                delay(3);
        }
        write_1602com(0x80+0x40);//時(shí)間顯示固定符號(hào)寫入位置,從第2個(gè)位置后開始顯示
        for(a=0;a<16;a++)
        {
                write_1602dat(tab2[a]);//寫顯示時(shí)間固定符號(hào),兩個(gè)冒號(hào)
                delay(3);
        }

}

void display()
{
        if(Mode==0)
        {
                check_wendu();
                write_1602com(0x80+8);
                write_1602dat(c/1000+0x30);
                write_1602dat((c%1000)/100+0x30);
                write_1602dat(((c%1000)%100)/10+0x30);
                write_1602com(0x80+12);
                write_1602dat(((c%1000)%100)%10+0x30);
                write_1602com(0x80+13);
                write_1602dat(0xdf);
                write_1602com(0x80+0x40+3);
                write_1602dat(TH/10+0x30);
                write_1602dat(TH%10+0x30);
                write_1602dat(0xdf);
                write_1602com(0x80+0x40+12);
                write_1602dat(TL/10+0x30);
                write_1602dat(TL%10+0x30);
                write_1602dat(0xdf);                        
        }                                                                  
}
//=====================================================================================
void KEY()
{
                        //功能鍵
        if(SET==0)
        {
                BUZZ=0;
                delay(10);
                if(SET==0)
                {
                        Mode++;
                        if(Mode==3)
                        Mode=0;
                        BUZZ=1;
                }
                while(SET==0)
                {
                        if(Mode==0)
                                {
                                //        write_1602com(0x80+0x40+6);
                                        write_1602com(0x0c);
                                }        
                        else if(Mode==1)
                                {
                                        write_1602com(0x80+0x40+4);
                                        write_1602com(0x0f);
                                }        
                        else
                                {
                                        write_1602com(0x80+0x40+13);
                                        write_1602com(0x0f);
                                }                                                        
                }
        }
        //增加
        if(ADD==0&&Mode==1)
        {
                BUZZ=0;
                delay(10);
                if(ADD==0)        
                {
                        TH++;
                        if(TH>=99)        
                        TH=99;
                        write_1602com(0x80+0x40+3);
                        write_1602dat(TH/10+0x30);
                        write_1602dat(TH%10+0x30);
                        write_1602com(0x80+0x40+4);        
                        BUZZ=1;
                }
                while(ADD==0);
               
        }
        //減少
        if(DEC==0&&Mode==1)
        {
                BUZZ=0;
                delay(10);
                if(DEC==0)
                {
                        TH--;
                        if(TH==TL)        
                        TH=TL+1;
                        write_1602com(0x80+0x40+3);
                        write_1602dat(TH/10+0x30);
                        write_1602dat(TH%10+0x30);
                        write_1602com(0x80+0x40+4);        
                        BUZZ=1;
                }
                while(DEC==0);
        }
        if(ADD==0&&Mode==2)
        {
                BUZZ=0;
                delay(10);
                if(ADD==0)        
                {
                        TL++;
                        if(TL==TH)        
                        TL=TH-1;
                        write_1602com(0x80+0x40+12);
                        write_1602dat(TL/10+0x30);
                        write_1602dat(TL%10+0x30);
                        write_1602com(0x80+0x40+13);        
                        BUZZ=1;
                }
                while(ADD==0);
               
        }
        //減少
        if(DEC==0&&Mode==2)
        {
                BUZZ=0;
                delay(10);
                if(DEC==0)
                {
                        TL--;
                        if(TL<=0)        
                        TL=0;
                        write_1602com(0x80+0x40+12);
                        write_1602dat(TL/10+0x30);
                        write_1602dat(TL%10+0x30);
                        write_1602com(0x80+0x40+13);        
                        BUZZ=1;
                }
                while(DEC==0);               
        }
}

/*****報(bào)警子程序*****/
void Alarm()
{
        if(x>=10){beep_st=~beep_st;x=0;}
        if(Mode==0)
        {
                if((c/10)>=TH)
                {
//                        ALAM=0;
                        ALAM1=1;
                        if(beep_st==1)
                        BUZZ=0;
                        else
                        BUZZ=1;
                }
                else if((c/10)<TL)
                {
                        ALAM1=0;
//                        ALAM=1;
                        if(beep_st==1)
                        BUZZ=0;
                        else
                        BUZZ=1;
                }
                else
                {
                        BUZZ=1;
                //        ALAM=1;
                        ALAM1=1;               
                }
        }
        else
        {
                BUZZ=1;
                //ALAM=1;
                ALAM1=1;
        }
}

int PID(int Set_value,int Real_value) //標(biāo)準(zhǔn)PID溫度控制算法
{
        float uk ,uk1 ,duk;
        int pid_out,e ,e1 ,e2;
        e=Set_value-Real_value;//誤差量
        duk=Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2);  //+Kd*(e-2e1+e2)
        uk=uk1+duk;
        pid_out=(int)uk;
        uk1=uk;
        e2=e1;
        e1=e;
        if(pid_out>2000) //1000
        {
                pid_out=990;//        990
        }
        else if(pid_out<1000)         //10
        {
                pid_out=1000;                //10
        }
        outp=pid_out;

        return(pid_out);
               
}
void T0_int(void) interrupt 1
{
        TH0= (65535-2000)/256;                                //PWM=1高位初值計(jì)算
        TL0 = (65535-2000)%256;                                          //PWM=1低位初值計(jì)算



        kk++;
        if(kk>2000)
        kk=0;
        if(kk>outp)
        {PWM=1;
        // jia=1;
          }
        else {PWM=0;
             //jia=0;
        }
        
         
}


/*****主函數(shù)*****/
void main(void)
{
        uint z;
        delay(1);
        lcd_init();
        delay(1);
//        InitTimer();    //初始化定時(shí)器
    TMOD=0x01;                        //定時(shí)器0模式1               
        TR0=1;                                                                  
        ET0=1;
        //IT0=1;
//        EX0=1;
        EA=1;
        for(z=0;z<100;z++)
        {
                check_wendu();
                delay(1);        
        }
        PWM=1;
   // jia=1;

        I_term=0;
        last_error=0;
        TH=40;                //初始設(shè)定溫度為41度
        Real_temp=TH*10;

        while(1)
        {
                counter++;
                if(counter>40)        //if(counter>40)
                {
                        test_temp=1;        //進(jìn)行一次溫度檢定
                        counter=0;                                
                }
                if(test_temp)         //溫度檢定標(biāo)志置位,進(jìn)入溫度PID調(diào)節(jié)
                {
                        check_wendu();
                        Real_temp=c; //采集當(dāng)前實(shí)際溫度
                        if(Real_temp>TH*10)
                        PWM=1;
                        else                        
                        PID(TH*10,Real_temp); //PID程序
                        test_temp=0;                                 //檢定完成,清溫度檢定標(biāo)志
                }        

                display();
                KEY();
                Alarm();
               
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:149799 發(fā)表于 2020-3-22 17:38 | 只看該作者
謝謝,適合我初學(xué)者學(xué)習(xí)啊。
回復(fù)

使用道具 舉報(bào)

板凳
ID:420836 發(fā)表于 2020-3-23 02:37 | 只看該作者
你能詳細(xì)告訴我們問題出在哪里嗎? 你的代碼寫得很好
回復(fù)

使用道具 舉報(bào)

地板
ID:190577 發(fā)表于 2020-3-25 09:17 | 只看該作者
TTQ001 發(fā)表于 2020-3-23 02:37
你能詳細(xì)告訴我們問題出在哪里嗎? 你的代碼寫得很好

就是PID這個(gè)幾個(gè)參數(shù)這么設(shè)置出來?
回復(fù)

使用道具 舉報(bào)

5#
ID:89515 發(fā)表于 2020-3-27 07:46 來自手機(jī) | 只看該作者
PID,用繼電器控制不現(xiàn)實(shí)吧,來不到多久就壞了。無法用PWM只能比例控制,那么這里PID沒意義
回復(fù)

使用道具 舉報(bào)

6#
ID:190577 發(fā)表于 2020-3-30 22:24 | 只看該作者
mengzhixinheng 發(fā)表于 2020-3-27 07:46
PID,用繼電器控制不現(xiàn)實(shí)吧,來不到多久就壞了。無法用PWM只能比例控制,那么這里PID沒意義

您好。客戶要求的,那一般用什么控制呢?
回復(fù)

使用道具 舉報(bào)

7#
ID:161164 發(fā)表于 2022-4-2 00:19 | 只看該作者
bbxyliyang 發(fā)表于 2020-3-30 22:24
您好。客戶要求的,那一般用什么控制呢?

固態(tài)繼電器
回復(fù)

使用道具 舉報(bào)

8#
ID:883242 發(fā)表于 2022-4-2 00:22 | 只看該作者
bbxyliyang 發(fā)表于 2020-3-25 09:17
就是PID這個(gè)幾個(gè)參數(shù)這么設(shè)置出來?

搜“Nichols-Ziegler method”
回復(fù)

使用道具 舉報(bào)

9#
ID:883242 發(fā)表于 2022-4-2 00:25 | 只看該作者
mengzhixinheng 發(fā)表于 2020-3-27 07:46
PID,用繼電器控制不現(xiàn)實(shí)吧,來不到多久就壞了。無法用PWM只能比例控制,那么這里PID沒意義

外面廠家要求我的設(shè)備做26萬次全壽命周期壽命試驗(yàn),順便測(cè)出來了國產(chǎn)繼電器實(shí)測(cè)10萬次簧片就酥了,因?yàn)殡娏鬟h(yuǎn)小于額定電流所以我沒實(shí)測(cè)過觸電壽命。但是樓主沒說負(fù)載是什么,用固態(tài)繼電器還是可以的,固態(tài)繼電器沒有壽命的概念,只有MTBF的概念。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 人人爽日日躁夜夜躁尤物 | 欧美三区| 色橹橹欧美在线观看视频高清 | 国产极品粉嫩美女呻吟在线看人 | 国产精品视频免费观看 | 日韩欧美在线一区 | 91久久国产综合久久 | 第一福利社区1024 | 国产日产精品一区二区三区四区 | 国产99久久精品一区二区永久免费 | 国产一级在线观看 | chinese中国真实乱对白 | 国产aⅴ爽av久久久久久久 | 色综合久久天天综合网 | 日本三级电影在线观看视频 | 亚洲视频欧美视频 | 亚洲一区二区三区在线播放 | 亚洲国产成人精品女人久久久野战 | 99视频在线看 | 夜夜骑首页 | 亚洲精品乱码 | 91一区二区 | 日韩精品在线看 | 爱草在线 | 欧美精品一区二区三区四区 在线 | 日韩欧美在线一区二区 | 99精品视频一区二区三区 | 欧美成人综合 | 中文字幕高清一区 | 欧美一级黄色免费看 | 国产精品久久久久久模特 | 成人特级毛片 | 免费国产一区 | 美女天天操 | 中文字幕一区在线 | 99久久精品免费看国产免费软件 | 国产亚洲一区二区精品 | 国产精品波多野结衣 | 久久9精品 | 999观看免费高清www | 中国一级特黄真人毛片 |