📄 pid.lst
字号:
C51 COMPILER V8.08 PID 09/11/2007 22:56:15 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE PID
OBJECT MODULE PLACED IN PID.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PID.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "reg52.h"
2 //#define unsigned char uchar
3 //#define signed char schar
4 #define temp_max 255 //最大输出控制量
5 unsigned char send_data[2];
6 unsigned int contrl_data;
7 float temp_in[]={1,2,3,4,5,6,7,7,6,6,5};//,6,7,6,8,10,15,17,19,24};
8 // 28,33,34,36,37,39,43,46,49,52,55,58,61,64,68,
9 // 71,73,75,76,77,78,78,78,78,77,77,78,79,79,78};
10 float temp_now;//保存前面时刻的温度值
11 float temp_before;
12 float temp_out;//输出控制量(0——255)
13
14 float now_e; //当前偏差值
15 float old_e1; //前面时刻的偏差值
16 float old_e2;
17 //signed char old_e3;
18 //signed char old_e4;
19 //signed char old_e5;
20 float ep; //比例项
21 float ed; //积分项
22 float ei; //微分项
23 float kp; //比例系数
24 float kd; //积分系数
25 float ki; //微分系数
26 //unsigned char kds1=1; //积分分离系数1,为1表示只累计负偏差,用于避免控制量长期停留在饱和区
27 //unsigned char kds2=1; //积分分离系数2,用于
28 //unsigned char kis=1; //微分分离系数
29
30
31 extern void COM_send(unsigned char SendData);
32 extern void URAT_init();
33
34
35
36 void delay()
37 { unsigned char i,j,q;
38 1 for(q=0;q<1;q++)
39 1 for(i=0;i<255;i++)
40 1 for(j=0;j<225;j++);
41 1 }
42
43 void ctrl_init(void)
44 {
45 1 temp_now=0; //保存前面3个时刻的采样值
46 1 temp_before=0;
47 1 temp_out=0; //
48 1
49 1 now_e=0; //当前偏移量
50 1 old_e1=0; //前面时刻偏移量
51 1 old_e2=0;
52 1 kp=1.5;
53 1 kd=0;
54 1 ki=0;
55 1
C51 COMPILER V8.08 PID 09/11/2007 22:56:15 PAGE 2
56 1 }
57
58 float temperature_ctrl(float temp_in, float temp_to) //temp_in 当前采样值,temp_to目标温度值
59 {//函数名:温度模糊PID控制算法
60 1 //输入:无
61 1 //输出:无
62 1 temp_before=temp_now;
63 1 temp_now=temp_in;
64 1 old_e1=now_e;
65 1 old_e2=old_e1;
66 1 now_e=temp_to-temp_in; //计算当前偏差,既比例项
67 1 ep=now_e;
68 1 ed=now_e+old_e1+old_e2;
69 1 ei=now_e-old_e1; //计算微分项;
70 1
71 1
72 1 /* if(temp_out>=temp_max) //
73 1 {
74 1 if(now_e<=0)
75 1 kds1=1;
76 1 else
77 1 kds1=0;
78 1 }*/
79 1
80 1 // if(now_e>=-5&&now_e<=5) //设置积分分离阀值
81 1 // kds2=1;
82 1 // else
83 1 // kds2=0;
84 1
85 1 temp_out=kp*ep+kd*ed+ki*ei;
86 1 return temp_out;
87 1 //return 18.93;
88 1 }
89
90 unsigned char i;
91 void main()
92 {
93 1 ctrl_init();
94 1 UART_init();
*** WARNING C206 IN LINE 94 OF PID.C: 'UART_init': missing function-prototype
95 1
96 1 for(i=0;i<=30;i++)
97 1 {
98 2 contrl_data=temperature_ctrl(temp_in[i],6)*100;
99 2 //contrl_data=1234;
100 2 send_data[0]=contrl_data/100;
101 2 send_data[1]=contrl_data%100;
102 2
103 2 COM_send(send_data[0]);
104 2 delay();
105 2 COM_send(send_data[1]);
106 2 // delay();
107 2
108 2 }
109 1 /* for(temp_in=0;temp_in<=200;temp_in++)
110 1 {
111 1 contrl_data=temperature_ctrl(200);
112 1 COM_send(contrl_data);
113 1 delay();
114 1 }*/
115 1
116 1 }
C51 COMPILER V8.08 PID 09/11/2007 22:56:15 PAGE 3
117
118
119
120
121
122
123
124
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 448 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 97 8
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -