📄 main.c
字号:
#define ENABLE_BIT_DEFINITIONS
#include "includes.h"
//#define Vref 25600
//#define Vref 50000
void init_adc(void);
void WDR(void);
void WDT_init(void);
//unsigned char adc_mux = 0x01; //通道选择
unsigned char RSend;
unsigned char RS_buf[10];
unsigned char RS_flag;
unsigned int SerPoint; //设定目标,应用时实际上取该值的1/10,出现温度的0.x度
int ei; //最近1次的偏差,ei = stPID.SetPoint-stPID.T_adc_data[2]
int LastError; //SetPoint-T_adc_data[1]
int delt_ei; //偏差的变化:delt_ei = PID.LastError-ei
int T_adc_data[3]; //近3次的测量值,T_adc_data[2]为最近的一次
int ui; //ui:输出
int delt_ui; //delt_ei为增量式增量输出
/*
char DFC_tbl[11][13]={
//-12,-10,-8,-6,-4,-2,0,+2,+4,+6,+8,+10,+12
-5,-5,-4,-4,-3,-3,-3,-3,-3,-2,-2,-1, 0,
-5,-5,-4,-3,-2,-2,-2,-2,-2,-2,-1, 0, 0,
-5,-4,-3,-2,-1,-1,-1,-1,-2,-1, 0, 0, 0,
-4,-3,-2,-2,-1, 0, 0,-1,-1,-1, 0, 1, 2,
-3,-2,-1,-1,-1, 0, 0, 0, 1, 1, 2, 3, 4,
-3,-2,-1,-1,-1, 0, 0, 1, 1, 1, 2, 3, 4,
-2,-2,-1,-1,-1, 0, 0, 2, 2, 2, 2, 3, 4,
0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 4, 5,
0, 0, 0, 0, 1, 1, 1, 2, 3, 3, 3, 4, 5,
0, 0, 0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5,
0, 0, 0, 0, 2, 2, 3, 3, 4, 5, 5, 5, 5
};
*/
char DFC_tbl[11][13]={
/*-12,-10,-8,-6,-4,-2,0,+2,+4,+6,+8,+10,+12*/
/*-5*/ 5, 5, 5, 3, 3, 3, 1, 1, 0, 0, 0,
/*-4*/ 5, 6, 5, 3, 3, 3, 1, 1, 0, 0, 0,
/*-3*/ 5, 5, 5, 4, 4, 4, 1, 1, 0,-1,-1,
/*-2*/ 5, 6, 5, 3, 3, 1, 0, 0,-2,-3,-3,
/*-1*/ 5, 6, 5, 3, 3, 1, 0,-2,-2,-3,-3,
/*0*/ 5, 6, 5, 3, 1, 0, 0,-3,-5,-6,-5,
/*1*/ 3, 3, 2, 1, 0,-1,-3,-3,-5,-6,-5,
/*2*/ 3, 3, 1, 0, 0,-1,-3,-3,-5,-6,-5,
/*3*/ 1, 1, 0, 0, 0,-1,-2,-2,-5,-5,-5,
/*4*/ 0, 0,-1,-1,-2,-3,-3,-3,-5,-6,-5,
/*5*/ 0, 0,-1,-1,-2,-3,-3,-3,-5,-6,-5,
};
int GetDeltFuzzyValue(int ei,int delt_ei)
{
unsigned char i,j;
#define delt_M 20
if(ei > delt_M)
ei = delt_M;
if(ei<-delt_M)
ei = -delt_M;
i = delt_ei + 5;
j = 6 + ei*6/delt_M;
return DFC_tbl[i][j];
}
/*
int GetDeltFuzzyValue(int ei,int delt_ei)
{
unsigned char i,j;
#define delt_M 20
if(ei > delt_M)
ei = delt_M;
if(ei<-delt_M)
ei = -delt_M;
i = delt_ei + 5;
j = 5 + ei*5/delt_M;
return DFC_tbl[i][j];
}
*/
void Delt_FuzzyCtrl(void)
{
#define delt_Um 50
LastError = ei;//刷新近2次偏差
ei = ADC-SerPoint;//ei = SerPoint - ADC;//ei = SerPoint - T_adc_data[2];
delt_ei = LastError-ei;//刷新偏差的变化
if(delt_ei > 5)
delt_ei = 5;
if(delt_ei < -5)
delt_ei = -5;
delt_ui = GetDeltFuzzyValue(ei,delt_ei);//采用模糊控制模型
//delt_ui = delt_ui; //delt_ui = delt_ui*2; //其中2是比例因子K
if(delt_ui > delt_Um)
delt_ui = delt_Um;
if(delt_ui < -delt_Um)//if(delt_ui < -delt_Um)
delt_ui = -delt_Um;//delt_ui = -delt_Um;
ui += delt_ui;
if(ui<1)
ui = 1;
}
void main(void)
{
float j;
int count;
unsigned char *test = "The Voltage is: ";
unsigned char *value = "0.000 V";
unsigned char *RS;
RS = RS_buf;
RS_flag = 0;
delay_nms(1);
SerPoint=500;
//dataport=0xff;
OSCCAL=0Xab;//系统时钟校准,不同的芯片和不的频率,
init_adc();
//InitSerial();
//init_time1();
/*
Init_LCD();
// WDT_init();
LCD_DisplayString(1,1,test);
LCD_DisplayString(2,1,value);
//put_string(value);
//put_char(0x0d);
//put_char(0x0a);
SerPoint=500;
while(1)
{
// j = (float)(((float)((Vref/1023)))*(ADCH*256+ADCL))/1000.00;
//j = (float)(((float)((Vref/1023)))*( ADC&0X3FF))/1000.00;
count = ADC;
value[0] = count /1000 + 0x30;
count = count %1000;
value[2] = count /100+0x30;
count = count %100;
value[3] = count /10 + 0x30;
value[4] = count %10 + 0x30;
LCD_Cursor(0,1);
LCD_DisplayString(2,1,value);
Delt_FuzzyCtrl();
count = ui;
value[0] = count /1000+0x30;
count = count %1000;
value[2] = count /100+0x30;
count = count %100;
value[3] = count /10 + 0x30;
value[4] = count %10 + 0x30;
LCD_Cursor(0,1);
LCD_DisplayString(1,1,value);
*/
//put_string(value);
//put_char(0x0d);
//put_char(0x0a);
while(1)
{
Delt_FuzzyCtrl();
;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -