?? pid.lst
字號(hào):
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 /*========================================================================
數(shù)據(jù)采集
========================================================================*/
19 UINT CalcTemp() /* 計(jì)算當(dāng)前溫度 返回16進(jìn)制數(shù)據(jù)*/
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() /* 計(jì)算當(dāng)前角度 */
30 {
31 1 float vol = ad_val_bk[1]*2500.0/(64*1024-1);
32 1
33 1 return (90.0 * vol)/1000.0 ;/*測(cè)得角度滿(mǎn)偏時(shí)電壓為2V*/
34 1
35 1 clear_watchdog();
36 1 }
37
38 void Init_Para() /*參數(shù)初始化*/
39 {
40 1 /*========================================================
設(shè)定值曲線參數(shù)
==========================================================*/
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計(jì)算*/
50 1 Sens = .1; /*靈敏度*/
51 1 DataFrame = 10; /*初始無(wú)有效數(shù)據(jù)幀編號(hào)*/
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 /*========================================================
設(shè)定值曲線參數(shù)
==========================================================*/
61 1 U=12; /***********+++++++++++++++++++**************/
62 1 SP2 = 1200;
63 1 SP_temp = Rk;
64 1 SPOneStepVal = 1; //步長(zhǎng)
65 1 SP1toSP2Time = 0; //時(shí)間間隔
66 1
67 1 /*****************************************************************
臨時(shí):測(cè)試用
/*****************************************************************/
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)/*將上位機(jī)發(fā)送過(guò)來(lái)的值放到接收緩沖區(qū)中*/
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參數(shù)及其他數(shù)據(jù),來(lái)自計(jì)算緩沖區(qū)內(nèi)*/
86 {
87 1 if(OnNewData == FALSE)
88 1 return;
89 1
90 1 EA = 0;/*禁止對(duì)接收緩沖區(qū)的訪問(wèn)*/
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() /*更新發(fā)送緩沖區(qū)數(shù)據(jù),來(lái)自PID參數(shù)*/
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() /*檢驗(yàn)控制量是否超過(guò)上下限*/
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 /*校驗(yàn)各參數(shù)的有效性*/
162
163 void UpdateData() /*更新檢測(cè)數(shù)據(jù),置于發(fā)送緩沖區(qū)*/
164 {
165 1 BYTE i;
166 1 Update_Calbuffer_Para2Send(); /*將PID參數(shù)送回發(fā)送緩沖區(qū)*/
167 1
168 1 /*當(dāng)前溫度,控制量,閥位反饋值 送回發(fā)送緩沖區(qū)*/
169 1 EA=0;
170 1 sPID.SendValue.sValue.Temperature = Yk; /*溫度檢測(cè)值*/
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;/*電機(jī)轉(zhuǎn)動(dòng)方向*/
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主函數(shù) 通過(guò)控制量或增量控制電機(jī)轉(zhuǎn)動(dòng)
========================================================================*/
183
184 /*========================================================================
王占成:精簡(jiǎn)PID算法,只用一種PID微分先行,有閥位反饋
========================================================================*/
187 void PID()
188 {
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -