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

📄 main.c

📁 增量式模糊PID控制方法AVR单片机mega16
💻 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 + -