📄 temperature_control.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 + -