PID燈控算法

根據代碼分析,以下是針對PID算法和光敏傳感器系統的優化建議,分為算法優化、代碼結構優化和系統級優化三部分:


一、PID算法優化

1. 增量式PID + 輸出平滑
// 修改PID計算函數
uint16_t PID_calculation_fun(void) {if(PID_Str_Val.Tdata >= PID_Str_Val.T) {// 增量式PID計算float delta = PID_Str_Val.Kp * (PID_Str_Val.En - PID_Str_Val.En_1) +PID_Str_Val.Ki * PID_Str_Val.En + PID_Str_Val.Kd * (PID_Str_Val.En - 2*PID_Str_Val.En_1 + PID_Str_Val.En_2);// 輸出變化率限制(避免突變)if (delta > PID_Str_Val.max_delta) delta = PID_Str_Val.max_delta;else if (delta < -PID_Str_Val.max_delta) delta = -PID_Str_Val.max_delta;// 低通濾波平滑輸出PID_Str_Val.Dout = PID_Str_Val.output_alpha * delta + (1 - PID_Str_Val.output_alpha) * PID_Str_Val.Dout;PID_Str_Val.currpwm += PID_Str_Val.Dout;// ...限幅和狀態更新}return (uint16_t)PID_Str_Val.currpwm;
}

優化點

  • 增量式算法減少階躍響應超調。
  • 輸出變化率限制(max_delta)避免劇烈波動。
  • 低通濾波(output_alpha)平滑最終輸出。
2. 動態參數調整
// 根據光照變化動態調整PID參數
if (fabs(PID_Str_Val.En) > 500) {  // 大誤差時增強響應PID_Str_Val.Kp = 0.8;PID_Str_Val.Ki = 0.05;
} else {                           // 小誤差時抑制振蕩PID_Str_Val.Kp = 0.3;PID_Str_Val.Ki = 0.01;
}

二、輸入信號處理優化

1. 改進滑動平均濾波
// 使用加權滑動平均(近期數據權重更高)
float sum = 0, weight_total = 0;
for(int i=0; i<FILTER_WINDOW_SIZE; i++) {float weight = 1.0f / (i + 1);  // 權重遞減sum += filter_buffer[i] * weight;weight_total += weight;
}
PID_Str_Val.curr = sum / weight_total;
2. 死區處理
// 忽略微小誤差(避免頻繁調節)
if (fabs(PID_Str_Val.En) < PID_Str_Val.dead_zone) {PID_Str_Val.En = 0;
}

三、系統級優化

1. 自適應采樣周期
// 根據光照變化速度動態調整采樣周期
if (fabs(PID_Str_Val.En - PID_Str_Val.En_1) > 200) {  // 快速變化時加速采樣PID_Str_Val.T = 20;  // 20ms
} else {PID_Str_Val.T = 50;  // 50ms
}
2. 硬件優化
  • ADC配置:提高ADC采樣率(修改config.clk),減少軟件濾波壓力。
  • GPIO抗干擾:在光敏傳感器輸入端添加RC低通濾波(如100Ω電阻 + 100nF電容)。

四、代碼結構優化

1. 模塊化PID參數
typedef struct {float Kp, Ki, Kd;float T, Ti, Td;float dead_zone;float max_delta;float output_alpha;
} PID_Params;PID_Params fast_params = {0.8, 0.05, 0.1, 20, 30, 0.2, 10, 5, 0.3};
PID_Params slow_params = {0.3, 0.01, 0.05, 50, 50, 0.1, 5, 2, 0.5};
2. 狀態機管理
typedef enum {PID_STATE_INIT,PID_STATE_STEADY,PID_STATE_TRACKING
} PID_State;// 根據狀態切換參數
switch (current_state) {case PID_STATE_TRACKING:apply_params(fast_params);break;case PID_STATE_STEADY:apply_params(slow_params);break;
}

五、參數調試建議

  1. 調試順序

    • 先調 PKp)至系統開始振蕩,然后減半。
    • 再調 IKi)至穩態誤差消除,但避免積分飽和。
    • 最后調 DKd)抑制超調。
  2. 典型參數參考

    PID_Str_Val.Kp = 0.5;   // 比例(根據實際響應調整)
    PID_Str_Val.Ki = 0.02;  // 積分(較小值防飽和)
    PID_Str_Val.Kd = 0.1;   // 微分(抑制高頻噪聲)
    PID_Str_Val.dead_zone = 20;  // 死區(約2%量程)
    PID_Str_Val.max_delta = 10;  // 單步最大變化量
    

六、驗證與測試

  1. 階躍響應測試
    • 突然遮擋光源,觀察輸出是否平穩跟蹤。
  2. 抗干擾測試
    • 手動制造光照波動,檢查恢復速度。
  3. 長期穩定性
    • 連續運行24小時,確認無漂移或振蕩。

通過上述優化,系統將具有更平滑的響應、更低的抖動和更好的適應性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77112.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文件映射mmap與管道文件

在用戶態申請內存&#xff0c;內存內容和磁盤內容建立一一映射 讀寫內存等價于讀寫磁盤 支持隨機訪問 簡單來說&#xff0c;把磁盤里的數據與內存的用戶態建立一一映射關系&#xff0c;讓讀寫內存等價于讀寫磁盤&#xff0c;支持隨機訪問。 管道文件&#xff1a;進程間通信機…

在 Java 中調用 ChatGPT API 并實現流式接收(Server-Sent Events, SSE)

文章目錄 簡介OkHttp 流式獲取 GPT 響應通過 SSE 流式推送前端后端代碼消息實體接口接口實現數據推送給前端 前端代碼創建 sseClient.jsvue3代碼 優化后端代碼 簡介 用過 ChatGPT 的伙伴應該想過自己通過調用ChatGPT官網提供的接口來實現一個自己的問答機器人&#xff0c;但是…

硬盤分區格式之GPT(GUID Partition Table)筆記250407

硬盤分區格式之GPT&#xff08;GUID Partition Table&#xff09;筆記250407 GPT&#xff08;GUID Partition Table&#xff09;硬盤分區格式詳解 GPT&#xff08;GUID Partition Table&#xff09;是替代傳統 MBR 的現代分區方案&#xff0c;專為 UEFI&#xff08;統一可擴展固…

Vite環境下解決跨域問題

在 Vite 開發環境中&#xff0c;可以通過配置代理來解決跨域問題。以下是具體步驟&#xff1a; 在項目根目錄下找到 vite.config.js 文件&#xff1a;如果沒有&#xff0c;則需要創建一個。配置代理&#xff1a;在 vite.config.js 文件中&#xff0c;使用 server.proxy 選項來…

交換機與ARP

交換機與 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析協議&#xff09; 的關系主要體現在 局域網&#xff08;LAN&#xff09;內設備通信的地址解析與數據幀轉發 過程中。以下是二者的核心關聯&#xff1a; 1. 基本角色 交換機&#xff1a;工作在 數據鏈…

【Spring】小白速通AOP-日志記錄Demo

這篇文章我將通過一個最常用的AOP場景-方法調用日志記錄&#xff0c;帶你徹底理解AOP的使用。例子使用Spring BootSpring AOP實現。 如果對你有幫助可以點個贊和關注。謝謝大家的支持&#xff01;&#xff01; 一、Demo實操步驟&#xff1a; 1.首先添加Maven依賴 <!-- Sp…

git功能點管理

需求&#xff1a; 功能模塊1 已經完成&#xff0c;已經提交并推送到遠程&#xff0c;準備交給測試。功能模塊2 已經完成&#xff0c;但不提交給測試&#xff0c;繼續開發。功能模塊3 正在開發中。 管理流程&#xff1a; 創建并開發功能模塊1&#xff1a; git checkout main…

QGIS實戰系列(六):進階應用篇——Python 腳本自動化與三維可視化

歡迎來到“QGIS實戰系列”的第六期!在前幾期中,我們從基礎操作到插件應用逐步提升了 QGIS 技能。這一篇,我們將邁入進階領域,探索如何用 Python 腳本實現自動化,以及如何創建三維可視化效果,讓你的 GIS 項目更高效、更立體。 第一步:Python 腳本自動化 QGIS 內置了 Py…

高德地圖 3D 渲染-區域紋理圖添加

引入-初始化地圖&#xff08;關鍵代碼&#xff09; // 初始化頁面引入高德 webapi -- index.html 文件 <script src https://webapi.amap.com/maps?v2.0&key您申請的key值></script>// 添加地圖容器 <div idcontainer ></div>// 地圖初始化應該…

ffmpeg視頻轉碼相關

ffmpeg視頻轉碼相關 簡介參數 實戰舉栗子獲取視頻時長視頻轉碼mp4文件轉為hls m3u8 ts等文件圖片轉視頻抽取視頻第一幀獲取基本信息 轉碼日志輸出詳解轉碼耗時測試 簡介 FFmpeg 是領先的多媒體框架&#xff0c;能夠解碼、編碼、 轉碼、復用、解復用、流、過濾和播放 幾乎所有人…

【ISP】HDR技術中Sub-Pixel與DOL的對比分析

一、原理對比 Sub-Pixel&#xff08;空間域HDR&#xff09; ? 核心機制&#xff1a;在單個像素內集成一大一小兩個子像素&#xff08;如LPD和SPD&#xff09;&#xff0c;利用其物理特性差異&#xff08;靈敏度、滿阱容量&#xff09;同時捕捉不同動態范圍的信號。 ? 大像素&…

Vulnhub-IMF靶機

本篇文章旨在為網絡安全滲透測試靶機教學。通過閱讀本文&#xff0c;讀者將能夠對滲透Vulnhub系列IMF靶機有一定的了解 一、信息收集階段 靶機下載地址&#xff1a;https://www.vulnhub.com/entry/imf-1,162/ 因為靶機為本地部署虛擬機網段&#xff0c;查看dhcp地址池設置。得…

Linux內核中TCP協議棧的實現:tcp_close函數的深度剖析

引言 TCP(傳輸控制協議)作為互聯網協議族中的核心協議之一,負責在不可靠的網絡層之上提供可靠的、面向連接的字節流服務。Linux內核中的TCP協議棧實現了TCP協議的全部功能,包括連接建立、數據傳輸、流量控制、擁塞控制以及連接關閉等。本文將深入分析Linux內核中tcp_close…

java+postgresql+swagger-多表關聯insert操作(七)

入參為json&#xff0c;然后根據需要對多張表進行操作&#xff1a; 入參格式&#xff1a; [{"custstoreName":"swagger-測試經銷商01","customerName":"swagger-測試客戶01","propertyNo":"swaggertest01",&quo…

R語言——繪制生命曲線圖(細胞因子IL5)

繪制生命曲線圖&#xff08;根據細胞因子&#xff09; 說明流程代碼加載包讀取Excel文件清理數據重命名列名處理IL-5中的"<"符號 - 替換為檢測下限的一半首先找出所有包含"<"的值檢查缺失移除缺失值根據IL-5中位數將患者分為高低兩組 創建生存對象擬…

Python----計算機視覺處理(Opencv:道路檢測完整版:透視變換,提取車道線,車道線擬合,車道線顯示,)

Python----計算機視覺處理&#xff08;Opencv:道路檢測之道路透視變換) Python----計算機視覺處理&#xff08;Opencv:道路檢測之提取車道線&#xff09; Python----計算機視覺處理&#xff08;Opencv:道路檢測之車道線擬合&#xff09; Python----計算機視覺處理&#xff0…

【Oracle篇】跨字符集遷移:基于數據泵的ZHS16GBK轉AL32UTF8全流程遷移

&#x1f4ab;《博主主頁》&#xff1a;奈斯DB-CSDN博客 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對SQLserver、NoSQL(MongoDB)有了解 &#x1f496;如果覺得文章對你有所幫…

【C++算法】50.分治_歸并_翻轉對

文章目錄 題目鏈接&#xff1a;題目描述&#xff1a;解法C 算法代碼&#xff1a;圖解 題目鏈接&#xff1a; 493. 翻轉對 題目描述&#xff1a; 解法 分治 策略一&#xff1a;計算當前元素cur1后面&#xff0c;有多少元素的兩倍比我cur1小&#xff08;降序&#xff09; 利用單…

深入講解:智能合約中的讀寫方法

前言 在探秘區塊鏈開發:智能合約在 DApp 中的地位及與傳統開發差異一文中我提到對于智能合約中所有的寫入其實都算是交易。而在一個完整的智能合約代碼中最大的兩個組成部分就是讀取和寫入。 本文將為你深入探討該兩者方法之間的區別。 寫方法 寫方法其實就是對區塊鏈這一…

Go語言類型捕獲及內存大小判斷

代碼如下&#xff1a; 類型捕獲可使用&#xff1a;reflect.TypeOf()&#xff0c;fmt.Printf在的%T。 內存大小判斷&#xff1a;len()&#xff0c;unsafe.Sizeof。 package mainimport ("fmt""unsafe""reflect" )func main(){var i , j 1, 2f…