找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9268|回复: 12
收起左侧

模糊PID控制温控系统仿真设计C程序代码

  [复制链接]
ID:290037 发表于 2018-3-10 14:37 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. /********************************************************************

  2. 模糊PID控制温控系统仿真设计C程序代码

  3. ********************************************************************/

  4. #include<reg52.h>
  5. #define uchar unsigned char                               
  6. #define uint unsigned int
  7. #define PULSE 200                       
  8. #define number 0.035      
  9. sbit SDO = P2^0;                          
  10. sbit SDI = P2^1;                               
  11. sbit CS  = P2^2;
  12. sbit CLK = P2^3;
  13. sbit EOC = P2^4;
  14. sbit RS  = P2^5;                          
  15. sbit RW  = P2^6;
  16. sbit EN  = P2^7;
  17. sbit KEY1= P3^0;       
  18. sbit KEY2= P3^1;                          
  19. sbit KEY3= P3^2;
  20. sbit KEY4= P3^3;
  21. sbit KEY5= P3^4;                          
  22. sbit IN1 = P3^5;                                  
  23. sbit IN2 = P3^6;
  24. sbit ENA = P3^7;
  25. uchar flag;                                        
  26. uchar flag_start;                               
  27. float S_temp=60.0;                          
  28. float P_temp=20.0;                          
  29. float Kp;                               
  30. float Ki;
  31. float Kd;
  32. float Err=0.0;                               
  33. float Last_Err=0.0;
  34. float D_Err=0.0;
  35. float Sum_Err=0.0;
  36. float U=0.0;
  37. /******************************
  38.         函数功能:延时
  39. ******************************/
  40. void delay_ms(uchar z)                       
  41. {
  42.    uchar i;
  43.    uchar j;
  44.    for(i=z;i>0;i--)
  45.      for(j=360;j>0;j--);                                                                          
  46. }
  47. void delay_us(uchar z)                       
  48. {
  49.    uchar i;
  50.    for(i=z;i>0;i--);
  51. }

  52. void LCD_WriteData(uchar Dat)               
  53. {
  54.    RS = 1;
  55.    P1 = Dat;
  56.    delay_us(10);
  57.    EN = 1;
  58.    delay_us(10);
  59.    EN = 0;
  60. }

  61. void LCD_WriteCOM(uchar com)                                   
  62. {
  63.    RS = 0;
  64.    P1 = com;
  65.    delay_us(10);
  66.    EN = 1;
  67.    delay_us(10);
  68.    EN = 0;
  69. }

  70. void Show_Num(uchar x,uchar y,uchar n,float num)       
  71. {
  72.    uchar a[3];
  73.    uchar i;
  74.    uint Temp;
  75.    Temp=(int)num;
  76.    for(i=0;i<n;i++)
  77.      {
  78.            a[i] = Temp%10;
  79.            Temp = Temp/10;
  80.          }
  81.    if(y%2 == 1)
  82.            LCD_WriteCOM(0x80+x);
  83.          else
  84.            LCD_WriteCOM(0x80+0x40+x);
  85.          for(i=n;i>0;i--)
  86.        LCD_WriteData(a[i-1]+0x30);  
  87. }
  88. void Show_Ki(uchar num_Ki)               
  89. {       
  90.         uchar Temp;
  91.         num_Ki=Ki*100;
  92.         Temp=(uchar)num_Ki;
  93.     Show_Num(10,2,1,Temp%10);
  94.         Temp=Temp/10;
  95.         Show_Num(9,2,1,Temp%10);                     
  96.         Temp=Temp/10;
  97.         Show_Num(7,2,1,Temp);
  98. }

  99. void Show_char(uchar x,uchar y,uchar ch)               
  100. {
  101.    if(y%2 == 1)
  102.            LCD_WriteCOM(0x80+x);
  103.          else
  104.            LCD_WriteCOM(0x80+0x40+x);
  105.    LCD_WriteData(ch);  
  106. }

  107. void LCD_Init(void)                       
  108. {
  109.    RW = 0;
  110.    EN = 0;
  111.    LCD_WriteCOM(0x38);
  112.    LCD_WriteCOM(0x0c);
  113.    LCD_WriteCOM(0x06);
  114.    LCD_WriteCOM(0x01);
  115. }

  116. /***********************************
  117.        函数功能:显示函数
  118. *************************************/
  119. void LCD_display(void)                                
  120. {
  121.    Show_char(1,1,'T');                               
  122.    delay_us(10);
  123.    Show_char(0,1,'P');                 
  124.    delay_us(10);
  125.    Show_char(1,1,'T');
  126.    delay_us(10);
  127.    Show_char(2,1,':');
  128.    delay_us(10);
  129.    Show_Num(3,1,3,P_temp);
  130.    delay_us(10);
  131.    Show_char(10,1,'S');                              
  132.    delay_us(10);
  133.    Show_char(11,1,'T');
  134.    delay_us(10);
  135.    Show_char(12,1,':');
  136.    delay_us(10);
  137.    Show_Num(13,1,3,S_temp);          
  138.    delay_us(10);
  139.    Show_char(0,2,'P');                                 
  140.    delay_us(10);
  141.    Show_char(1,2,':');
  142.    delay_us(10);
  143.    Show_Num(2,2,2,Kp);                           
  144.    delay_us(10);
  145.    Show_char(5,2,'I');                                 
  146.    delay_us(10);
  147.    Show_char(6,2,':');
  148.    delay_us(10);
  149.    Show_char(8,2,'.');
  150.    delay_us(10);
  151.    Show_Ki(Ki);
  152.    delay_us(10);
  153.    Show_char(12,2,'D');                              
  154.    delay_us(10);
  155.    Show_char(13,2,':');
  156.    delay_us(10);
  157.    Show_Num(14,2,2,Kd);               
  158.    delay_us(10);
  159. }

  160. /************************************
  161.         函数功能:定时器2初始化
  162. *************************************/
  163. void Timer2_Init()                               
  164. {
  165.   RCAP2H =(65536-300)/256;
  166.   RCAP2L =(65536-300)%256;
  167.   TH2 = RCAP2H;
  168.   TL2 = RCAP2L;
  169.   ET2 = 1;
  170.   TR2 = 1;
  171.   EA = 1;
  172. }
  173. /*************************************
  174.    函数功能:键盘扫描,调整设置温度
  175. ****************************************/
  176. void key_scan(void)                                       
  177. {
  178.         if(KEY1==0)                                             
  179.         {
  180.                 delay_ms(1);
  181.                 if(KEY1==0)
  182.                 {
  183.                         S_temp=S_temp+1;
  184.                         if(S_temp>=200)
  185.                                 S_temp=200;
  186.                         while(!KEY1);
  187.                 }
  188.         }       
  189.         if(KEY2==0)                                                       
  190.         {
  191.                 delay_ms(1);
  192.                 if(KEY2==0)
  193.                 {
  194.                         if(S_temp>0)
  195.                                 S_temp=S_temp-1;
  196.                         else if(S_temp<=0)
  197.                                 S_temp=0;
  198.                         while(!KEY2);
  199.                 }
  200.         }

  201.         if(KEY3==0)                                             
  202.         {
  203.                 delay_ms(1);
  204.                 if(KEY3==0)
  205.                 {
  206.                         if(S_temp<=190)
  207.                                 S_temp=S_temp+10;
  208.                         while(!KEY3);
  209.                 }
  210.         }                                                                                 
  211.         if(KEY4==0)                                             
  212.         {                                                                                    
  213.                 delay_ms(1);
  214.                 if(KEY4==0)
  215.                 {
  216.                         if(S_temp>=10)       
  217.                                 S_temp=S_temp-10;
  218.                         while(!KEY4);
  219.                 }
  220.         }
  221.         if(KEY5==0)                    
  222.         {
  223.                 delay_ms(1);
  224.                 if(KEY5==0)
  225.                 {
  226.                         flag_start=1;               
  227.                         while(!KEY5);
  228.                 }
  229.         }       
  230. }
  231. /************************************
  232.         函数功能:PID的计算
  233. **********************************/
  234. void PID_Calculate()
  235. {           
  236.           Err = S_temp - P_temp;
  237.           Sum_Err += Err;
  238.           D_Err = Err - Last_Err;            
  239.           Last_Err = Err;
  240.           U=Kp*Err+Ki*Sum_Err+Kd*D_Err;                  
  241.           U=(int)U;
  242.           if(U>=0)
  243.           {
  244.                   if(U>=200)
  245.                         U=200;
  246.                 flag=1;
  247.           }                                  
  248.           else
  249.           {
  250.                 U=-U;
  251.                 if(U>=200)
  252.                         U=200;
  253.                 flag=0;
  254.                 }
  255. }
  256. /***********************************************
  257.          函数功能:PID参数Kp的计算
  258. ************************************************/
  259. float fuzzy_kp(float e, float ec)                                //e,ec,表示误差,误差变化率
  260. {                                                                                                          
  261.         float Kp_calcu;
  262.         uchar num,pe,pec;
  263.         float code eRule[7]={-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0};   //误差E的模糊论域
  264.         float code ecRule[7]={-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0}; //误差变化率EC的模糊论域
  265.         float eFuzzy[2]={0.0,0.0};                                    //隶属于误差E的隶属程度
  266.         float ecFuzzy[2]={0.0,0.0};            //隶属于误差变化率EC的隶属程度
  267.         float code kpRule[4]={0.0,8.0,16.0,24.0};                        //Kp的模糊子集
  268.         float KpFuzzy[4]={0.0,0.0,0.0,0.0};                                //隶属于Kp的隶属程度
  269.         int code KpRule[7][7]=                                                          //Kp的模糊控制表
  270.         {
  271.                 3,3,3,3,3,3,3,
  272.                 2,2,2,2,1,2,2,
  273.                 1,1,1,1,1,1,1,
  274.                 1,1,0,1,0,1,1,
  275.                 0,0,1,0,0,1,0,
  276.                 0,1,0,1,0,0,2,
  277.                 3,3,3,3,3,3,3
  278.         };
  279.    /*****误差E隶属函数描述*****/          
  280.    if(e<eRule[0])                                                       
  281.         {
  282.                 eFuzzy[0] =1.0;
  283.                 pe = 0;
  284.         }
  285.         else if(eRule[0]<=e && e<eRule[1])
  286.         {
  287.                 eFuzzy[0] = (eRule[1]-e)/(eRule[1]-eRule[0]);
  288.                 pe = 0;
  289.         }
  290.         else if(eRule[1]<=e && e<eRule[2])
  291.         {
  292.                 eFuzzy[0] = (eRule[2] -e)/(eRule[2]-eRule[1]);
  293.                 pe = 1;
  294.         }
  295.         else if(eRule[2]<=e && e<eRule[3])
  296.         {
  297.                 eFuzzy[0] = (eRule[3] -e)/(eRule[3]-eRule[2]);
  298.                 pe = 2;
  299.         }
  300.     else if(eRule[3]<=e && e<eRule[4])
  301.     {   eFuzzy[0] = (eRule[4]-e)/(eRule[4]-eRule[3]);
  302.         pe = 3;
  303.     }
  304.         else if(eRule[4]<=e && e<eRule[5])
  305.         {
  306.                 eFuzzy[0] = (eRule[5]-e)/(eRule[5]-eRule[4]);
  307.                 pe = 4;
  308.         }
  309.         else if(eRule[5]<=e && e<eRule[6])
  310.         {
  311.                 eFuzzy[0] = (eRule[6]-e)/(eRule[6]-eRule[5]);
  312.                 pe = 5;
  313.         }
  314.         else
  315.         {
  316.                 eFuzzy[0] =0.0;
  317.                 pe =5;
  318.         }
  319.     eFuzzy[1] =1.0 - eFuzzy[0];
  320.         /*****误差变化率EC隶属函数描述*****/                                 
  321.         if(ec<ecRule[0])                                                       
  322.         {
  323.                 ecFuzzy[0] =1.0;
  324.                 pec = 0;
  325.         }
  326.         else if(ecRule[0]<=ec && ec<ecRule[1])
  327.         {
  328.                 ecFuzzy[0] = (ecRule[1] - ec)/(ecRule[1]-ecRule[0]);
  329.                 pec = 0 ;
  330.         }
  331.         else if(ecRule[1]<=ec && ec<ecRule[2])
  332.         {
  333.                 ecFuzzy[0] = (ecRule[2] - ec)/(ecRule[2]-ecRule[1]);
  334.                 pec = 1;
  335.         }
  336.         else if(ecRule[2]<=ec && ec<ecRule[3])
  337.         {
  338.                 ecFuzzy[0] = (ecRule[3] - ec)/(ecRule[3]-ecRule[2]);
  339.                 pec = 2 ;
  340.         }
  341.     else if(ecRule[3]<=ec && ec<ecRule[4])
  342.     {   ecFuzzy[0] = (ecRule[4]-ec)/(ecRule[4]-ecRule[3]);
  343.         pec=3;
  344.     }
  345.         else if(ecRule[4]<=ec && ec<ecRule[5])
  346.     {   ecFuzzy[0] = (ecRule[5]-ec)/(ecRule[5]-ecRule[4]);
  347.         pec=4;
  348.     }
  349.         else if(ecRule[5]<=ec && ec<ecRule[6])
  350.     {   ecFuzzy[0] = (ecRule[6]-ec)/(ecRule[6]-ecRule[5]);
  351.         pec=5;
  352.     }
  353.         else
  354.         {
  355.                 ecFuzzy[0] =0.0;
  356.                 pec = 5;
  357.         }
  358.         ecFuzzy[1] = 1.0 - ecFuzzy[0];
  359.         /*********查询模糊规则表*********/                       
  360.         num =KpRule[pe][pec];
  361.         KpFuzzy[num] += eFuzzy[0]*ecFuzzy[0];
  362.         num =KpRule[pe][pec+1];
  363.         KpFuzzy[num] += eFuzzy[0]*ecFuzzy[1];       
  364.         num =KpRule[pe+1][pec];
  365.         KpFuzzy[num] += eFuzzy[1]*ecFuzzy[0];
  366.         num =KpRule[pe+1][pec+1];
  367.         KpFuzzy[num] += eFuzzy[1]*ecFuzzy[1];
  368.   /*********加权平均法解模糊*********/           Kp_calcu=KpFuzzy[0]*kpRule[0]+KpFuzzy[1]*kpRule[1]+KpFuzzy[2]*kpRule[2]
  369. +KpFuzzy[3]*kpRule[3];
  370.   return(Kp_calcu);
  371. }
  372. /***********************************************
  373.          函数功能:PID参数Ki的计算
  374. ************************************************/
  375. float fuzzy_ki(float e, float ec)                                        
  376. {
  377.         float Ki_calcu;
  378.         uchar num,pe,pec;
  379.         float code eRule[7]={-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0};       
  380.         float code ecRule[7]={-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0};
  381.         float eFuzzy[2]={0.0,0.0};                                       
  382.         float ecFuzzy[2]={0.0,0.0};            
  383.         float code kiRule[4]={0.00,0.01,0.02,0.03};                    
  384.         float KiFuzzy[4]={0.0,0.0,0.0,0.0};                       
  385.         int code KiRule[7][7]=                                               
  386.         {
  387.                 0,0,0,0,0,0,0,
  388.                 0,0,0,0,0,0,0,
  389.                 0,0,0,0,0,0,0,
  390.                 0,0,0,0,0,0,0,
  391.                 0,0,0,0,0,0,0,
  392.                 2,0,0,0,0,0,1,
  393.                 3,3,3,3,3,3,3
  394.         };
  395.    /*****误差隶属函数描述*****/
  396.   if(e<eRule[0])                                                       
  397.         {
  398.                 eFuzzy[0] =1.0;
  399.                 pe = 0;
  400.         }
  401.         else if(eRule[0]<=e && e<eRule[1])
  402.         {
  403.                 eFuzzy[0] = (eRule[1]-e)/(eRule[1]-eRule[0]);
  404.                 pe = 0;
  405.         }
  406.         else if(eRule[1]<=e && e<eRule[2])
  407.         {
  408.                 eFuzzy[0] = (eRule[2] -e)/(eRule[2]-eRule[1]);
  409.                 pe = 1;
  410.         }
  411.         else if(eRule[2]<=e && e<eRule[3])
  412.         {
  413.                 eFuzzy[0] = (eRule[3] -e)/(eRule[3]-eRule[2]);
  414.                 pe = 2;
  415.         }
  416.     else if(eRule[3]<=e && e<eRule[4])
  417.     {   eFuzzy[0] = (eRule[4]-e)/(eRule[4]-eRule[3]);
  418.         pe = 3;
  419.     }
  420.         else if(eRule[4]<=e && e<eRule[5])
  421.         {
  422.                 eFuzzy[0] = (eRule[5]-e)/(eRule[5]-eRule[4]);
  423.                 pe = 4;
  424.         }
  425.         else if(eRule[5]<=e && e<eRule[6])
  426.         {
  427.                 eFuzzy[0] = (eRule[6]-e)/(eRule[6]-eRule[5]);
  428.                 pe = 5;
  429.         }
  430.         else
  431.         {
  432.                 eFuzzy[0] =0.0;
  433.                 pe =5;
  434.         }
  435.     eFuzzy[1] =1.0 - eFuzzy[0];
  436.         /*****误差变化隶属函数描述*****/                                 
  437.         if(ec<ecRule[0])                                                       
  438.         {
  439.                 ecFuzzy[0] =1.0;
  440.                 pec = 0;
  441.         }
  442.         else if(ecRule[0]<=ec && ec<ecRule[1])
  443.         {
  444.                 ecFuzzy[0] = (ecRule[1] - ec)/(ecRule[1]-ecRule[0]);
  445.                 pec = 0 ;
  446.         }
  447.         else if(ecRule[1]<=ec && ec<ecRule[2])
  448.         {
  449.                 ecFuzzy[0] = (ecRule[2] - ec)/(ecRule[2]-ecRule[1]);
  450.                 pec = 1;
  451.         }
  452.         else if(ecRule[2]<=ec && ec<ecRule[3])
  453.         {
  454.                 ecFuzzy[0] = (ecRule[3] - ec)/(ecRule[3]-ecRule[2]);
  455.                 pec = 2 ;
  456.         }
  457.     else if(ecRule[3]<=ec && ec<ecRule[4])
  458.     {   ecFuzzy[0] = (ecRule[4]-ec)/(ecRule[4]-ecRule[3]);
  459.         pec=3;
  460.     }
  461.         else if(ecRule[4]<=ec && ec<ecRule[5])
  462.     {   ecFuzzy[0] = (ecRule[5]-ec)/(ecRule[5]-ecRule[4]);
  463.         pec=4;
  464.     }
  465.         else if(ecRule[5]<=ec && ec<ecRule[6])
  466.     {   ecFuzzy[0] = (ecRule[6]-ec)/(ecRule[6]-ecRule[5]);
  467.         pec=5;
  468.     }
  469.         else
  470.         {
  471.                 ecFuzzy[0] =0.0;
  472.                 pec = 5;
  473.         }
  474.         ecFuzzy[1] = 1.0 - ecFuzzy[0];
  475.         /***********查询模糊规则表***************/                       
  476.         num =KiRule[pe][pec];
  477.         KiFuzzy[num] += eFuzzy[0]*ecFuzzy[0];
  478.         num =KiRule[pe][pec+1];
  479.         KiFuzzy[num] += eFuzzy[0]*ecFuzzy[1];       
  480.         num =KiRule[pe+1][pec];
  481.         KiFuzzy[num] += eFuzzy[1]*ecFuzzy[0];
  482.         num =KiRule[pe+1][pec+1];
  483.         KiFuzzy[num] += eFuzzy[1]*ecFuzzy[1];
  484.         /********加权平均法解模糊********/           Ki_calcu=KiFuzzy[0]*kiRule[0]+KiFuzzy[1]*kiRule[1]+KiFuzzy[2]*kiRule[2]
  485. +KiFuzzy[3]*kiRule[3];
  486.     return(Ki_calcu);
  487. }
  488. /***********************************************
  489.          函数功能:PID参数Kd的计算
  490. ************************************************/
  491. float fuzzy_kd(float e, float ec)                                     
  492. {
  493.         float Kd_calcu;
  494.         uchar num,pe,pec;   
  495.         float code eRule[7]={-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0};       
  496.         float code ecRule[7]={-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0};
  497.         float eFuzzy[2]={0.0,0.0};                                       
  498.         float ecFuzzy[2]={0.0,0.0};                  
  499.         float code kdRule[4]={0.0,1.0,2.0,3.0};                       
  500.         float KdFuzzy[4]={0.0,0.0,0.0,0.0};               
  501.         int code KdRule[7][7]=                                       
  502.         {
  503.                 3,3,3,2,2,2,2,
  504.                 2,2,2,1,1,1,1,
  505.                 1,1,2,1,1,2,1,
  506.                 1,1,0,1,0,1,1,
  507.                 1,1,0,0,0,1,1,
  508.                 2,2,1,0 ,1,1,1,
  509.                 3,3,3,3,2,3,2                       
  510.         };
  511.    /*****误差隶属函数描述*****/
  512.         if(e<eRule[0])                                                       
  513.         {
  514.                 eFuzzy[0] =1.0;
  515.                 pe = 0;
  516.         }
  517.         else if(eRule[0]<=e && e<eRule[1])
  518.         {
  519.                 eFuzzy[0] = (eRule[1]-e)/(eRule[1]-eRule[0]);
  520.                 pe = 0;
  521.         }
  522.         else if(eRule[1]<=e && e<eRule[2])
  523.         {
  524.                 eFuzzy[0] = (eRule[2] -e)/(eRule[2]-eRule[1]);
  525.                 pe = 1;
  526.         }
  527.         else if(eRule[2]<=e && e<eRule[3])
  528.         {
  529.                 eFuzzy[0] = (eRule[3] -e)/(eRule[3]-eRule[2]);
  530.                 pe = 2;
  531.         }
  532.     else if(eRule[3]<=e && e<eRule[4])
  533.     {   eFuzzy[0] = (eRule[4]-e)/(eRule[4]-eRule[3]);
  534.         pe = 3;
  535.     }
  536.         else if(eRule[4]<=e && e<eRule[5])
  537.         {
  538.                 eFuzzy[0] = (eRule[5]-e)/(eRule[5]-eRule[4]);
  539.                 pe = 4;
  540.         }
  541.         else if(eRule[5]<=e && e<eRule[6])
  542.         {
  543.                 eFuzzy[0] = (eRule[6]-e)/(eRule[6]-eRule[5]);
  544.                 pe = 5;
  545.         }
  546.         else
  547.         {
  548.                 eFuzzy[0] =0.0;
  549.                 pe =5;
  550.         }
  551.     eFuzzy[1] =1.0 - eFuzzy[0];
  552.    
  553.         /*****误差变化隶属函数描述*****/                                 
  554.         if(ec<ecRule[0])                                                               
  555.         {
  556.                 ecFuzzy[0] =1.0;
  557.                 pec = 0;
  558.         }
  559.         else if(ecRule[0]<=ec && ec<ecRule[1])
  560.         {
  561.                 ecFuzzy[0] = (ecRule[1] - ec)/(ecRule[1]-ecRule[0]);
  562.                 pec = 0 ;
  563.         }
  564.         else if(ecRule[1]<=ec && ec<ecRule[2])
  565.         {
  566.                 ecFuzzy[0] = (ecRule[2] - ec)/(ecRule[2]-ecRule[1]);
  567.                 pec = 1;
  568.         }
  569.         else if(ecRule[2]<=ec && ec<ecRule[3])
  570.         {
  571.                 ecFuzzy[0] = (ecRule[3] - ec)/(ecRule[3]-ecRule[2]);
  572.                 pec = 2 ;
  573.         }
  574.     else if(ecRule[3]<=ec && ec<ecRule[4])
  575.     {   ecFuzzy[0] = (ecRule[4]-ec)/(ecRule[4]-ecRule[3]);
  576.         pec=3;
  577.     }
  578.         else if(ecRule[4]<=ec && ec<ecRule[5])
  579.     {   ecFuzzy[0] = (ecRule[5]-ec)/(ecRule[5]-ecRule[4]);
  580.         pec=4;
  581.     }
  582.         else if(ecRule[5]<=ec && ec<ecRule[6])
  583.     {   ecFuzzy[0] = (ecRule[6]-ec)/(ecRule[6]-ecRule[5]);
  584.         pec=5;
  585.     }
  586.         else
  587.         {
  588.                 ecFuzzy[0] =0.0;
  589.                 pec = 5;
  590.         }
  591.         ecFuzzy[1] = 1.0 - ecFuzzy[0];
  592.         /***********查询模糊规则表*************/                                                       
  593.         num =KdRule[pe][pec];
  594.         KdFuzzy[num] += eFuzzy[0]*ecFuzzy[0];
  595.         num =KdRule[pe][pec+1];
  596.         KdFuzzy[num] += eFuzzy[0]*ecFuzzy[1];       
  597.         num =KdRule[pe+1][pec];
  598.         KdFuzzy[num] += eFuzzy[1]*ecFuzzy[0];
  599.         num =KdRule[pe+1][pec+1];
  600.         KdFuzzy[num] += eFuzzy[1]*ecFuzzy[1];
  601.         /********加权平均法解模糊********/
  602.             Kd_calcu=KdFuzzy[0]*kdRule[0]+KdFuzzy[1]*kdRule[1]+KdFuzzy[2]*kdRule[2]
  603. +KdFuzzy[3]*kdRule[3];
  604.     return(Kd_calcu);
  605. }
  606. /*****************************************
  607. 函数功能:AD将采集到的温度进行转化
  608. ********************************************/
  609. uint read_tlc2543(uchar port)
  610. {                                                                                                                               
  611.    static uchar PORT = 0;
  612.    uchar Temp,i,k=0;
  613.    uint AD_value=0;
  614.    Temp = port;
  615.    CS = 1;
  616.    CLK = 0;
  617.    Temp<<=4;
  618.    CS = 0;
  619.      while(1)
  620.           {
  621.              for(i=0;i<8;i++)
  622.               {
  623.                    CLK = 0;
  624.                    if(Temp&0x80)
  625.                       SDI = 1;
  626.                          else
  627.                           SDI = 0;
  628.                         AD_value<<=1;
  629.                     if(SDO)
  630.                           AD_value |= 0x01;
  631.                    CLK = 1;
  632.                    Temp<<=1;
  633.                   }
  634.             for(i=8;i<12;i++)
  635.                   {
  636.                    CLK = 0;
  637.                    AD_value<<=1;
  638.                    if(SDO)
  639.                      AD_value |= 0x01;
  640.                    delay_us(10);
  641.                    CLK = 1;
  642.                   }
  643.              CLK = 0;
  644.              CS = 1;
  645.                  if(PORT == port)
  646.                     break;
  647.                   else
  648.                      {
  649.                              Temp = port;
  650.                                  Temp<<=4;
  651.                                  delay_us(10);
  652.                                  CS = 0;
  653.                              AD_value = 0;
  654.                          }
  655.                   k++;
  656.                   if(k>2)
  657.                    {
  658.                      PORT = port;
  659.                    }
  660.           }
  661.    return AD_value;
  662. }
  663. float AD_deal(void)
  664. {
  665.    uint AD_value;
  666.    float temp;
  667.    AD_value = read_tlc2543(0x00);
  668.    temp = AD_value*number;
  669.    return temp;
  670. }
  671. /*********主函数**********/
  672. void main(void)
  673.   {
  674.          uchar AD_value=0;
  675.          flag=0;
  676.    flag_start=0;
  677.          ENA=1;
  678.          IN1=0;
  679.          IN2=0;       
  680.          LCD_Init();
  681.          LCD_display();
  682.          Timer2_Init();
  683.          while(1)
  684.          {       
  685.                 if(flag_start==0)
  686.                 {
  687.                         key_scan();
  688.                         Show_Num(13,1,3,S_temp);
  689.                         Show_Num(3,1,3,P_temp);
  690.                 }
  691.                 else if(flag_start==1)
  692.                 {
  693.                         P_temp=AD_deal();
  694.                         Show_Num(3,1,3,P_temp);
  695.                         PID_Calculate();
  696.                         Kp=fuzzy_kp(Err/5,D_Err);                            //E量化因子5
  697.                         Ki=fuzzy_ki(Err/5,D_Err);
  698.                         Kd=fuzzy_kd(Err/5,D_Err);
  699.                         Show_Num(2,2,2,Kp);       
  700.                         Show_Ki(Ki);          
  701.                 Show_Num(14,2,2,Kd);                  
  702.                         key_scan();
  703.                         Show_Num(13,1,3,S_temp);
  704.                 }
  705.          }
  706.   }
  707. /***************定时器2中断**************/
  708. void timer2() interrupt 5
  709. {
  710.    static uchar num1=0;
  711.    TF2 = 0;
  712.    num1++;
  713.    if(num1<=U)                               
  714.       {
  715.             if(flag==1)                 
  716.                  {
  717.             IN1 = 0;                       
  718.                         IN2 = 1;
  719.                  }
  720.                  else                                               
  721.                  {
  722.                     IN1 = 1;                       
  723.                         IN2 = 0;
  724.                  }
  725.           }
  726.         else                                       
  727.            ENA=0;
  728.    if(num1>PULSE)               
  729.           {num1=0;ENA=1;}  
  730. }                       
复制代码

所有资料51hei提供下载:
模糊PID控制温控系统设计C语言程序代码.doc (120.5 KB, 下载次数: 209)
回复

使用道具 举报

ID:318049 发表于 2018-5-13 22:27 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:20672 发表于 2018-9-30 14:12 | 显示全部楼层
谢谢楼主。。。
回复

使用道具 举报

ID:391730 发表于 2019-1-25 11:06 | 显示全部楼层
楼主,你的PID参数整定,初始值时如何设置的?
回复

使用道具 举报

ID:391730 发表于 2019-1-25 11:28 | 显示全部楼层
楼主,这个代码的主程序中没有ad采集数据,没有采集数据就没有反馈,没有反馈的PID能叫PID么?请问楼主是如何实现控制过程的?
回复

使用道具 举报

ID:351610 发表于 2019-4-18 16:04 | 显示全部楼层
楼主你这个 是负偏差吗    误差 = 设定值 减去 实际值吗   
可是为什么KP整定那边  当误差 是NB 的时候 KP却是最大呢   还是你用的是负误差啊
回复

使用道具 举报

ID:517204 发表于 2019-5-15 02:24 来自手机 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:527827 发表于 2019-5-20 17:50 | 显示全部楼层
这程序有问题,规则表里的数值全是大于0的值,也就是说没有关于负方向的调节
回复

使用道具 举报

ID:618513 发表于 2020-3-19 10:43 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:715767 发表于 2020-3-27 21:16 | 显示全部楼层
为什么我运行的报错非常多?
回复

使用道具 举报

ID:727302 发表于 2020-4-12 02:08 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:97678 发表于 2020-4-12 09:08 | 显示全部楼层
怎么不发原理图?
发一份原理图。
回复

使用道具 举报

ID:162050 发表于 2020-4-17 14:46 | 显示全部楼层
不错的,只是还不明白啊,,,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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