電賽控制類PID算法實現

一、什么是PID

PID(Proportional-Integral-Derivative)是一種經典的控制算法,廣泛應用在自動化控制系統中。它是通過對被控對象的測量值和設定值進行比較,并根據誤差的大小來調整輸出信號,實現對被控對象的穩定控制。

PID控制器由三個部分組成:比例控制器(P)、積分控制器(I)和微分控制器(D)。這三個部分分別對應了控制系統中的比例、積分和微分操作。

首先,我們來看比例控制器(P)。比例控制器根據被控對象當前的偏差與設定值之間的比例關系來調整輸出信號。假設被控對象的偏差為e,比例增益為Kp,那么比例控制器的輸出信號為Kp * e。比例控制器主要用于快速響應系統的初始偏差,但可能會導致系統存在超調和穩態誤差。

接下來是積分控制器(I)。積分控制器根據被控對象偏差的累積值來調整輸出信號,以消除穩態誤差。假設被控對象的偏差累積值為∑e,積分增益為Ki,那么積分控制器的輸出信號為Ki * ∑e。積分控制器主要用于消除系統的穩態誤差,但如果增益過大,可能會導致系統出現震蕩或不穩定的情況。

最后是微分控制器(D)。微分控制器根據被控對象偏差的變化率來調整輸出信號,以抑制系統的超調和振蕩。假設被控對象的偏差變化率為de/dt,微分增益為Kd,那么微分控制器的輸出信號為Kd * (de/dt)。微分控制器主要用于提高系統的穩定性和響應速度,但如果增益過大,可能會引入噪聲或造成系統震蕩。

PID控制器的輸出信號是這三個部分的總和:輸出信號 = Kp * e + Ki * ∑e + Kd * (de/dt)。實際應用中,可以通過試驗和經驗來確定適當的增益參數,以達到所需的控制效果。

總結一下,PID控制器是一種常用的控制算法,通過比例、積分和微分操作來調整輸出信號,實現對被控對象的穩定控制。它在工業、自動化等領域廣泛應用,能夠有效地解決許多控制問題。然而,在實際應用中需要根據具體情況調整參數,以獲得最佳的控制效果。

學過自動控制原理的對PID并不陌生,PID控制是對偏差信號e(t)進行比例、積分和微分運算變換后形成的一種控制規律。PID 算法的一般形式:

  • PID控制系統原理框圖


二、PID離散化

在實際應用中,PID控制器通常需要在數字系統中進行離散化處理。離散化是將連續時間域的PID控制器轉換為離散時間域的控制器,以適應數字控制系統的要求。

離散化PID控制器的關鍵在于將連續時間域的微分和積分操作轉換為離散時間域的形式。下面介紹一種常用的離散化方法:采樣周期法(也稱為Z變換法)。

  1. 采樣周期(Sampling Period):首先確定控制系統的采樣周期,即每次對被控對象進行測量和調整輸出的時間間隔。

  2. 離散化比例項(Discretization of the Proportional Term):離散化比例項可以簡單地通過乘以采樣周期得到。離散比例增益Kp_discrete = Kp * T(其中Kp為連續比例增益,T為采樣周期)。

  3. 離散化積分項(Discretization of the Integral Term):離散化積分項可以使用數值積分方法來實現,常用的方法是離散化誤差的累加。離散積分增益Ki_discrete = Ki * T(其中Ki為連續積分增益,T為采樣周期)。

  4. 離散化微分項(Discretization of the Derivative Term):離散化微分項可以使用數值微分方法來實現,常用的方法是差分運算。離散微分增益Kd_discrete = Kd / T(其中Kd為連續微分增益,T為采樣周期)。

  5. 離散化PID控制器(Discretization of the PID Controller):將離散化的比例項、積分項和微分項相加,得到離散化的PID控制器輸出信號。離散化PID控制器的輸出信號為PID_discrete = Kp_discrete * e + Ki_discrete * ∑e + Kd_discrete * (de/dt)。

通過以上離散化方法,我們可以將連續時間域的PID控制器轉換為離散時間域的控制器,方便在數字控制系統中實現。

需要注意的是,在離散化過程中可能會引入一定的誤差,特別是在采樣周期較大或被控對象響應速度較快的情況下。因此,在實際應用中,需要根據系統的要求和性能指標進行參數調節和系統優化,以獲得最佳的離散化PID控制效果。

對PID連續系統離散化,從而方便在處理器上實現,PID 離散表示形式:

離散化后最終得到位置式PID:

u(k)為控制器輸出的控制量;(輸出)
e(k)為偏差信號,它等于給定量與輸出量之差;(輸入)
Kp 為比例系數;
Ti 為積分時間常數;
Td 為微分時間常數。


1. 位置式PID公式

2. 增量式PID公式


三、兩種PID的不同點

  • 位置式
    是一種非遞推算法,輸出值U(k)和執行機構的實際位置一一對應,在不帶積分部件的對象中可以很好的應用。但是每次輸出均與過去的狀態有關,計算量大。
  • 增量式
    輸出的是增量,控制增量的值僅與最近3次采樣值有關,不需要累計偏差,運算量小,計算錯誤影響小。但會積分截斷效應大,有穩態誤差。

四、C語言程序實現

  • pid.c
#include "pid.h"/*定義PID參數結構體*/
typedef struct _PID
{float Kp,Ki,Kd;//比例系數、積分系數、微分系數float SetValue,ActualValue;//目標值、實際值float Error;//第K次誤差float LastError;//第K-1次誤差float PreError;//第K-2次誤差float SumError;//累計偏差float Integral,MaxI;//積分、積分限幅float Output,MaxOut;//輸出、輸出限幅
}PID;/************************************************
*@brief  :位置式PID控制器
*@param  :PID結構體變量地址,當前實際值
*@retval : 期望輸出值
*************************************************/
int32_t Position_PID_Control(PID *pid,float Cur_Value)
{pid->Error=pid->SetValue-Cur_Value; //計算偏差      pid->SumError +=pid->Error;//累計偏差pid->ActualValue=(pid->Kp*(pid->Error-pid->LastError))//比例環節+(pid->Ki*pid->SumError)//積分環節+(pid->Kd*(pid->Error-pid->LastError);//微分環節pid->LastError=pid->Error;return ((int32_t)pid->ActualValue); //返回計算值	 
}/************************************************
*@brief  :速度閉環PID控制
*@param  :PID結構體變量地址,當前實際值
*@retval : 期望輸出值
*************************************************/
int32_t Inc_Pid_Ctrl(PID *pid,float Cur_Value)
{pid->Error=pid->SetValue-Cur_Value; //計算偏差pid->ActualValue +=(pid->Kp*(pid->Error-pid->LastError))//比例環節+(pid->Ki*(pid->Error))//積分環節+(pid->Kd*(pid->Error-2*pid->LastError+pid->PreError));//微分環節 pid->PreError=pid->LastError;//存儲偏差,進行下次計算                                                             pid->LastError=pid->Error;                                                            	return ((int32_t)pid->ActualValue); //返回計算值
}

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

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

相關文章

【C++】map和set的封裝

目錄 前言一、紅黑樹的設計1.1 紅黑樹存儲節點的設計1.2 紅黑樹的迭代器1.3 map的設計1.4 set的設計1.5關于map與set的const_iterator設計 前言 我們知道map和set的底層都是用紅黑樹實現的,但是set和map的結構不一樣,set只有一個參數K,而map…

前端基礎:1-2 面向對象 + Promise

面向對象 對象是什么?為什么要面向對象? 通過代碼抽象,進而藐視某個種類物體的方式 特點:邏輯上遷移更加靈活、代碼復用性更高、高度的模塊化 對象的理解 對象是對于單個物體的簡單抽象對象是容器,封裝了屬性 &am…

如何安裝 Docker

引言 - 介紹 Docker 技術的重要性和應用場景 - 簡要解釋 Docker 的工作原理和優勢 Docker 的安裝 Docker 在不同平臺上的安裝方法(Windows、Mac、Linux) Docker 是一個開源的容器化平臺,可以幫助開發人員和運維團隊更輕松地打包、交付和運行…

python 裝飾器 帶參數和不帶參數

裝飾器是Python語言中一種特殊的語法,用于在不修改原函數代碼的情況下,為函數添加額外的功能或修改函數的行為。通過裝飾器,我們可以在函數執行前后執行一些額外的代碼,或者修改函數的參數。 要使用裝飾器引入函數和參數&#xf…

Linux_應用篇(07) 系統信息與系統資源

在應用程序當中,有時往往需要去獲取到一些系統相關的信息,譬如時間、日期、以及其它一些系統相關信息,本章將向大家介紹如何通過 Linux 系統調用或 C 庫函數獲取系統信息, 譬如獲取系統時間、日期以及設置系統時間、日期等&#x…

restTemplate返回報文亂碼問題

默認服務端使用UTF8編碼 排查1&#xff1a; 請求前手動設置UTF-8編碼解析報文 RestTemplate restTemplate new RestTemplate(); restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); ResponseEntity<String> excha…

三能一體運營體系助力政企支撐水平提升

生產力的發展是現代社會孜孜不倦的追求&#xff0c;由此產生了我們熟悉的“機械化、電子化、信息化”乃至現今正在發生的“智能化”四次工業革命。這些是由技術的突破性發展帶來的&#xff0c;但我們也注意到生產力發展的另一個助力&#xff0c;即生產效率的提升&#xff0c;19…

【MySQL數據庫】mysql日志管理、備份與恢復

mysql日志管理、備份與恢復 MySQL數據庫備份及日志一、數據庫備份分類&#xff1a;如何選擇邏輯備份策略 (頻率)完全備份與恢復備份恢復 增量備份與恢復實現增量備份 基于時間點與位置恢復 二.MySQL日志管理 MySQL數據庫備份及日志 在生產環境中&#xff0c;數據的安全性是至關…

在未來你將何去何從?

在數字化的浪潮中&#xff0c;信息技術行業無疑是推動全球經濟和社會發展的重要動力。隨著科技的不斷迭代與進步&#xff0c;云計算、大數據、人工智能&#xff08;AI&#xff09;、物聯網&#xff08;IoT&#xff09;、5G通信和區塊鏈等技術已經深入到我們生活的每一個角落&am…

鴻蒙原生應用元服務開發-鴻蒙真機運行項目實戰與注意事項

一、解壓項目注意項目包不能為中文 二、用數據線將裝好DevEco Studio的電腦與設置為開發者模式的鴻蒙手機相連接。 三、將項目包托進DevEco Studio 中 注意項目包文件不能有嵌套 四、查看設備運行 五、點擊項目結構 六、勾選紅色框圈部分 登錄開發者賬號 七、選擇好公司 八、等…

我是如何使用 Next.js14 + Tailwindcss 重構個人項目的

前言 去年在學習 React 和 Nest 的時候&#xff0c;參考了大佬 imsyy 的項目 DailyHot&#xff0c;以此項目的靈感基于 React 開發&#xff0c;完成之后就沒怎么在意。 后來發現這個項目還有點小流量&#xff0c;每天差不多 200-400 的 IP 訪問量&#xff1a; 我又抽時間優…

深度學習之基于Pytorch框架手寫數字識別

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 手寫數字識別是數字圖像處理領域的一個經典問題&#xff0c;也是深度學習技術的一個常用應用場…

AWS計算之Amazon Lightsail

Amazon Lightsail是亞馬遜提供的一種簡化的虛擬私有服務器(VPS)服務&#xff0c;旨在幫助開發人員快速、輕松地搭建和管理虛擬服務器。Lightsail提供了預配置地計算資源、網絡、存儲和數據傳輸選項&#xff0c;用戶可以通過簡單的界面選擇所需的配置&#xff0c;輕松部署應用程…

51匯編--數碼管時鐘

實現一個24小時制的電子鐘程序&#xff0c;在實驗箱的6個數碼管上顯示時分秒&#xff08;用定時器0中斷更新計時時間&#xff0c;時間值以壓縮BCD碼形式保存在內部RAM的30H31H和32H單元&#xff09;。 PC機可通過串行口發送要設置的時間給單片機&#xff08;發送的時間格式為壓…

java 重寫接口的default方法

在Java 8中&#xff0c;接口可以包含默認方法&#xff08;default methods&#xff09;&#xff0c;這些方法可以有默認實現。如果一個類實現了包含默認方法的接口&#xff0c;并且沒有提供這個方法的實現&#xff0c;則會使用接口中的默認實現。 如果需要重寫接口中的默認方法…

【MySQL精通之路】SQL優化(1)-查詢優化(11)-多范圍查詢優化

主博客&#xff1a; 【MySQL精通之路】SQL優化(1)-查詢優化-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL優化(1)-查詢優化(10)-外部聯接簡化-CSDN博客 下一篇&#xff1a; 當基表很大且未存儲在存儲引擎的緩存中時&#xff0c;使用輔助索引上的范圍掃描讀取行可能會…

uniappx 獲取設備唯一標識(OAID、AAID、AndroidID、IMEI等) Ba-IdCode-U

簡介&#xff08;下載地址&#xff09; Ba-IdCode-U 是一款可以獲取國內各大手機廠商 OAID&#xff08;開放匿名設備標識&#xff09;及海外手機平臺 AAID&#xff08;安卓廣告標識&#xff09;的uniapp插件。另外也支持獲取 IMEI/MEID、AndroidID、WidevineID、PseudoID、GUI…

Spring Cloud Alibaba-06-Sleuth鏈路追蹤

Lison <dreamlison163.com>, v1.0.0, 2024.4.03 Spring Cloud Alibaba-06-Sleuth鏈路追蹤 文章目錄 Spring Cloud Alibaba-06-Sleuth鏈路追蹤為什么使用鏈路追蹤常見鏈路追蹤解決方案Sleuth概述概述Sleuth術語 Sleuth Zipkin 原理Sleuth原理簡述Zipkin 原理簡述 Sleut…

Python庫之`lxml`的高級用法深度解析

Python庫之lxml的高級用法深度解析 簡介 lxml是一個功能強大的第三方庫&#xff0c;它提供了對XML和HTML文檔的高效處理能力。除了基本的解析和創建功能外&#xff0c;lxml還包含了一些高級用法&#xff0c;這些用法可以幫助開發者在處理復雜文檔時更加得心應手。 高級解析技…

代碼隨想錄——路徑總和(Leetcode113)需要回顧

題目鏈接 遞歸 本題遞歸需要遍歷整棵樹&#xff0c;所以遞歸沒有返回值 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* T…