编写积分分离pid控制温度的c51程序
时间: 2023-07-23 09:29:01 浏览: 218
下面是一个简单的C51程序,实现了积分分离PID控制温度的功能。该程序基于Keil C51编译器,使用了STC89C52单片机进行控制。
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Heat = P1^0; //加热器控制引脚
sbit Cool = P1^1; //制冷器控制引脚
sbit Fan = P1^2; //风扇控制引脚
uint SetTemp = 50; //设定温度
uint CurTemp = 0; //当前温度
uint LastErr = 0; //上次误差
uint SumErr = 0; //误差累计
uchar Kp = 10; //比例系数
uchar Ki = 5; //积分系数
uchar Kd = 2; //微分系数
//延时函数
void Delay(uint ms)
{
uint i, j;
for(i = ms; i > 0; i--)
{
for(j = 110; j > 0; j--)
{
_nop_();
}
}
}
//读取温度传感器值
uchar ReadTemp()
{
uchar temp = 0;
//读取温度传感器的数值,将其转换成摄氏度
//将转换后的温度值返回
return temp;
}
//PID控制函数
void PIDControl()
{
uint err; //当前误差
uint dErr; //误差变化率
err = SetTemp - CurTemp; //计算当前误差
SumErr += err; //累加误差
//积分分离
if(SumErr > 1000)
{
SumErr = 1000;
}
else if(SumErr < -1000)
{
SumErr = -1000;
}
dErr = err - LastErr; //计算误差变化率
//计算控制量
uint ctrl = Kp * err + Ki * SumErr + Kd * dErr;
//根据控制量控制加热器、制冷器和风扇
if(ctrl > 0)
{
Heat = 1;
Cool = 0;
Fan = 0;
}
else if(ctrl < 0)
{
Heat = 0;
Cool = 1;
Fan = 1;
}
else
{
Heat = 0;
Cool = 0;
Fan = 1;
}
LastErr = err; //保存上次误差
}
//主程序
void main()
{
while(1)
{
CurTemp = ReadTemp(); //读取当前温度
PIDControl(); //PID控制
Delay(1000); //延时1秒
}
}
```
在该程序中,我们首先定义了加热器、制冷器和风扇的控制引脚,以及设定温度、当前温度、上次误差和误差累计等变量。然后,我们定义了延时函数和读取温度传感器的函数。最后,我们实现了PID控制函数,其中包括积分分离的处理,以及根据控制量控制加热器、制冷器和风扇。在主程序中,我们不断地读取当前温度,并进行PID控制,以达到控制温度的目的。
阅读全文