用c語言實現pid,用c語言實現ping功能 判斷ip在線

本文目錄一覽:

如何用c語言實現PID算法的參數計算

這個問題屬於PID的自整定,有簡單的繼電器算法,我試過,效果不理想。

說了半天,我也沒找到很好用的自整定程序,呵呵。

如果你找到好用的,希望能夠分享一下哦。

什麼是pid算法,難學嗎,用C語言,plc怎麼實現?

一、什麼是PID:

PID即:Proportional(比例)、Integral(積分)、Differential(微分)的縮寫。顧名思義,PID控制算法是結合比例、積分和微分三種環節於一體的控制算法,它是連續系統中技術最為成熟、應用最為廣泛的一種控制算法,該控制算法出現於20世紀30至40年代,適用於對被控對象模型了解不清楚的場合。 —百度百科

二、PID是否難學:

在工業應用中PID及其衍生算法是應用最廣泛的算法之一,是當之無愧的萬能算法,如果能夠熟練掌握PID算法的設計與實現過程,對於一般的研發人員來講,應該是足夠應對一般研發問題了,而難能可貴的是,在我所接觸的控制算法當中,PID控制算法又是最簡單,最能體現反饋思想的控制算法,可謂經典中的經典。經典的未必是複雜的,經典的東西常常是簡單的,而且是最簡單的,想想牛頓的力學三大定律吧,想想愛因斯坦的質能方程吧,何等的簡單!簡單的不是原始的,簡單的也不是落後的,簡單到了美的程度。 —【1】

三、PID算法的C語言源碼:

PID 控制算法可以分為位置式 PID 和增量式 PID 控制算法

詳細見參考【1】【2】

參考:

【1】PID算法

【2】簡易PID算法的快速掃盲(超詳細+過程推導+C語言程序)

PID算法的C語言實現

基本流程

積分環節:主要是用來消除 靜差 (系統穩定後輸出值和設定值之間的差值,積分環節實際上就是偏差累積的過程,把累積的誤差加到原來系統上以抵消系統造成的靜差)

微分環節:反映了偏差信號的變化規律,根據偏差信號的變化規律來進行超前調節,從而增加系統的快速性

對上述公式進行離散化(採樣):兩個公式

增量型PID:

通過增量型PID公式可以看出,最終表達結果和最近三次的偏差有關,最終輸出結果應該為:

首先定義結構變量體:

然後初始化變量

最後編寫控制算法

基本算法,沒有考慮死區問題,沒有設定上下限

在啟動、結束或大幅度增減設定時,短時間內系統輸出有很大的偏差,會造成PID運算的積分積累,導致控制量超過執行機構可能允許的最大動作範圍對應的極限控制量,從而引起較大的超調,甚至是振蕩。

為了克服這個問題,引入積分分離的概念,即當被控量和設定值偏差較大時,取消積分作用;當被控量接近設定值時,引入積分控制,以消除靜差,提高精度。

abs :絕對值

令index=0使積分環節失效

積分飽和現象:如果系統存在一個方向的偏差,PID控制器的輸出由於積分作用的不斷累加而加大,從而導致執行機構達到極限位置。此時計算器輸出量超出正常運行範圍而進入飽和區,一旦系統出現反向偏差,輸出量將逐漸從飽和區退出,進入飽和區越深則退出飽和區時間越長,在這段時間裡,執行機構仍然停留在極限位置而不隨偏差反向而立即做出相應改變,造成性能惡化。

採用梯形積分能夠減小余差,提高精度

改變積分係數,若偏差大,積分作用減弱,係數減小;若偏差小,積分作用增強,係數增大。

變積分PID的基本思想是設法改變積分項的累加速度,使其與偏差大小對應。

使整個系統的穩定速度非常快

比例係數Kp的作用是加快系統的響應速度提高系統的調節精度

積分係數Ki的作用是消除系統的穩態誤差

微分係數Kd的作用是改善系統的動態特性

反應系統性能的兩個參數是系統誤差和誤差變化律

怎樣用c語言實現理想微分pid簡單的計算機繪圖程序

這是C語言的程序用的的積分分離,增量式算法你可以看看~在我用的片子是89C52

/*********************************************************/

/* 名稱: float PIDprocess1 */

/* 功能: PID adjust */

/* 說明: */

/* 調用: */

/* 輸入: float xdata *Yn, float xdata *Rn */

/* 返回值: deltaPn */

/*********************************************************/

float PIDprocess1()

{

int data E_0;

float data deltaPn,deltaPi,deltaPp,deltaPd,PsumCopy;

E_0=SetTemperature1-CurrentTemperature1;

if(abs(E_0)Emax)

{

deltaPp=(float)Kp*(E_0-E_11);

deltaPd=(float)Kd*(E_0-2*E_11+E_21);

// if(deltaPd=dPdmax) deltaPd=0;

deltaPn=deltaPp+deltaPd;

}

else

{

if(abs(E_0)E0)

{

deltaPi=(float)Ki*E_0*(Emax-abs(E_0))/(Emax-E0);

}

else

{ //小誤差時的處理

deltaPi=(float)Ki*E_0;

// if(fabs(deltaPi)dPimin) deltaPi=0;

}

deltaPp=(float)Kp*(E_0-E_11);

deltaPd=(float)Kd*(E_0-2*E_11+E_21);

// if(deltaPd=dPdmax) deltaPd=0;

deltaPn=deltaPp+deltaPi+deltaPd;

}

/* if(fabs(deltaPn)dPmax)

{

if(deltaPn0) deltaPn=dPmax;

else deltaPn=-dPmax;

} */

Psum1+=deltaPn;

PsumCopy=Psum1;

if(PsumCopyPmax) PsumCopy=Pmax;

if(PsumCopyPmin) PsumCopy=Pmin;

E_21=E_11;

E_11=E_0;

return(PsumCopy);

}

/*********************************************************/

/* 名稱: float PIDprocess2 */

/* 功能: PID adjust */

/* 說明: */

/* 調用: */

/* 輸入: float xdata Yn, float xdata Rn */

/* 返回值: Psum2 */

/*********************************************************/

float PIDprocess2()

{

int data E_0;

float data deltaPn,deltaPi,PsumCopy;

E_0=SetTemperature2-CurrentTemperature2;

if(abs(E_0)Emax)

{

deltaPn=(float)Kp*(E_0-E_12)+(float)Kd*(E_0-2*E_12+E_22);

}

else

{

if(abs(E_0)E0)

{

deltaPi=(float)Ki*E_0*(Emax-abs(E_0))/(Emax-E0);

}

else

{ //小誤差時的處理

deltaPi=(float)Ki*E_0;

}

deltaPn=(float)Kp*(E_0-E_12)+deltaPi+(float)Kd*(E_0-2*E_12+E_22);

}

/* if(fabs(deltaPn)dPmax)

{

if(deltaPn0) deltaPn=dPmax;

else deltaPn=-dPmax;

}*/

Psum2+=deltaPn;

PsumCopy=Psum2;

if(PsumCopyPmax) PsumCopy=Pmax;

if(PsumCopyPmin) PsumCopy=Pmin;

E_22=E_12;

E_12=E_0;

return(PsumCopy);

}

pid控制的C語言編程

#includeunistd.h

#includestdio.h

int main(int argc,int **argv)

{

int pid=fork();

if(pid==-1)

{

printf(“error”);

}

else if(pid==0)

{

printf(“This is the child process!\n”);

}

else

{

printf(“This is the parent process! child process id=%d\n”,pid);

}

return 0;

}

首先為什麼這段代碼gcc編譯不了,只能用g++編譯,gcc編譯顯示結果如下

Undefined first referenced

symbol in file

__gxx_personality_v0 /var/tmp//ccuHN8IS.o

ld: fatal: Symbol referencing errors. No output written to t5

collect2: ld returned 1 exit status

其次,g++編譯後運行結果如下

This is the parent process! child process id=27406

This is the child process!

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/301061.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-29 14:19
下一篇 2024-12-29 14:19

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Java和Python哪個功能更好

    對於Java和Python這兩種編程語言,究竟哪一種更好?這個問題並沒有一個簡單的答案。下面我將從多個方面來對Java和Python進行比較,幫助讀者了解它們的優勢和劣勢,以便選擇…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28

發表回復

登錄後才能評論