温控系统c语言源代码,模糊PID控制温控系统设计C语言程序代码
时间: 2023-11-26 17:06:07 浏览: 54
以下是一个基于模糊PID控制的温控系统的C语言源代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 模糊PID控制参数
#define Kp 0.6
#define Ki 0.2
#define Kd 0.1
#define Mf 0.3
#define Mb 0.2
#define Epsilon 0.05
// 温度传感器误差
#define Error 0.5
// 模糊控制规则矩阵
const float rule[7][7] = {
{1, 1, 1, 2, 2, 2, 3},
{1, 1, 2, 2, 3, 3, 4},
{1, 2, 2, 3, 3, 4, 4},
{2, 2, 3, 3, 4, 4, 5},
{2, 3, 3, 4, 4, 5, 5},
{3, 3, 4, 4, 5, 5, 6},
{3, 4, 4, 5, 5, 6, 6}
};
// 模糊集合的隶属度函数
float membership(float x, float a, float b, float c) {
if (x <= a) return 0;
if (x > a && x <= b) return (x - a) / (b - a);
if (x > b && x < c) return (c - x) / (c - b);
if (x >= c) return 0;
}
// 模糊PID控制器
float fuzzy_pid(float e, float ec, float e1, float e2) {
float u, u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15;
u1 = membership(e, -Error, -Error / 2, 0);
u2 = membership(e, -Error / 2, 0, Error / 2);
u3 = membership(e, 0, Error / 2, Error);
u4 = membership(ec, -Error, -Error / 2, 0);
u5 = membership(ec, -Error / 2, 0, Error / 2);
u6 = membership(ec, 0, Error / 2, Error);
u7 = membership(e1, -Error, -Error / 2, 0);
u8 = membership(e1, -Error / 2, 0, Error / 2);
u9 = membership(e1, 0, Error / 2, Error);
u10 = membership(e2, -Error, -Error / 2, 0);
u11 = membership(e2, -Error / 2, 0, Error / 2);
u12 = membership(e2, 0, Error / 2, Error);
u13 = fmax(fmax(fmax(fmax(fmax(fmax(fmax(fmax(u1, u2), u3), u4), u5), u6), u7), u8), u9);
u14 = fmax(fmax(fmax(fmax(fmax(fmax(fmax(fmax(u1, u2), u3), u10), u11), u12), u7), u8), u9);
u15 = fmax(fmax(fmax(fmax(fmax(fmax(fmax(fmax(u1, u2), u3), u4), u5), u6), u10), u11), u12);
// 模糊控制规则
u = rule[0][0] * u13 + rule[0][1] * u13 + rule[0][2] * u13 + rule[0][3] * u14 + rule[0][4] * u14 + rule[0][5] * u14 + rule[0][6] * u15;
u += rule[1][0] * u13 + rule[1][1] * u13 + rule[1][2] * u14 + rule[1][3] * u14 + rule[1][4] * u15 + rule[1][5] * u15 + rule[1][6] * u15;
u += rule[2][0] * u13 + rule[2][1] * u14 + rule[2][2] * u14 + rule[2][3] * u15 + rule[2][4] * u15 + rule[2][5] * u15 + rule[2][6] * u15;
u += rule[3][0] * u14 + rule[3][1] * u14 + rule[3][2] * u15 + rule[3][3] * u15 + rule[3][4] * u15 + rule[3][5] * u15 + rule[3][6] * u15;
u += rule[4][0] * u14 + rule[4][1] * u15 + rule[4][2] * u15 + rule[4][3] * u15 + rule[4][4] * u15 + rule[4][5] * u15 + rule[4][6] * u15;
u += rule[5][0] * u15 + rule[5][1] * u15 + rule[5][2] * u15 + rule[5][3] * u15 + rule[5][4] * u15 + rule[5][5] * u15 + rule[5][6] * u15;
u += rule[6][0] * u15 + rule[6][1] * u15 + rule[6][2] * u15 + rule[6][3] * u15 + rule[6][4] * u15 + rule[6][5] * u15 + rule[6][6] * u15;
return u;
}
int main() {
float t, t0, t1, t2, e, ec, u, u1, u2, u3, dt;
t = 25; // 初始温度
t0 = 25; // 温度设定值
t1 = t;
t2 = t;
dt = 0.1; // 时间间隔
while (1) {
// 计算误差和误差变化率
e = t0 - t;
ec = (t - t1) - (t1 - t2);
// 计算控制量
u = fuzzy_pid(e, ec, e - Epsilon, e, e + Epsilon);
u1 = Kp * (e - ec + Mf * u);
u2 = Ki * (e - ec + u);
u3 = Kd * (e - 2 * ec + u / Mf - Mb * u2);
// 计算下一时刻的温度
t2 = t1;
t1 = t;
t += (u1 + u2 + u3) * dt;
// 输出温度
printf("Temperature: %f\n", t);
}
return 0;
}
```
该程序实现了一个基于模糊PID控制的温控系统,其中模糊PID控制器的参数可以根据实际需求进行调整。