標(biāo)題: 模糊PID在單片機(jī)里面的實(shí)現(xiàn) [打印本頁]

作者: 余英杰    時(shí)間: 2025-3-5 23:26
標(biāo)題: 模糊PID在單片機(jī)里面的實(shí)現(xiàn)
我現(xiàn)在想在單片機(jī)里面實(shí)現(xiàn)模糊控制pid,模糊規(guī)則我在matlab里面制定好了,怎么用到單片機(jī).c文件里了;還有一個(gè)問題,如果我后面想加GA遺傳算法去優(yōu)化模糊規(guī)則,有應(yīng)該怎么辦,求大神們?cè)敿?xì)指點(diǎn)一下,萬分感謝

作者: jjwangxu2008    時(shí)間: 2025-3-7 08:53
我也想知道
作者: qinlu123    時(shí)間: 2025-3-7 09:13
我用串級(jí)PID已經(jīng)大殺四方了,模糊PID沒實(shí)戰(zhàn)過
作者: ZSJM    時(shí)間: 2025-3-7 18:20
問了下AI: 實(shí)現(xiàn)模糊邏輯有一個(gè)C++開源庫. 要使用到stm32fxxx里不容易.
下載并包含 FuzzyLite:
從 FuzzyLite GitHub 獲取庫并包含在你的項(xiàng)目中。( github/fuzzylite/fuzzylite )


在STM32中集成FuzzyLite實(shí)現(xiàn)模糊邏輯控制,需結(jié)合硬件特性與庫的C++特性進(jìn)行適配。以下是關(guān)鍵步驟與技術(shù)要點(diǎn):

‌一、硬件與工具鏈配置‌
‌啟用C++支持‌

在Keil MDK或STM32CubeIDE中,需勾選C++編譯選項(xiàng)(如AC6編譯器支持C++11)‌。
鏈接時(shí)添加-lstdc++參數(shù),確保C++標(biāo)準(zhǔn)庫正常調(diào)用‌37。
‌外設(shè)初始化‌

使用STM32CubeMX配置必要外設(shè)(如ADC采集輸入、PWM輸出控制信號(hào)),生成HAL庫基礎(chǔ)工程‌。
‌二、FuzzyLite庫的C接口封裝‌
‌創(chuàng)建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++對(duì)象‌

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

extern "C" {
    void* fl_init_controller() {
        auto* engine = new fl::FuzzyEngine();
        // 配置隸屬函數(shù)與規(guī)則庫(參考‌:ml-citation{ref="1" data="citationList"}中的模糊化步驟)
        return static_cast<void*>(engine);
    }
    // 其他接口實(shí)現(xiàn)...
}
‌三、模糊控制器實(shí)現(xiàn)‌
‌輸入模糊化‌

定義誤差(Err)與誤差變化率(dErr)的隸屬函數(shù),如“負(fù)大(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));
‌規(guī)則庫設(shè)計(jì)‌

基于經(jīng)驗(yàn)或仿真設(shè)計(jì)控制規(guī)則,如:
IF Err is NB AND dErr is NB THEN Output is PB‌12。
‌解模糊方法‌

使用重心法(Centroid)或最大隸屬度法,輸出精確控制量‌12。
‌四、工程集成與優(yōu)化‌
‌代碼結(jié)構(gòu)管理‌

將封裝后的C接口文件(.h/.cpp)加入工程,并通過頭文件聲明供主程序調(diào)用‌73。
主循環(huán)中調(diào)用示例:
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);
‌內(nèi)存優(yōu)化‌

避免動(dòng)態(tài)內(nèi)存分配:在fl_init_controller()中使用靜態(tài)內(nèi)存池或預(yù)分配對(duì)象‌43。
關(guān)閉C++異常處理(通過編譯器選項(xiàng)-fno-exceptions)‌3。
‌實(shí)時(shí)性保障‌

限制模糊推理計(jì)算時(shí)間,確保在控制周期內(nèi)完成(如1ms內(nèi))‌12。
‌五、調(diào)試與驗(yàn)證‌
‌日志輸出‌

通過串口重定向printf輸出中間變量(如隸屬度、規(guī)則激活強(qiáng)度)‌34。
‌參數(shù)調(diào)優(yōu)‌

根據(jù)實(shí)際響應(yīng)調(diào)整隸屬函數(shù)范圍與規(guī)則權(quán)重,結(jié)合階躍響應(yīng)測試優(yōu)化穩(wěn)態(tài)精度與超調(diào)量‌12。


具體, 你可以先看一下這個(gè)開源庫, 看細(xì)問一個(gè)DEEPSEEK.

作者: 最長的男人    時(shí)間: 2025-5-12 16:16
咱們兩個(gè)需求是一樣的,可以加好友共同討論嗎,我用的是f103如果想把這個(gè)遺傳算法加進(jìn)去可能實(shí)現(xiàn)不了,我目前的方案是在matlab離線優(yōu)化好參數(shù),在單片機(jī)里面在線調(diào)整KP KI KD




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1