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

📄 pid.c

📁 本压缩文件主要介绍温度传感芯片的应用
💻 C
字号:
 #include "reg52.h"
//#define unsigned char uchar
//#define signed char schar
#define temp_max 255   //最大输出控制量
unsigned char send_data[2];
unsigned int contrl_data;
float temp_in[]={1,2,3,4,5,6,7,7,6,6,5};//,6,7,6,8,10,15,17,19,24};
				// 28,33,34,36,37,39,43,46,49,52,55,58,61,64,68,
				// 71,73,75,76,77,78,78,78,78,77,77,78,79,79,78};
float temp_now;//保存前面时刻的温度值
float temp_before;
float temp_out;//输出控制量(0——255)

float now_e;       //当前偏差值
float old_e1;     //前面时刻的偏差值
float old_e2; 
//signed char old_e3; 
//signed char old_e4; 
//signed char old_e5; 
float ep;       //比例项
float ed;       //积分项
float ei;       //微分项
float kp;  //比例系数
float kd;   //积分系数
float ki;   //微分系数
//unsigned char kds1=1;   //积分分离系数1,为1表示只累计负偏差,用于避免控制量长期停留在饱和区
//unsigned char kds2=1;   //积分分离系数2,用于
//unsigned char kis=1;   //微分分离系数


extern void COM_send(unsigned char SendData);
extern void URAT_init();



void delay()
{  unsigned char i,j,q;
    for(q=0;q<1;q++)
	for(i=0;i<255;i++)
	for(j=0;j<225;j++);
}

void ctrl_init(void)
{
    temp_now=0;     //保存前面3个时刻的采样值
    temp_before=0;
    temp_out=0;  // 
    
    now_e=0;     //当前偏移量
    old_e1=0;     //前面时刻偏移量
    old_e2=0;
    kp=1.5;
    kd=0;
    ki=0;
    
}

float temperature_ctrl(float temp_in, float temp_to)               //temp_in 当前采样值,temp_to目标温度值
{//函数名:温度模糊PID控制算法
 //输入:无
 //输出:无
	 temp_before=temp_now;
	 temp_now=temp_in;
	 old_e1=now_e;
	 old_e2=old_e1;
	 now_e=temp_to-temp_in;    //计算当前偏差,既比例项
   	 ep=now_e;
	 ed=now_e+old_e1+old_e2;
	 ei=now_e-old_e1;       //计算微分项; 

	 
/*	 if(temp_out>=temp_max)  //
    {
      if(now_e<=0)
       kds1=1;
      else 
        kds1=0;          
    }*/
 
//	 if(now_e>=-5&&now_e<=5)  //设置积分分离阀值
    //	kds2=1;
//	else
  // 		kds2=0;

	temp_out=kp*ep+kd*ed+ki*ei;
	return temp_out;
	//return 18.93;
}

unsigned char i;  
void main()
{
	ctrl_init();
	UART_init();
  
		for(i=0;i<=30;i++)
		{
			contrl_data=temperature_ctrl(temp_in[i],6)*100;
			//contrl_data=1234;
			send_data[0]=contrl_data/100;
			send_data[1]=contrl_data%100;
			
			COM_send(send_data[0]);
			delay();
			COM_send(send_data[1]);
    	//	delay();

		}
		/*	for(temp_in=0;temp_in<=200;temp_in++)
			{
			contrl_data=temperature_ctrl(200);
			COM_send(contrl_data);
    		delay();
			}*/

}








⌨️ 快捷键说明

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