日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PID控制方法及C语言其实现

發(fā)布時間:2024/10/12 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PID控制方法及C语言其实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?在這里暫且將其歸為模擬技術(shù)吧!

?? 前一段時間由于開關(guān)電源的控制,做了一下PID的控制算法,和之前自己的方法對比了一下,感覺效果確實(shí)要好不好,關(guān)鍵是參數(shù)調(diào)好了之后就會很穩(wěn)定,電壓波動比較小,因此有一定的使用價值和實(shí)用價值!由于沒有學(xué)過自動控制原理,所以很多的東西還是從網(wǎng)上看到的,理解起來還是比較生硬,昨天晚上遇到一個問題,現(xiàn)在想拿出來和大家一起思考一下,望大家批評指正!

????? 首先還是拿出公式:

???? (1)式為PID控制的離散公式,其中e(k)為目標(biāo)值和輸出反饋值的誤差。

???? 由(1)式可以得到(2)式,然后將兩者想減,得到(3)式。

??? 其次,對公式進(jìn)行簡單的介紹。PID控制在實(shí)際應(yīng)用廣泛主要分為兩種控制方式:位置式和增量式。

(1)式是簡單的求和公式的使用方式,這個也是位置式的控制依據(jù),(3)式為對(1)式的變形,是增量式的控制依據(jù)。由于依據(jù)的公式的形式不一樣,所以具體的實(shí)現(xiàn)形勢不一樣。

????? 由公式(1)的實(shí)現(xiàn)形式可以看到,其中有求和項(xiàng),也就是積分項(xiàng),而公式(3)則沒有求和項(xiàng)。但是注意 一點(diǎn),后者的得出的是相鄰的兩者的差值,所以這個不是實(shí)際的控制量,實(shí)際的控制量是對(u(k)-u(k-1))進(jìn)行求和得到的。由公式可知,(1)式是能夠直接給出控制量的,而(3)式需要多次控制量的累加得到的,這樣就導(dǎo)致了我們實(shí)現(xiàn)的時間相對長一些,響應(yīng)速度也就慢一些。

?????? 兩者實(shí)現(xiàn)各有優(yōu)點(diǎn),位置式相當(dāng)于是一個指南針吧,始終向著設(shè)定的目標(biāo)值,而增量式就是一點(diǎn)點(diǎn)想著目標(biāo)值靠近。前者實(shí)現(xiàn)的過程中要求反饋量比較精確,或是說你的采樣量比較干凈,反饋比例誤差小,否則指南針就會指偏了方向。而增量式則是相當(dāng)于一個死纏難打求婚的男士,一點(diǎn)點(diǎn)向你靠近,不是直接達(dá)到,先是靠近你朋友,然后未來的丈母娘,搞滲透,最后才慢慢達(dá)到目標(biāo)。這個原因很簡單,因?yàn)楝F(xiàn)在他現(xiàn)在沒有信息的反饋渠道,也就是反饋量不準(zhǔn)確,他必須要先去獲得反饋量,想一蹴而就,要是反饋量不準(zhǔn)確,那肯定就會超調(diào),就會吃閉門羹的。所以說增量式還是適合反饋量不準(zhǔn)確,反饋噪聲大,或是要求輸出盡可能比較穩(wěn)定的情況下面。

?????? 現(xiàn)在拿出程序,看看吧!

先看位置式。??? *==================================================================================================== PID計(jì)算部分 =====================================================================================================*/ unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) { unsigned int dError,Error; Error = pp->SetPoint - NextPoint; // 偏差 pp->SumError += Error; // 積分 dError = pp->LastError - pp->PrevError; // 當(dāng)前微分 pp->PrevError = pp->LastError; pp->LastError = Error; return (pp->Proportion * Error//比例 + pp->Integral * pp->SumError? //積分項(xiàng) + pp->Derivative * dError); //?? 微分項(xiàng) } /*********************************************************** 位置式在實(shí)現(xiàn)的過程中,一目了然,清楚明白,看一下公式就能知道實(shí)現(xiàn)過程。因此沒有什么好說的。還是先看看增量式。(以下是我的一個搞智能汽車的同學(xué)幫我修改的增量式的程序,但是我一直覺得有點(diǎn)問題,雖然也能實(shí)現(xiàn)控制,但是和公式對著看了一下還是不對應(yīng),而在進(jìn)行累加的時候,我發(fā)現(xiàn)那樣根本就不行,因?yàn)槔奂拥玫降慕Y(jié)果一直是負(fù)值,這個是不能直接給我的pwm控制寄存器的。然后我人為修改為進(jìn)行累減,然后就可以進(jìn)行控制了)。我不知道問題是不是出在這里,所以還是拿出來和大家討論討論。

先看程序:

float PIDCalc( struct PID *pp, unsigned int NextPoint ) { float dError,Error,temp; temp=(NextPoint*3.3/4096.0)*7.5;//將采樣電壓值轉(zhuǎn)換位輸出電壓值

pp->SumError = pp->SetPoint-temp? ; //積分?? Error = pp->SumError-pp->LastError; // 偏差 dError = Error - pp->PrevError; // 當(dāng)前微分 pp->PrevError = Error; pp->LastError = pp->SumError; temp=(pp->Proportion * Error//比例 + pp->Integral * pp->SumError? //積分項(xiàng) + pp->Derivative * dError); //?? 微分項(xiàng) return temp; }

現(xiàn)在我們對應(yīng)這個公式和微分項(xiàng)看看,由于增量式中微分項(xiàng)為e(k)-e(k-1)-(e(k-1)-e(k-2)=e(k)-2e(k-1)+e(k-2);

那么在我的這個程序?qū)崿F(xiàn)的過程中,這是直接將e(k)-e(k-1)作為微分項(xiàng),顯然這個公式的差距很大,即便是工程應(yīng)用上有很大的簡約或是其他處理,但是這個已經(jīng)嚴(yán)重超出等效的范圍。

?????? 另外昨天晚上轉(zhuǎn)載了一文章,在空間里面,也就將PID的增量控制的,但是實(shí)現(xiàn)方式和這個卻不大相同,大家也參考一下,這個在理解的時候可能要簡單一些,但是初期的跳出合理的參數(shù)會更難一點(diǎn),因?yàn)楹喕蠛秃喕暗年P(guān)系并不是線性關(guān)系。因?yàn)橛懈泳€性條件下,適當(dāng)使用二分法還是能迅速找到最佳參數(shù)的位置。

?? 希望大家批評指正哈!

轉(zhuǎn)載于:https://www.cnblogs.com/farbeyond/p/5204675.html

總結(jié)

以上是生活随笔為你收集整理的PID控制方法及C语言其实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。