STM32F103 模糊规则库代码
时间: 2023-08-26 13:06:46 浏览: 59
以下是一个简单的模糊规则库代码示例,使用STM32F103微控制器:
```c
#include "stm32f10x.h"
/* 模糊控制器结构体定义 */
typedef struct {
float input; // 输入变量
float output; // 输出变量
float error; // 误差变量
float last_error; // 上一次误差变量
float kp; // 比例系数
float ki; // 积分系数
float kd; // 微分系数
float es[3]; // 误差滑动窗口
float ms[3]; // 输出滑动窗口
float rules[3][3]; // 模糊规则表
} FuzzyController;
/* 初始化模糊控制器 */
void FuzzyController_Init(FuzzyController *fc, float kp, float ki, float kd) {
fc->input = 0.0f;
fc->output = 0.0f;
fc->error = 0.0f;
fc->last_error = 0.0f;
fc->kp = kp;
fc->ki = ki;
fc->kd = kd;
fc->es[0] = 0.0f;
fc->es[1] = 0.0f;
fc->es[2] = 0.0f;
fc->ms[0] = 0.0f;
fc->ms[1] = 0.0f;
fc->ms[2] = 0.0f;
fc->rules[0][0] = 1.0f;
fc->rules[0][1] = 0.0f;
fc->rules[0][2] = -1.0f;
fc->rules[1][0] = 0.5f;
fc->rules[1][1] = 0.0f;
fc->rules[1][2] = -0.5f;
fc->rules[2][0] = 0.0f;
fc->rules[2][1] = 0.0f;
fc->rules[2][2] = 0.0f;
}
/* 更新模糊控制器状态 */
void FuzzyController_Update(FuzzyController *fc, float setpoint, float input, float dt) {
fc->last_error = fc->error;
fc->error = setpoint - input;
fc->es[0] = fc->es[1];
fc->es[1] = fc->es[2];
fc->es[2] = fc->error;
fc->ms[0] = fc->ms[1];
fc->ms[1] = fc->ms[2];
fc->ms[2] = fc->kp * fc->rules[0][(int)fc->es[2]+1] +
fc->ki * fc->rules[1][(int)fc->es[2]+1] * dt +
fc->kd * fc->rules[2][(int)fc->es[2]+1] / dt;
fc->output = fc->ms[2];
}
/* 主函数 */
int main(void) {
FuzzyController fc;
float setpoint = 50.0f;
float input = 0.0f;
float dt = 0.01f;
FuzzyController_Init(&fc, 0.5f, 0.1f, 0.2f);
while(1) {
// 读取输入变量
input = ADC_Read();
// 更新模糊控制器状态
FuzzyController_Update(&fc, setpoint, input, dt);
// 控制输出
PWM_Write(fc.output);
}
}
```
上面的代码中,模糊控制器的规则表是一个3x3的矩阵,每一行代表一个规则,每一列代表一个模糊集。这个例子中,共有三个模糊集,分别是“负向大”、“中心”和“正向大”,每个模糊集有一个隶属度函数,用于计算输入变量属于该模糊集的程度。模糊规则表中的值代表输出变量的隶属度函数,用于计算输出变量的隶属度。在这个例子中,规则表是一个简单的“PD”控制器,通过比例、积分和微分系数的调节,可以实现不同的控制效果。
阅读全文