⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 temperature_control.c

📁 此为本人今期一个项目的部分C51源程序
💻 C
字号:


#include <STC12C5412.H>
#include <port.h>
#include <stc12c5412ad_adc.h>
 
 
 #define Kc  1    //Temperature_Control_Value的放大倍数
 
 typedef struct Temperature {
              float    SetPoint;           //  设定目标 Desired Value
              float    tt;                 //  测量值     
              unsigned int j;              //扩大100倍整型
              float    LastError;          //  基本偏差 e[t]
              float    PrevError;          //  上次偏差 e[t-1]
              unsigned char  Temperature_Control_Value; //温度控制量
                      	        
 };
 struct Temperature  My_Temperature={37.0,20.0, 0.0, 0.0,10};
 
//在pressure.c中定义的数据结构 
 struct Pressure{
    unsigned int  Pressure;         //扩大100倍的水压值
    unsigned char Pressure_Mode;        //设定的水压级别
    unsigned int  Pressure_control_time_count;    //压强调整超过一定的次数后
                                                  //仍不行,则报警
    unsigned char xx;                  //当前角度
    unsigned char yy;                  //目标角度
 };
 extern struct Pressure  My_Pressure;

 //static float Error,dError;
 extern float Error,dError;
 static lastTemperatureSetPoint=0;
 static unsigned char a=0;
 static signed char b=0;
 
                       //Fuzzy_Error     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12 
                       //            10.0,5.0,2.0,1.5,1.0, 0.5, 0, -0.5 ,-1.0,-1.5,-2, -5, 
 signed char code Fuzzy_Control_Tab[13][13]={                                                //Fuzzy_dError
                                       6,  5,  5,  4,  4,  3,  2,  1,  1,  0,  0,  0,  0,    // -1.8~-      0  
                                       5,  5,  4,  4,  3,  3,  3,  1,  1,  0,  0,  0,  0,    // -1.8~-1.4   1
                                       6,  5,  4,  3,  3,  3,  3,  1,  1,  0,  0,  0,  0,    // -1.4~-1.0   2
                                       5,  5,  5,  3,  3,  3,  2,  1,  1,  0, -1, -1, -1,    // -1.0~0.6    3
                                       6,  5,  5,  3,  2,  2,  1,  0,  0, -1, -2, -2, -2,    // -0.6~0.2    4
                                       6,  5,  3,  2,  1,  1,  0, -1, -1, -2, -3, -3, -4,    // -0.2~0      5 
                                       6,  5,  4,  3,  2,  1,  0, -1, -2, -2, -3, -4, -4,    // 0           6
                                       3,  4,  3,  2,  1,  0,  0, -1, -2, -3, -3, -4, -6,    // 0~0.2       7
                                       3,  3,  3,  2,  1,  0,  0, -1, -2, -2, -4, -3, -6,    // 0.2~0.4     8
                                       1,  1,  1,  0,  0,  0, -1, -1, -2, -3, -3, -3, -5,    // 0.4~1.0     9
                                       0,  0,  0, -1, -1, -2, -3, -3, -3, -5, -6, -5, -6,    // 1.0~1.4     10
                                       0,  0,  0, -1, -1, -2, -3, -3, -3, -5, -6, -5, -6,     // 1.8~2.0    11
                                       0,  0,  0, -1, -1, -1, -3, -3, -3, -5, -6, -5, -6      //2.0~+       12 
                                       };
/*----------------------------------------------------------------------------------
                              读取温度
------------------------------------------------------------------------------------*/                                      
/*----------------------------------------------------------------------------------
                              读取温度
------------------------------------------------------------------------------------*/                                      
void Read_Temperature(void)
{
  unsigned int    My_ADC_Result;
  My_ADC_Result=stc12c512ad(2);       //p1.2为温度检测端口
  //My_Temperature.tt=(482.4*(3.00-(0.0117*My_ADC_Result))-312.3);//3.00为单片机供电电压  8位转换精度
  My_Temperature.tt=5.02-(5.02/1024)* My_ADC_Result;
  My_Temperature.tt=216.93*My_Temperature.tt-163.52;
  My_Temperature.j=(unsigned int)My_Temperature.tt;
  My_Temperature.tt=My_Temperature.j/10;
}
/*--------------------------------------------------------------------------------
                               温度控制程序
----------------------------------------------------------------------------------*/
unsigned char  Temperature_Control(void) 
 {
  int  int_Error;  //扩大十倍后的偏差
  int  int_dError; //扩大十倍后的偏差变化率
  unsigned char Fuzzy_Error;          //偏差的模糊化值
  unsigned char Fuzzy_dError;         //偏差变化率的模糊化值
  static signed char PreBake_Value = 8; //上次模糊控制查表值
  
  Read_Temperature();
//  EA = 0;
  Error = My_Temperature.SetPoint - My_Temperature.tt; // 偏差e[t] 设定值减测量值   
  My_Temperature.PrevError = My_Temperature.LastError;      //e[t-1]=e[t]
  My_Temperature.LastError = Error;              
  dError = My_Temperature.LastError - My_Temperature.PrevError;      // 当前微分
                   
  int_Error = 10*Error;   //放大十倍
  int_dError = 10*dError;
  
/*************模糊化  Error  列*********************/   
                                                              
  if(int_Error>100)       Fuzzy_Error = 0;
  else if(int_Error >= 50)  Fuzzy_Error = 1;
  else if(int_Error >= 20)  Fuzzy_Error = 2;
  else if(int_Error >= 10)  Fuzzy_Error = 3;
  else if(int_Error >= 5)   Fuzzy_Error = 4;
  else if(int_Error > 0)    Fuzzy_Error = 5;
  else if(int_Error == 0)   Fuzzy_Error = 6;
  else if(int_Error >= -5)  Fuzzy_Error = 7;
  else if(int_Error >= -10) Fuzzy_Error = 8;
  else if(int_Error >= -15) Fuzzy_Error = 9;
  else if(int_Error >= -20) Fuzzy_Error = 10;
  else if(int_Error >= -50) Fuzzy_Error = 11;
  else                    Fuzzy_Error = 12;
  
/*************模糊化  dError  行*********************/

  if(int_dError > 20)        Fuzzy_dError = 12;
  else if(int_dError >= 18)  Fuzzy_dError = 11;
  else if(int_dError >= 9)   Fuzzy_dError = 10;
  else if(int_dError >= 4)   Fuzzy_dError = 9;
  else if(int_dError >= 2)   Fuzzy_dError = 8;
  else if(int_dError > 0)    Fuzzy_dError = 7;
  else if(int_dError == 0)   Fuzzy_dError = 6;
  else if(int_dError >= -2)  Fuzzy_dError = 5;
  else if(int_dError >= -6)  Fuzzy_dError = 4;
  else if(int_dError >= -10) Fuzzy_dError = 3;
  else if(int_dError >= -14) Fuzzy_dError = 2;
  else if(int_dError >= -18) Fuzzy_dError = 1;
  else                     Fuzzy_dError = 0;
  
  if(PreBake_Value != Fuzzy_Control_Tab[Fuzzy_Error][Fuzzy_dError]){         //如果上次模糊控制量不等于当前模糊控制
      
      My_Temperature.Temperature_Control_Value = (signed char)My_Temperature.Temperature_Control_Value     //新PID控制量=上次PID控制量+(当前模糊控制量-上次模糊控制量)
                        + Fuzzy_Control_Tab[Fuzzy_Error][Fuzzy_dError] 
                        - PreBake_Value; 
     if(Fuzzy_Control_Tab[Fuzzy_Error][Fuzzy_dError]==0){
         a=0;             //升温控制计数变量清零
         b=0;             //降温控制计数变量清零
      }                   

  }
  else  if(Fuzzy_Control_Tab[Fuzzy_Error][Fuzzy_dError]==0){
      a=0;
      b=0;
  };
 if(Error>0.4){
      a++;                  //升温控制计数变量
      
      b=0;                  //降温控制计数变量
      if(a==25){            //持续2.2s欠温大于0.4度
          My_Temperature.Temperature_Control_Value++;
          a=0;
      }
  }
  else  if(Error<-0.4){
      b++;
      a=0;
      if(b==25){             //持续2.2s过调大于0.4度
          My_Temperature.Temperature_Control_Value--;
          b=0;
      }
  }
  if(My_Temperature.SetPoint!=lastTemperatureSetPoint)
  {
    PreBake_Value = 8;
    a=0;
    b=0;
  }
 PreBake_Value = Fuzzy_Control_Tab[Fuzzy_Error][Fuzzy_dError];     //保存当前模糊控制查表结果
// EA=1;
  lastTemperatureSetPoint=My_Temperature.SetPoint;
  if(My_Temperature.Temperature_Control_Value>19){
    My_Temperature.Temperature_Control_Value=19;
  }
  if(My_Temperature.Temperature_Control_Value<3){
     My_Temperature.Temperature_Control_Value=3;
  }
  return(My_Temperature.Temperature_Control_Value);
 
}
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -