用c语言写一个关于速度的模糊控制pid
时间: 2023-11-15 18:04:09 浏览: 67
下面是一个基于C语言的模糊控制PID的示例代码,主要是针对速度控制的模糊控制。
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SPEED 200
#define MIN_SPEED 0
// 模糊集合函数
double s_low(double x) {
if (x <= 50) {
return 1.0;
} else if (x > 50 && x < 70) {
return (70 - x) / 20.0;
} else {
return 0.0;
}
}
double s_medium(double x) {
if (x <= 50 || x >= 100) {
return 0.0;
} else if (x > 50 && x < 70) {
return (x - 50) / 20.0;
} else if (x >= 70 && x <= 90) {
return 1.0;
} else {
return (100 - x) / 10.0;
}
}
double s_high(double x) {
if (x <= 90) {
return 0.0;
} else if (x > 90 && x < 100) {
return (x - 90) / 10.0;
} else {
return 1.0;
}
}
// 模糊化
double fuzzy_speed(double speed, double *s) {
s[0] = s_low(speed);
s[1] = s_medium(speed);
s[2] = s_high(speed);
}
// 求模糊平均值
double fuzzy_mean(double *s, int len) {
double sum1 = 0, sum2 = 0;
for (int i = 0; i < len; i++) {
sum1 += s[i];
sum2 += s[i] * (i + 1);
}
return sum2 / sum1;
}
// 模糊规则库
double rule_table[3][3] = {
{0, 1, 2},
{0, 1, 2},
{0, 1, 2}
};
// 模糊推理
double fuzzy_inference(double *s1, double *s2, double *s3) {
double res = 0.0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 3; k++) {
if (s1[i] != 0 && s2[j] != 0 && s3[k] != 0) {
double m = fmin(s1[i], fmin(s2[j], s3[k]));
if (rule_table[i][j] == k) {
res += m * k;
}
}
}
}
}
return res;
}
// PID控制器
double pid_control(double set_speed, double current_speed) {
double kp = 0.6, ki = 0.02, kd = 0.02;
double err = set_speed - current_speed;
static double err_sum = 0, last_err = 0;
err_sum += err;
double p = kp * err;
double i = ki * err_sum;
double d = kd * (err - last_err);
last_err = err;
return p + i + d;
}
int main() {
double set_speed = 120;
double current_speed = 80;
double s1[3], s2[3], s3[3];
fuzzy_speed(current_speed, s1);
fuzzy_speed(current_speed + pid_control(set_speed, current_speed), s2);
fuzzy_speed(current_speed + pid_control(set_speed, current_speed) * 2, s3);
double res = fuzzy_inference(s1, s2, s3);
printf("当前车速为%.2f km/h,控制信号为%.2f\n", current_speed, res);
return 0;
}
```
该示例代码中,模糊控制器主要分为三个步骤:模糊化、模糊推理和解模糊化。
首先,使用三个模糊集合函数来模糊化当前的车速,分别对应低速、中速和高速。然后,使用PID控制器计算出当前的控制信号,同时根据当前车速以及PID计算出的控制信号,分别模糊化为三个模糊集合。接着,使用模糊规则库进行模糊推理,得到最终的控制信号,最后将其解模糊化为实际的控制信号。
需要注意的是,本示例代码中只是一个简单的模糊控制器实现,实际应用中需要针对具体情况进行调整和优化。
阅读全文