找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1106|回复: 4
收起左侧

模糊PID在单片机里面的实现

[复制链接]
ID:956669 发表于 2025-3-5 23:26 | 显示全部楼层 |阅读模式
50黑币
我现在想在单片机里面实现模糊控制pid,模糊规则我在matlab里面制定好了,怎么用到单片机.c文件里了;还有一个问题,如果我后面想加GA遗传算法去优化模糊规则,有应该怎么办,求大神们详细指点一下,万分感谢

回复

使用道具 举报

ID:86450 发表于 2025-3-7 08:53 | 显示全部楼层
我也想知道
回复

使用道具 举报

ID:446156 发表于 2025-3-7 09:13 | 显示全部楼层
我用串级PID已经大杀四方了,模糊PID没实战过
回复

使用道具 举报

ID:1079566 发表于 2025-3-7 18:20 | 显示全部楼层
问了下AI: 实现模糊逻辑有一个C++开源库. 要使用到stm32fxxx里不容易.
下载并包含 FuzzyLite:
从 FuzzyLite GitHub 获取库并包含在你的项目中。( github/fuzzylite/fuzzylite )


在STM32中集成FuzzyLite实现模糊逻辑控制,需结合硬件特性与库的C++特性进行适配。以下是关键步骤与技术要点:

‌一、硬件与工具链配置‌
‌启用C++支持‌

在Keil MDK或STM32CubeIDE中,需勾选C++编译选项(如AC6编译器支持C++11)‌。
链接时添加-lstdc++参数,确保C++标准库正常调用‌37。
‌外设初始化‌

使用STM32CubeMX配置必要外设(如ADC采集输入、PWM输出控制信号),生成HAL库基础工程‌。
‌二、FuzzyLite库的C接口封装‌
‌创建C兼容接口‌

cpp
Copy Code
// fuzzy_wrapper.h
#ifdef __cplusplus
extern "C" {
#endif

void* fl_init_controller();
void fl_set_input(void* controller, float error, float delta_error);
float fl_compute_output(void* controller);
void fl_release_controller(void* controller);

#ifdef __cplusplus
}
#endif
‌封装C++对象‌

cpp
Copy Code
// fuzzy_wrapper.cpp
#include "fuzzylite/FuzzyEngine.h"

extern "C" {
    void* fl_init_controller() {
        auto* engine = new fl::FuzzyEngine();
        // 配置隶属函数与规则库(参考‌:ml-citation{ref="1" data="citationList"}中的模糊化步骤)
        return static_cast<void*>(engine);
    }
    // 其他接口实现...
}
‌三、模糊控制器实现‌
‌输入模糊化‌

定义误差(Err)与误差变化率(dErr)的隶属函数,如“负大(NB)”、“零(ZO)”、“正大(PB)”‌12。
示例代码片段:
cpp
Copy Code
fl::InputVariable* error = new fl::InputVariable;
error->addTerm(new fl::Triangle("NB", -1.0, -0.5, 0.0));
error->addTerm(new fl::Triangle("ZO", -0.5, 0.0, 0.5));
error->addTerm(new fl::Triangle("PB", 0.0, 0.5, 1.0));
‌规则库设计‌

基于经验或仿真设计控制规则,如:
IF Err is NB AND dErr is NB THEN Output is PB‌12。
‌解模糊方法‌

使用重心法(Centroid)或最大隶属度法,输出精确控制量‌12。
‌四、工程集成与优化‌
‌代码结构管理‌

将封装后的C接口文件(.h/.cpp)加入工程,并通过头文件声明供主程序调用‌73。
主循环中调用示例:
c

void* controller = fl_init_controller();
float err = read_sensor() - target_value;
float d_err = err - prev_err;
fl_set_input(controller, err, d_err);
float output = fl_compute_output(controller);
set_pwm(output);
‌内存优化‌

避免动态内存分配:在fl_init_controller()中使用静态内存池或预分配对象‌43。
关闭C++异常处理(通过编译器选项-fno-exceptions)‌3。
‌实时性保障‌

限制模糊推理计算时间,确保在控制周期内完成(如1ms内)‌12。
‌五、调试与验证‌
‌日志输出‌

通过串口重定向printf输出中间变量(如隶属度、规则激活强度)‌34。
‌参数调优‌

根据实际响应调整隶属函数范围与规则权重,结合阶跃响应测试优化稳态精度与超调量‌12。


具体, 你可以先看一下这个开源库, 看细问一个DEEPSEEK.
回复

使用道具 举报

ID:1150263 发表于 2025-5-12 16:16 | 显示全部楼层
咱们两个需求是一样的,可以加好友共同讨论吗,我用的是f103如果想把这个遗传算法加进去可能实现不了,我目前的方案是在matlab离线优化好参数,在单片机里面在线调整KP KI KD
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表