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

📄 pid.lst

📁 一个锅炉温度控制程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V3.20,  SN-0  PID                                                             05/24/04  10:40:00  PAGE 1   


DOS C51 COMPILER V3.20, COMPILATION OF MODULE PID
OBJECT MODULE PLACED IN PID.OBJ
COMPILER INVOKED BY: C:\XINGYAN\FSI\BIN\C51.EXE PID.C DB SB OE ROM(LARGE) SMALL OT(2) RB(0) 

stmt level    source

   1          #include <absacc.h>
   2          #include "s_table.h"
   3          #include "jdq.h"
   4          #include "delay.h"
   5          #include <reg52.h>
   6          #include "pid.h"
   7          #include <string.h>
   8          #include <math.h>
   9          #include "Xdata.h"
  10          #include "watchdog.h"
  11          #include "sja.h"
  12          
  13          
  14          const int DUmax = 2;    /*控制量增量最大值*/
  15          
  16          /*========================================================================
              								数据采集
              ========================================================================*/
  19          UINT CalcTemp()	    /* 计算当前温度      返回16进制数据*/
  20          {
  21   1      	UINT airtemp = cool_temp_bk >> 4;
  22   1      	float bias_vol = temp2vol(airtemp);
  23   1      	float ad_vol = ad_val_bk[0]/1310.7;  /*2500.0/((64*1024-1)*50.0);*/
  24   1      	float vol = bias_vol + ad_vol;
  25   1      	clear_watchdog();
  26   1      	return vol2temp(vol);
  27   1      }
  28          
  29          float CalcAngle()	/* 计算当前角度 */
  30          {
  31   1      	float vol = ad_val_bk[1]*2500.0/(64*1024-1);
  32   1      	
  33   1      	return (90.0 * vol)/1000.0 ;/*测得角度满偏时电压为2V*/
  34   1      	
  35   1      	clear_watchdog();
  36   1      }
  37          
  38          void Init_Para()	/*参数初始化*/
  39          {
  40   1      	/*========================================================
              				设定值曲线参数
              	==========================================================*/
  43   1      	
  44   1      	p = 100;
  45   1      	I = 100;
  46   1      	D = 1;
  47   1      	Rk = 50;              /*==================++++++++++++++++++++++===========*/
  48   1      	Ts = 4;		
  49   1      	EnablePID = 1;	/*模块PID计算*/
  50   1      	Sens = .1;	     /*灵敏度*/
  51   1      	DataFrame = 10; /*初始无有效数据帧编号*/
  52   1      
  53   1      	Ek1 = 0;
  54   1      	DeltEk1 = 0;
  55   1      	Yk1 = 0;
C51 COMPILER V3.20,  SN-0  PID                                                             05/24/04  10:40:00  PAGE 2   

  56   1      	DeltYk1 = 0;
  57   1      
  58   1      	/*========================================================
              				设定值曲线参数
                ==========================================================*/
  61   1          U=12;               /***********+++++++++++++++++++**************/
  62   1      	SP2 = 1200;
  63   1      	SP_temp = Rk;
  64   1      	SPOneStepVal = 1;	//步长
  65   1      	SP1toSP2Time = 0;   //时间间隔
  66   1      
  67   1      	/*****************************************************************
              						临时:测试用		
              	/*****************************************************************/
  70   1      	Yk = 1000;	 
  71   1      
  72   1      	TempPIDUINT = 0;
  73   1      
  74   1      	
  75   1      }
  76          
  77          void save_pid(BYTE nrfrm,BYTE idata* dat)/*将上位机发送过来的值放到接收缓冲区中*/
  78          {   
  79   1      	EA = 0;
  80   1      	memcpy((BYTE xdata*)(sPID.ReceiveValue.bValue+6*nrfrm),dat,6);
  81   1      	EA = 1;
  82   1      	clear_watchdog();
  83   1      }
  84          
  85          void Update_PID_Para()/*更新PID参数及其他数据,来自计算缓冲区内*/
  86          {
  87   1      	if(OnNewData == FALSE)
  88   1      		return;
  89   1      	
  90   1      	EA = 0;/*禁止对接收缓冲区的访问*/
  91   1      	memcpy((BYTE xdata*)(sPID.CalValue.bValue),(BYTE xdata*)(sPID.ReceiveValue.bValue),PIDLEN);
  92   1      	EA = 1;
  93   1      	
  94   1      	OnNewData = FALSE;
  95   1      	
  96   1      	if (DataFrame==0) {
  97   2      		if (CheckPara(sPID.CalValue.sValue._P))
  98   2      			p=sPID.CalValue.sValue._P;
  99   2      		if (CheckPara(sPID.CalValue.sValue._I)) 
 100   2      			I=sPID.CalValue.sValue._I;
 101   2      		if (CheckPara(sPID.CalValue.sValue._D))     
 102   2      			D=sPID.CalValue.sValue._D;
 103   2      	}
 104   1      	
 105   1      	else if (DataFrame==1) {
 106   2      		if (CheckPara(sPID.CalValue.sValue.SetPoint)){
 107   3      			Rk=sPID.CalValue.sValue.SetPoint;
 108   3      		}
 109   2      		
 110   2      		Sens=sPID.CalValue.sValue.SensitiveH+sPID.CalValue.sValue.SensitiveL/256.0;	
 111   2      	}
 112   1      	
 113   1      	else if (DataFrame==2) {
 114   2      		Ts=sPID.CalValue.sValue.CMod.Tsample;
 115   2      		EnablePID=sPID.CalValue.sValue.CMod.EnPID;
 116   2      		if (EnablePID == 2)
 117   2      			MotorDir=sPID.CalValue.sValue.CMod.MotorDirec;
C51 COMPILER V3.20,  SN-0  PID                                                             05/24/04  10:40:00  PAGE 3   

 118   2      	}
 119   1      	clear_watchdog();
 120   1      	return;
 121   1      }
 122          
 123          void Update_Calbuffer_Para2Send()   /*更新发送缓冲区数据,来自PID参数*/
 124          {
 125   1      	BYTE i;
 126   1          EA=0;
 127   1      	
 128   1      	sPID.SendValue.sValue._P=p;
 129   1      	sPID.SendValue.sValue._I=I;
 130   1      	sPID.SendValue.sValue._D=D;
 131   1      	
 132   1      	sPID.SendValue.sValue.CMod.Tsample=Ts;
 133   1      	sPID.SendValue.sValue.SetPoint=Rk;
 134   1      	
 135   1      	sPID.SendValue.sValue.SensitiveH=(BYTE)(Sens);
 136   1      	sPID.SendValue.sValue.SensitiveL=(BYTE)((Sens-sPID.SendValue.sValue.SensitiveH)*256);
 137   1      	sPID.SendValue.sValue.CMod.EnPID=EnablePID;
 138   1      	
 139   1      	EA=1;
 140   1      	clear_watchdog();
 141   1      	return;
 142   1      }
 143          void CheckU()		/*检验控制量是否超过上下限*/
 144          {
 145   1      	if (U>=Umax) {
 146   2      		U = Umax;
 147   2      	}
 148   1      	else if(U<=Umin) {
 149   2      		U = Umin;
 150   2      	}
 151   1      }
 152          
 153          BYTE CheckPara(float Para)
 154          {
 155   1      	if ((Para >= 0)&&(Para<=1300))
 156   1      		return 1;
 157   1      	else
 158   1      		return 0;
 159   1      	clear_watchdog();
 160   1      }
 161          /*校验各参数的有效性*/
 162          
 163          void UpdateData()			     /*更新检测数据,置于发送缓冲区*/
 164          {
 165   1      	BYTE i;
 166   1      	Update_Calbuffer_Para2Send();              /*将PID参数送回发送缓冲区*/
 167   1      	
 168   1      	/*当前温度,控制量,阀位反馈值 送回发送缓冲区*/
 169   1      	EA=0;
 170   1         	sPID.SendValue.sValue.Temperature = Yk;      /*温度检测值*/
 171   1      	sPID.SendValue.sValue._UH = (BYTE)(U);
 172   1      	sPID.SendValue.sValue._UL = (BYTE)((U-sPID.SendValue.sValue._UH)*256);     /*控制量*/
 173   1      	sPID.SendValue.sValue._AngleH = (BYTE)(Angle);/*阀位反馈,角度*/
 174   1      	sPID.SendValue.sValue._AngleL = (BYTE)((Angle-sPID.SendValue.sValue._AngleH)*256); 
 175   1          sPID.SendValue.sValue.CMod.MotorDirec = MotorDir;/*电机转动方向*/
 176   1      	EA=1;
 177   1      	clear_watchdog();
 178   1      	return;
 179   1      }
C51 COMPILER V3.20,  SN-0  PID                                                             05/24/04  10:40:00  PAGE 4   

 180          /*========================================================================
              pid主函数     通过控制量或增量控制电机转动
              ========================================================================*/
 183          
 184          /*========================================================================
              		王占成:精简PID算法,只用一种PID微分先行,有阀位反馈
              ========================================================================*/
 187          void PID()
 188          {	

⌨️ 快捷键说明

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