欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

增量式pid控制 單片機源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:811720 發(fā)表于 2020-8-6 00:03 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <absacc.h>
  4. #include "define.h"
  5. #include "delay.h"
  6. #include "da0832.h"
  7. #include "DS18B20_5.h"
  8. #include "lcd1602.h"
  9. #include "zlg.h"
  10. #define PMAX 100
  11. #define PMIN 0
  12. typedef struct
  13. {
  14.         char kp,ki,kd;
  15.         int e2,e1,e0;
  16.         long  pa,vpa;
  17. }mypid;
  18. mypid p1;
  19. int final_tem,cur_tem;
  20. //uchar point_on;

  21. //sbit point0=P1^3;
  22. //sbit pout=P1^4;
  23. #define Time_Unit 80
  24. uchar num_unit=0;
  25. uint num100unit=0;
  26. int2char pwm_dtime;
  27. uchar Action();//執(zhí)行控制量
  28. uint Set_Tem4();//設(shè)定4位的溫度值
  29. int PID();//增量式pid算法,輸出為控制量增量p1.vpa 和 p1.pa
  30. void main()
  31. {
  32.         uchar keyv;
  33.         Lcd_Initial();
  34.         Key_Initial();
  35.         p1.kp=50;//pid參數(shù)設(shè)置
  36.         p1.ki=10;
  37.         p1.kd=5;

  38.         da_1=0;
  39.         final_tem=Set_Tem4();//設(shè)定溫度
  40.         p1.pa=0;
  41.         p1.e2=0;
  42.         p1.e1=0;
  43.         p1.e0=0;
  44.         //point_on=100;//不導(dǎo)通

  45.         TR0=0;//開定時器0       
  46.         TMOD=0x11;
  47.         TH0=0xff;
  48.         TL0=0xe0;
  49.         TR0=1;
  50.         IE=IE|0x02;
  51.         EA=1;
  52.         num_unit=0;

  53.         //=======================以上為始化
  54.         while(1)
  55.         {
  56.                 if(key)//查詢按鍵
  57.                 {
  58.                         keyv=Keyscan();
  59.                         if(keyv==15)
  60.                         {       
  61.                                 da_1=0;
  62.                                 final_tem=Set_Tem4();//設(shè)定溫度
  63.                                 p1.pa=0;
  64.                                 p1.e2=0;
  65.                                 p1.e1=0;
  66.                                 p1.e0=0;
  67.                                 //point_on=100;//不導(dǎo)通
  68.                         }
  69.                         else if(keyv==14)//停止加熱
  70.                         {
  71.                                 EA=0;
  72.                                 //pout=0;
  73.                                 da_1=0;
  74.                         }
  75.                 }
  76.                 if((num100unit&0x00ff)==0)//2.56s為周期
  77.                 {
  78.                         Lcd_Puts(1,0,"aim_tem:");
  79.                         Lcd_Putfloat(9,0,3,1,final_tem);
  80.                         cur_tem=GetTemperature();//讀取當前溫度值并顯示
  81.                         Lcd_Puts(1,1,"now_tem:");
  82.                         Lcd_Putfloat(9,1,3,1,cur_tem);
  83.                         PID();//pid控制
  84.                         Action();//控制執(zhí)行
  85.                 }
  86.         }
  87. }
  88. uint Set_Tem4()//設(shè)定4位的溫度值
  89. {
  90.         uchar a,b,c,d;
  91.         Lcd_Clr();
  92.         Lcd_Puts(1,0,"set Tem:");
  93.         while(!key);
  94.         a=Keyscan();
  95.         Lcd_Putint(10,0,1,a);
  96.         while(!key);
  97.         b=Keyscan();
  98.         Lcd_Putint(11,0,1,b);
  99.         while(!key);
  100.         c=Keyscan();
  101.         Lcd_Putint(12,0,1,c);
  102.         while(!key);
  103.         d=Keyscan();
  104.         Lcd_Putint(13,0,1,d);
  105.         return (a*1000+b*100+c*10+d);       
  106. }

  107. void Int_T0()interrupt 1 using 2 //ie0x02//TMOD=0x11;
  108. {
  109.         EA=0;
  110.         TR0=0;       
  111.         pwm_dtime.time=0xffff-Time_Unit;
  112.         TH0=pwm_dtime.hl[0];
  113.         TL0=pwm_dtime.hl[1];//定時us
  114.         TR0=1;//開定時器0
  115.         //t0f=1;//標志置1
  116.         /*if(point0==0)//查詢到0點
  117.         {
  118.                 num_unit=0;
  119.         }*/
  120.         if(num_unit==100)
  121.         {
  122.                 num_unit=0;
  123.                 num100unit++;
  124.         }
  125.         /*if(num_unit==0)//0點不導(dǎo)通
  126.         {
  127.                 pout=0;
  128.         }
  129.         if(num_unit==point_on)//導(dǎo)通點
  130.         {
  131.                 pout=1;
  132.         }*/
  133.         num_unit++;
  134.         EA=1;
  135. }
  136. int PID()//增量式pid算法,輸出為控制量增量p1.vpa 和 p1.pa
  137. {
  138.         p1.e2=final_tem - cur_tem;
  139.         p1.vpa=p1.kp*((long)p1.e2-p1.e1)
  140.                         +p1.ki*(long)p1.e2
  141.                         +p1.kd*((long)p1.e2+p1.e0-2*p1.e1);
  142.         p1.e1=p1.e2;
  143.         p1.e0=p1.e1;
  144.         p1.pa+=p1.vpa;
  145. }
  146. uchar Action()//執(zhí)行控制量
  147. {
  148.         long temp;
  149.         if(p1.pa>0)//控制量大于0
  150.         {
  151.                 temp=p1.pa;
  152.                 temp=temp>>5;
  153.                 if(temp>PMAX)//完全導(dǎo)通
  154.                 {
  155.                         //point_on=0;
  156.                         da_1=255;
  157.                 }
  158.                 else if(temp<PMIN)//完全截至
  159.                 {
  160.                         //point_on=100;
  161.                         da_1=0;
  162.                 }
  163.                 else
  164.                 {
  165.                         //point_on=100*(PMAX-temp)/(PMAX-PMIN);
  166.                         da_1=255*temp/(PMAX-PMIN);
  167.                 }
  168.         }
  169.         else
  170.         {
  171.                 //point_on=100;//完全截至
  172.                 da_1=0;
  173.         }
  174.         return 1;
  175. }
復(fù)制代碼

所有資料51hei提供下載:
增量式pid-da控制.rar (56.58 KB, 下載次數(shù): 50)


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

使用道具 舉報

無效樓層,該帖已經(jīng)被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表