基于STM32-PID閉環(huán)控制調(diào)速系統(tǒng)_第1頁
基于STM32-PID閉環(huán)控制調(diào)速系統(tǒng)_第2頁
基于STM32-PID閉環(huán)控制調(diào)速系統(tǒng)_第3頁
基于STM32-PID閉環(huán)控制調(diào)速系統(tǒng)_第4頁
基于STM32-PID閉環(huán)控制調(diào)速系統(tǒng)_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

課程設(shè)計(jì)報(bào)告課程:運(yùn)動控制系統(tǒng)實(shí)踐題目:基于STM32-PID閉環(huán)控制調(diào)速系統(tǒng)專業(yè)班級:機(jī)器人201姓名:指導(dǎo)教師:完成周數(shù):目錄TOC\o"1-3"\h\z\u10240第1章緒論 一.緒論傳統(tǒng)的控制系統(tǒng)采用模擬元件,雖在一定程度上滿足生產(chǎn)要求,但是因?yàn)樵菀桌匣谑褂弥幸资芡饨绺蓴_影響,并且線路復(fù)雜、通用性差,控制效果受器件性能、溫度等因素的影響,故系統(tǒng)的運(yùn)行可靠性及標(biāo)準(zhǔn)性得不到保證,甚至出現(xiàn)事故。而如今首先實(shí)現(xiàn)了整流器的更新?lián)Q代,以晶閘管整流裝置取代了習(xí)用已久的直流發(fā)電機(jī)電動機(jī)組及水銀整流裝置使直流電氣傳動完成了一次大的躍進(jìn)。大功率直流調(diào)速系統(tǒng)通常采用三相全控橋式整流電路對電動機(jī)進(jìn)行供電,從而控制電動機(jī)的轉(zhuǎn)速。同時(shí),控制電路已經(jīng)實(shí)現(xiàn)高集成化、小型化、高可靠性及低成本。以上技術(shù)的應(yīng)用,使直流調(diào)速系統(tǒng)的性能指標(biāo)大幅提高,應(yīng)用范圍不斷擴(kuò)大。直流調(diào)速技術(shù)不斷發(fā)展,走向成熟化、完善化、系列化、標(biāo)準(zhǔn)化,在可逆脈寬調(diào)速、高精度的電氣傳動領(lǐng)域中仍然難以替代。直流調(diào)速是指人為地或自動地改變直流電動機(jī)的轉(zhuǎn)速,以滿足工作機(jī)械的要求。從機(jī)械特性上看,就是通過改變電動機(jī)的參數(shù)或外加電壓等方法來改變電動機(jī)的機(jī)械特性,從而改變電動機(jī)機(jī)械特性和工作特性機(jī)械特性的交點(diǎn),使電動機(jī)的穩(wěn)定運(yùn)轉(zhuǎn)速度發(fā)生變化。直流電動機(jī)具有良好的起動、制動性能,宜于在大范圍內(nèi)平滑調(diào)速,在軋鋼機(jī)、礦井卷揚(yáng)機(jī)、挖掘機(jī)、高層電梯等需要高性能可控電力拖動領(lǐng)域應(yīng)用歷史悠久。二.課程設(shè)計(jì)方案2.1概述本綜合實(shí)踐是本專業(yè)必修實(shí)踐課程通過本綜合實(shí)踐,增強(qiáng)對機(jī)電傳動部件的感性認(rèn)識,培養(yǎng)學(xué)生綜合分析問題的能力和實(shí)際動手能力。通過本課程的學(xué)習(xí),對機(jī)械電子工程專業(yè)10.2,能通過口頭及書面方式就復(fù)雜工程問題與同行進(jìn)行有效溝通,陳述自己的想法。通過本綜合實(shí)踐,從理論學(xué)習(xí)和實(shí)踐的角度了解機(jī)電傳動系統(tǒng),增強(qiáng)對機(jī)電傳動部件的感性認(rèn)識,熟悉機(jī)電傳動系統(tǒng)各部件的結(jié)構(gòu)、工作原理和傳動系統(tǒng)的基本分析方法。掌握機(jī)電傳動系統(tǒng)常見故障分析和排除方法,掌握一般機(jī)電傳動系統(tǒng)的初步設(shè)計(jì)和性能分析能力2.2系統(tǒng)組成總體結(jié)構(gòu)本系統(tǒng)主要由STM32單片機(jī)控制器、電機(jī)驅(qū)動模塊、變壓模塊、LED顯示模塊、霍爾編碼器、按鍵輸入模塊和直流電動機(jī)構(gòu)成。系統(tǒng)由按鍵輸入給定轉(zhuǎn)速,給定值與接口電路接收的轉(zhuǎn)速反饋信號及電流反饋信號形成偏差,由單片機(jī)控制器分別進(jìn)行轉(zhuǎn)速和電流的PID調(diào)節(jié),輸出控制信號經(jīng)數(shù)模轉(zhuǎn)換作為觸發(fā)整流電路的控制電壓,調(diào)節(jié)整流輸出電壓以調(diào)節(jié)直流電動機(jī)的轉(zhuǎn)速,使轉(zhuǎn)速盡快達(dá)到給定值并實(shí)現(xiàn)無靜差,并實(shí)時(shí)顯示電機(jī)轉(zhuǎn)速。系統(tǒng)結(jié)構(gòu)圖如下圖2.3所示。圖2.3系統(tǒng)結(jié)構(gòu)框圖三.硬件設(shè)計(jì)3.1STM32單片機(jī)控制器閉環(huán)直流調(diào)速系統(tǒng)的控制功能簡單,選擇單片機(jī)STM32作為主控制器,STM32是一款由意法半導(dǎo)體公司生產(chǎn)的32位微控制器,基于ARM

Cortex-M內(nèi)核開發(fā)。STM32單片機(jī)旁邊的一排金屬針腳就是引腳,分為電源、時(shí)鐘、控制和其他功能。其中,ST表示意法半導(dǎo)體公司,M表示微控制器,32表示32位。單片機(jī)的使用領(lǐng)域廣泛,從家用電器和通訊設(shè)備到智能儀表以及導(dǎo)航系統(tǒng)都有應(yīng)用。STM32單片機(jī)的型號命名規(guī)則為2FFF3103R,其中2FFF代表芯片子系列,3103代表增強(qiáng)型系列,R代表引腳數(shù),B代表內(nèi)嵌Flash容量。STM32單片機(jī)如下圖3.1.1所示,STM32單片機(jī)樣圖如下圖3.1.2所示。圖3.1.1STM32單片機(jī)系統(tǒng)電路圖3.1.2STM32單片機(jī)樣圖3.2電機(jī)驅(qū)動

電機(jī)控制模塊的功效是操縱電動式車子的起動運(yùn)作、勝敗速率、上坡力度等行車情況,或是將協(xié)助電動車子剎車踏板,并將一部分剎車踏板動能儲存到動力鋰電池中。

1、電機(jī)控制模塊具有制動感恩回饋?zhàn)饔?,?dāng)全車剎車踏板制動時(shí),電機(jī)控制模塊根據(jù)制動感恩回饋將電磁能存有動力鋰電池中,提升里程數(shù)。

2、放流坡作用是以便防止有半坡起步時(shí),當(dāng)制動腳踏板向油門轉(zhuǎn)換的全過程中車子后溜,當(dāng)發(fā)覺車子后溜時(shí),電機(jī)控制模塊進(jìn)到防溜坡轉(zhuǎn)態(tài),控制板全自動調(diào)節(jié)轉(zhuǎn)距輸出在線客服車子因作用力造成的后溜。

電機(jī)控制模塊還具有巡航定速作用,不在踩油門的狀況下,電機(jī)控制模塊可輸出扭矩全自動依照VCU設(shè)置時(shí)速,維持車子以固定不動的速率行車,以節(jié)約司機(jī)精力,提升安全駕駛感受。

電機(jī)控制模塊操作溫度范疇:-40~85℃,在其中65℃之上便會開展限定輸出功率輸出。環(huán)境濕度規(guī)定,承繼控制板在空氣濕度不超過95%的狀況下會一切正常工作中,應(yīng)在其外表溫度小于漏點(diǎn)的狀況下,及電機(jī)控制模塊在表層造成冷疑也可以安全生產(chǎn)工作,在海拔高度三千米下列能夠一切正常工作中,在其中防污防水級別IP67。

電機(jī)特性

小車前進(jìn)的動力是通過直流電機(jī)來驅(qū)動的,直流電機(jī)是最早出現(xiàn)的電動機(jī),也是最早能實(shí)現(xiàn)調(diào)速的電動機(jī)。長期以來,直流電動機(jī)一直占據(jù)著調(diào)速控制的統(tǒng)治地位。它具有良好的線性調(diào)速特性,簡單的控制性能,較高的效率,優(yōu)異的動態(tài)特性。系統(tǒng)選用的大谷基礎(chǔ)車的260馬達(dá)作為驅(qū)動電機(jī)。其額定電壓為3-12V,額定功率0.02KW,額定轉(zhuǎn)速3000r/min

近年來,直流電動機(jī)的結(jié)構(gòu)和控制方式都發(fā)生了很大變化,隨著計(jì)算機(jī)進(jìn)入控制領(lǐng)域,以及新型的電力電子功率元件的不斷出現(xiàn),使采用全控制型的開關(guān)功率元件進(jìn)行脈沖調(diào)制(Pulse

Width

Modulation簡稱PWM)控制方式已經(jīng)成為主流,這種控制方式容易在單片機(jī)控制中實(shí)現(xiàn)。

PWM技術(shù)的具體有以下5點(diǎn):

1.調(diào)速范圍寬,可以使電機(jī)安全地工作在每分鐘幾轉(zhuǎn)到全速運(yùn)轉(zhuǎn);

2.效率高,電源能源損耗??;

3.易于數(shù)字量控制;

4.應(yīng)用廣泛,PWM技術(shù)不僅可以用在電機(jī)調(diào)速,還可以在直流電壓、

5.交流變頻控制等領(lǐng)域有很大應(yīng)用。驅(qū)動模塊電路圖如下圖3.1.1所示,驅(qū)動模塊樣圖如下圖3.1.2所示。圖3.2.1驅(qū)動模塊電路圖圖3.2.2驅(qū)動模塊樣圖TB6612FNG的工作原理:1.電源接入:將電源正極連接到電機(jī)驅(qū)動模塊的VCC引腳,將電源負(fù)極連接到GND引腳。這樣可以提供工作電壓供電。2.電機(jī)連接:將要控制的直流電機(jī)的兩個(gè)端口連接到電機(jī)驅(qū)動模塊的OUT1和OUT2引腳,或者OUT3和OUT4引腳,具體連接方式取決于電機(jī)的運(yùn)行方式和控制需求。3.控制輸入:通過微控制器或其他控制設(shè)備,將控制信號引腳(如AIN1、AIN2、BIN1、BIN2等)連接到電機(jī)驅(qū)動模塊的相應(yīng)引腳。通過改變這些控制信號的狀態(tài),可以控制電機(jī)的轉(zhuǎn)向和速度。4.PWM調(diào)制:使用脈沖寬度調(diào)制(PWM)信號來控制電機(jī)的速度。通過改變PWM信號的占空比,可以改變電機(jī)的平均電壓和速度。5.邏輯控制:TB6612FNG電機(jī)驅(qū)動模塊具有內(nèi)置的邏輯電路,根據(jù)輸入的控制信號和PWM信號狀態(tài),控制相應(yīng)的H橋開關(guān)打開或關(guān)閉,從而控制電機(jī)的電流和轉(zhuǎn)向。6.保護(hù)功能:TB6612FNG電機(jī)驅(qū)動模塊通常具有過流保護(hù)和過熱保護(hù)功能。當(dāng)電機(jī)的電流或溫度超過設(shè)定閾值時(shí),保護(hù)電路會自動停止電機(jī)的運(yùn)行,以防止電機(jī)和驅(qū)動器受到損害。TB6612FNG電機(jī)驅(qū)動模塊通常由驅(qū)動芯片、電源接口、引腳接口和保護(hù)電路等組成。它廣泛應(yīng)用于機(jī)器人、智能車、無人機(jī)以及自動化控制等領(lǐng)域,為直流電機(jī)提供了可靠的驅(qū)動和控制。通過控制信號,可以實(shí)現(xiàn)直流電機(jī)的雙向運(yùn)動、速度調(diào)節(jié)和停止等功能。3.3變壓模塊本設(shè)計(jì)的變壓模塊我們采用的是LM2596SDC-DC降壓模塊如圖3.3.1所示,選擇的輸入電壓范圍是6.5V~36V輸出電壓是穩(wěn)定的5V。LM2596S是一種常見的DC-DC降壓模塊,它是一種集成電路,可將高電壓轉(zhuǎn)換為較低電壓。圖3.3.1變壓模塊電路圖圖3.3.2變壓模塊樣圖3.4LED顯示模塊為使線路簡單,工作可靠,裝置體積小,本設(shè)計(jì)采用KJ004組成的六脈沖集成觸發(fā)電路。觸發(fā)電路根據(jù)給定的控制電壓,輸出相應(yīng)的觸發(fā)脈沖信號,分別控制三相晶閘管整流電路的晶閘管觸發(fā)端,改變導(dǎo)通角以實(shí)現(xiàn)調(diào)節(jié)直流電動機(jī)的供電電壓。a相觸發(fā)電路圖如下圖3.4所示。圖3.4.1LED顯示模塊電路圖圖3.4.2LED顯示模塊樣圖3.5按鍵控制模塊我們采用了開關(guān)式按鍵輸入方式如圖2-6所示,通過按鍵輸入信號給STM32控制器控制轉(zhuǎn)速的加減。開關(guān)式輸入:按鍵在按下和釋放時(shí)會產(chǎn)生一個(gè)二進(jìn)制狀態(tài)變化。按下時(shí),電路閉合,輸入為高電平或1;釋放時(shí),電路斷開,輸入為低電平或0。按鍵變量輸入可以通過設(shè)備或系統(tǒng)進(jìn)行解碼和處理,從而執(zhí)行特定的操作或修改變量值。圖3.5.1按鍵控制模塊電路圖圖3.5.2按鍵控制模塊樣圖按鍵連接電阻和電容的主要原因有以下幾點(diǎn):1.限制電流:電阻可以限制電流的流動。通過連接電阻,當(dāng)按鍵按下時(shí),電流可以受到限制,防止電路中電流過大而導(dǎo)致?lián)p壞。2.平滑電流:電容器可以平滑電流的波動。由于電容器具有儲存電荷的能力,可以通過連接電容器來平滑電流的變化,以穩(wěn)定電路的運(yùn)行。3.延遲響應(yīng):電容器可以延遲電路的響應(yīng)時(shí)間。電容器通過存儲和釋放電荷,可以在啟動或關(guān)閉電路時(shí)提供額外的時(shí)間來激活或解除電路的響應(yīng)。4.調(diào)整頻率:電容和電阻的組合可以調(diào)整電路的頻率響應(yīng)。通過選擇適當(dāng)?shù)碾娙莺碗娮柚?,可以調(diào)整電路對特定頻率的響應(yīng),實(shí)現(xiàn)濾波、增益等功能。需要注意的是:按鍵變量輸入通常受到輸入響應(yīng)速度、按鍵反饋和穩(wěn)定性等因素的影響。因此,在設(shè)計(jì)和使用按鍵輸入時(shí),需要考慮這些因素以確保準(zhǔn)確和可靠的數(shù)據(jù)輸入。3.6霍爾編碼器和直流電機(jī)我們采用了霍爾編碼器是和直流電機(jī)固定在一起,霍爾編碼器(Hallencoder)是一種用于檢測軸或物體位置和角度的裝置。它由霍爾傳感器和磁極組成?;魻杺鞲衅魍ǔ0惭b在旋轉(zhuǎn)軸上,而磁極則固定在旋轉(zhuǎn)或移動的物體上。通過測量霍爾電壓的變化,霍爾編碼器可以實(shí)時(shí)準(zhǔn)確地獲取物體的位置和角度信息。采用JGB37-520(DC12V1100RPM)直流減速電機(jī)如圖2-5所示,這種電機(jī)通常用于一些需要高扭矩和低速運(yùn)轉(zhuǎn)的應(yīng)用。圖3.6.1霍爾編碼器電路圖圖3.6.2霍爾編碼器和直流電機(jī)樣圖霍爾編碼器相比其他位置或角度檢測裝置具有以下優(yōu)點(diǎn):1.高精度:霍爾編碼器可以提供非常高的位置和角度測量精度,通??梢赃_(dá)到亞毫米或亞度的級別,適用于對位置和角度要求較高的應(yīng)用。2.高速度:由于霍爾傳感器能夠快速檢測和轉(zhuǎn)換磁場變化為電信號,霍爾編碼器能夠快速響應(yīng)并提供高速度的位置和角度測量,適用于高速旋轉(zhuǎn)或移動的應(yīng)用。3.高可靠性:霍爾編碼器不受灰塵、油污等外界環(huán)境因素的影響,能夠在較惡劣的工作環(huán)境下穩(wěn)定工作。4.不受機(jī)械磨損影響:相比于接觸式編碼器,霍爾編碼器是非接觸式的,傳感器與磁極之間沒有直接的物理接觸,因此不會出現(xiàn)因機(jī)械磨損導(dǎo)致測量精度下降的情況。5.簡單的安裝和調(diào)整:霍爾編碼器的安裝相對簡單,只需將傳感器固定在軸上,磁極固定在物體上即可。同時(shí),調(diào)整也相對容易,只需調(diào)整傳感器與磁極之間的距離和位置。3.7電源模塊電源模塊是電子設(shè)備中重要的組成部分,它的作用是將輸入的電能轉(zhuǎn)換為設(shè)備所需的穩(wěn)定、可靠的電源輸出。電源模塊通常由電源輸入端、變換器、穩(wěn)壓器、濾波器和輸出端組成。

電源模塊的作用可以總結(jié)為以下幾點(diǎn):

1.輸入電源適配:電源模塊可以適配不同的輸入電源,可以接受來自市電、電池、太陽能等多種電源輸入。它可以將輸入電源的電壓、頻率和波形進(jìn)行調(diào)整和適配,以滿足設(shè)備對電源輸入的要求。

2.電源轉(zhuǎn)換:電源模塊通過變換器將輸入電源的電壓轉(zhuǎn)換為設(shè)備所需的電壓。變換器一般采用開關(guān)電源技術(shù),可以實(shí)現(xiàn)高效率的轉(zhuǎn)換和穩(wěn)定的輸出。

3.電源穩(wěn)壓:電源模塊通過穩(wěn)壓器對輸出電壓進(jìn)行穩(wěn)定控制,以確保設(shè)備獲得穩(wěn)定的電源供應(yīng)。穩(wěn)壓器可以通過負(fù)載調(diào)整、反饋控制、電壓調(diào)整等方式實(shí)現(xiàn)電源的穩(wěn)定輸出。

4.電源過濾:電源模塊內(nèi)部還配備了濾波器,用于濾除輸入電源中的噪聲和干擾,以提供干凈、穩(wěn)定的電源供應(yīng)。

5.保護(hù)功能:電源模塊通常還具備一些保護(hù)功能,如過載保護(hù)、過壓保護(hù)、短路保護(hù)等,以保護(hù)設(shè)備免受電源異常或故障的損害。

總體來說,電源模塊的作用是將輸入電源轉(zhuǎn)換為穩(wěn)定、可靠的電源輸出,以保證設(shè)備正常運(yùn)行。它對設(shè)備的性能、可靠性和功耗等方面起著重要的影響。四.程序設(shè)計(jì)#include"sysinc.h"#include"motor.h"#include"encoder.h"voidkey_deal(void);voidkey_init(void);intPWM_MAX=9000;/**這段代碼是一個(gè)簡單的示例,它包含了幾個(gè)函數(shù)和一個(gè)變量的聲明。

1."#include"是一個(gè)預(yù)處理指令,用于包含頭文件。sysinc.h是一個(gè)自定義的頭文件,可能包含了一些系統(tǒng)需要的宏定義、數(shù)據(jù)類型定義或者其他需要在這個(gè)代碼中使用的聲明。motor.h和encoder.h可能是其他模塊或者外部設(shè)備的頭文件,用于對電機(jī)和編碼器進(jìn)行操作和控制。

2.key_deal()是一個(gè)函數(shù)的聲明,并且沒有返回值(void)。這個(gè)函數(shù)可能用于處理按鍵的操作,但是在這段代碼中沒有具體的實(shí)現(xiàn)。

3.key_init()也是一個(gè)函數(shù)的聲明,同樣沒有返回值(void)。這個(gè)函數(shù)可能用于初始化按鍵的相關(guān)設(shè)置和配置。

4.PWM_MAX是一個(gè)整型變量的聲明,初始化為9000。根據(jù)變量名和數(shù)值的命名規(guī)則,它可能代表了一個(gè)最大PWM脈寬值,用于控制電機(jī)的速度或者位置。

總體來說,這段代碼可能是一個(gè)控制電機(jī)和編碼器的簡單程序。其中包含了一些需要用到的頭文件,以及處理按鍵操作的函數(shù)和初始化按鍵的函數(shù)。同時(shí),定義了一個(gè)整型變量用于控制電機(jī)的PWM輸出值。但是由于代碼的片段較短,沒有完整的實(shí)現(xiàn)和上下文,只能就給出的代碼進(jìn)行大致的解釋。floatSKp=5,SKi=10; intIncremental_PI(intEncoder,intTarget){ staticintBias,Pwm,Last_bias; Bias=Encoder-Target;//計(jì)算偏差 Pwm+=SKp*(Bias-Last_bias)+SKi*Bias;//增量式PI控制器 Last_bias=Bias; //保存上一次偏差 returnPwm;//增量輸出}intSPWM=0;inttarget_v=20;intencoder_v=0;voidtimer3(){ if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET){//檢查TIM3更新中斷發(fā)生與否 encoder_v=get_encoder_val(); SPWM=Incremental_PI(encoder_v,target_v); if(SPWM>PWM_MAX)SPWM=PWM_MAX; elseif(SPWM<-PWM_MAX)SPWM=-PWM_MAX; set_motor_pwm(SPWM); printf("qh-0-%d,%d-ed\n",encoder_v,target_v); //key_deal(); TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx更新中斷標(biāo)志 }}這段代碼是一個(gè)基于增量式PI控制器的控制算法,用于控制電機(jī)的轉(zhuǎn)速或位置。下面我對代碼進(jìn)行解釋:

1.`SKp`和`SKi`是浮點(diǎn)型變量,用于設(shè)置PI控制器中的比例增益和積分增益。

2.`Incremental_PI`函數(shù)是一個(gè)整型函數(shù)。它的參數(shù)包括`Encoder`(編碼器的讀數(shù))和`Target`(目標(biāo)值)。在函數(shù)內(nèi)部,偏差`Bias`被計(jì)算為`Encoder-Target`。然后,根據(jù)增量式PI控制器的算法,計(jì)算出

`Pwm`

的值,公式為`Pwm

+=

SKp*(Bias-Last_bias)+

SKi*Bias`,其中

`Last_bias`

是上一次的偏差。最后,將增量輸出

`Pwm`

返回。

3.`SPWM`、`target_v`、`encoder_v`

是三個(gè)整型變量。`SPWM`

用于保存通過PI控制器計(jì)算得到的PWM輸出值,`target_v`

是設(shè)定的目標(biāo)速度或位置,`encoder_v`

是當(dāng)前的編碼器讀數(shù)。

4.`timer3`

函數(shù)是一個(gè)中斷處理函數(shù),它用于處理定時(shí)器TIM3的更新中斷。在函數(shù)內(nèi)部,首先檢測TIM3的更新中斷是否發(fā)生,如果發(fā)生,則執(zhí)行以下操作:

使用`get_encoder_val()`函數(shù)獲取當(dāng)前編碼器的讀數(shù),并將其保存在`encoder_v`中。調(diào)用`Incremental_PI`函數(shù),計(jì)算得到的增量輸出值,并將其保存在`SPWM`中。通過條件判斷,限制SPWM在一定的范圍內(nèi),防止輸出過大或過小。使用`set_motor_pwm(SPWM)`函數(shù)設(shè)置電機(jī)的PWM輸出值。使用`printf`函數(shù)輸出當(dāng)前的編碼器值和目標(biāo)值。最后,清除TIM的更新中斷標(biāo)志。

總體來說,這段代碼實(shí)現(xiàn)了一個(gè)基于增量式PI控制器的電機(jī)控制算法。它通過對編碼器讀數(shù)和目標(biāo)值之間的差異進(jìn)行運(yùn)算,得到一個(gè)PWM輸出值,用于控制電機(jī)的轉(zhuǎn)速或位置。在

`timer3`

函數(shù)中,該算法被調(diào)用,并與定時(shí)器中斷結(jié)合使用,以實(shí)現(xiàn)實(shí)時(shí)控制和反饋。 motor_init(); encoder_init(); key_init(); IIC_Init(); OLED_Init(); OLED_CLS(); OLED_P8x16Str(0,0,"TAR:");OLED_P8x16Num(48,0,target_v,0); OLED_P8x16Str(0,2,"CUR:");OLED_P8x16Num(48,2,encoder_v,0); OLED_P8x16Str(0,4,"P:");OLED_P8x16Num(48,4,SKp,2); OLED_P8x16Str(0,6,"I:");OLED_P8x16Num(48,6,SKi,2); TIM_ms_Init(TIM3,100,TIM_IT_Update,2,ENABLE); TIMER_CallbackInstall(HW_TIMER3,timer3);while(1){ PCout(13)=!PCout(13); OLED_P8x16Str(0,0,"TAR:");OLED_P8x16Num(48,0,target_v,0); OLED_P8x16Str(0,2,"CUR:");OLED_P8x16Num(48,2,encoder_v,0); OLED_P8x16Str(0,4,"P:");OLED_P8x16Num(48,4,SKp,2); OLED_P8x16Str(0,6,"I:");OLED_P8x16Num(48,6,SKi,2); }這段代碼是用于初始化和控制OLED顯示屏以及定時(shí)器的部分,下面我來解釋一下其中的細(xì)節(jié):

1.`motor_init()`是一個(gè)函數(shù)用于初始化電機(jī)的相關(guān)設(shè)置和配置。它可能包括GPIO的初始化、PWM的初始化等。

2.`encoder_init()`是一個(gè)函數(shù)用于初始化編碼器的相關(guān)設(shè)置和配置。它可能包括GPIO的初始化、外部中斷的配置等。

3.`key_init()`是一個(gè)函數(shù)用于初始化按鍵的相關(guān)設(shè)置和配置。它可能包括GPIO的初始化、外部中斷的配置等。

4.`IIC_Init()`是一個(gè)函數(shù)用于初始化I2C總線的相關(guān)設(shè)置和配置。

5.`OLED_Init()`是一個(gè)函數(shù)用于初始化OLED顯示屏的相關(guān)設(shè)置和配置。

6.`OLED_CLS()`是一個(gè)函數(shù)用于清空OLED屏幕的顯示內(nèi)容。

7.`OLED_P8x16Str()`和`OLED_P8x16Num()`是用于在OLED屏幕上顯示字符串和數(shù)字的函數(shù)。

8.`TIM_ms_Init()`是一個(gè)函數(shù)用于初始化定時(shí)器的相關(guān)設(shè)置和配置。它可以設(shè)置定時(shí)器的時(shí)鐘源、計(jì)數(shù)周期等。這里是使用定時(shí)器TIM3,設(shè)置為每100ms觸發(fā)一次。

9.`TIMER_CallbackInstall()`是一個(gè)函數(shù)用于安裝定時(shí)器中斷的回調(diào)函數(shù)。這里將

`timer3`

函數(shù)作為定時(shí)器中斷的回調(diào)函數(shù)。

10.`while(1)`是一個(gè)無限循環(huán)。在循環(huán)中,`PCout(13)=

!PCout(13);`

可能是用于控制GPIO口的輸出,進(jìn)行閃爍的效果。

11.在每次循環(huán)中,通過`OLED_P8x16Str()`和

`OLED_P8x16Num()`

函數(shù),更新OLED屏幕上顯示的內(nèi)容,包括目標(biāo)值、編碼器值、SKp和SKi的值。

總體來說,這段代碼主要用于初始化各個(gè)模塊的配置,然后進(jìn)入一個(gè)無限循環(huán),在循環(huán)中更新OLED屏幕的顯示內(nèi)容。定時(shí)器被配置為每100ms觸發(fā)一次中斷,通過回調(diào)函數(shù)

`timer3`

進(jìn)行相應(yīng)的操作和處理。同時(shí),通過對GPIO的控制,實(shí)現(xiàn)了一個(gè)LED的閃爍效果。五.實(shí)物展示5.1樣品正面5.2樣品反面六.課程設(shè)計(jì)總結(jié)在完成基于STM32的PID閉環(huán)控制調(diào)速系統(tǒng)的課程設(shè)計(jì)過程中,我收獲了很多經(jīng)驗(yàn)和知識。首先,學(xué)習(xí)了STM32單片機(jī)的基本使用和編程方法,了解了單片機(jī)的工作原理和相關(guān)的控制原理。其次,通過實(shí)際操作和調(diào)試,深刻理解了PID控制算法的原理和實(shí)現(xiàn)方法。最后,通過與電機(jī)的結(jié)合,實(shí)現(xiàn)了一個(gè)具有調(diào)速功能的閉環(huán)控制系統(tǒng)。

在實(shí)施課程設(shè)計(jì)的過程中,首先進(jìn)行了軟硬件的設(shè)計(jì)和搭建。我學(xué)會了如何使用Keil和STM32CubeMX軟件進(jìn)行代碼編寫和配置。通過對STM32F103C8T6單片機(jī)的了解和學(xué)習(xí),我完成了相關(guān)的硬件設(shè)計(jì),包括電機(jī)驅(qū)動電路的搭建和與STM32單片機(jī)的連接。

接下來,我根據(jù)PID控制算法的原理和公式,對代碼進(jìn)行編寫和調(diào)試。我先理解了P、I、D三個(gè)參數(shù)的含義和作用,然后根據(jù)具體的要求和系統(tǒng)特點(diǎn),調(diào)整了參數(shù)的大小。通過不斷的調(diào)試和優(yōu)化,最終實(shí)現(xiàn)了一個(gè)穩(wěn)定、快速的閉環(huán)控制系統(tǒng)。

在整個(gè)實(shí)施過程中,我也遇到了一些問題和挑戰(zhàn)。例如,初始時(shí)電機(jī)的轉(zhuǎn)速波動較大,導(dǎo)致PID算法調(diào)節(jié)出現(xiàn)問題。通過分析和調(diào)試,我發(fā)現(xiàn)是傳感器信號不穩(wěn)定,導(dǎo)致反饋信號有誤差。我重新檢查了電路連接,并增加了一些濾波電路,最終解決了問題。

通過這次課程設(shè)計(jì),我不僅加深了對單片機(jī)和控制算法的理解,還培養(yǎng)了自己的動手實(shí)踐能力和解決問題的能力。我學(xué)會了如何將理論知識應(yīng)用到實(shí)際中,并通過不斷調(diào)試和優(yōu)化,最終實(shí)現(xiàn)了一個(gè)滿意的控制系統(tǒng)。

總的來說,基于STM32的PID閉環(huán)控制調(diào)速系統(tǒng)的課程設(shè)計(jì)讓我收獲了很多。通過實(shí)踐操作和調(diào)試,我不僅學(xué)到了專業(yè)知識,還提高了實(shí)際操作和解決問題的能力。這對我今后的學(xué)習(xí)和工作都具有重要意義。我相信這次經(jīng)歷將成為我未來發(fā)展的基石,幫助我更好地應(yīng)對實(shí)際工程中的挑戰(zhàn)和問題。附錄#include"sysinc.h"#include"motor.h"#include"encoder.h"voidkey_deal(void);voidkey_init(void);intPWM_MAX=9000;/***@function增量PI控制器*@param[in]Encoder編碼器測量值,目標(biāo)速度*@param[in]Target目標(biāo)速度*@retvalpwm計(jì)算出的PWM值,代表增量輸出*@node增量式離散PID公式pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]*@nodee(k)代表本次偏差*@nodee(k-1)代表上一次的偏差*@nodee(k-2)代表上上次的偏差*@node速度控制閉環(huán)系統(tǒng)里面,只使用PI控制pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)*/floatSKp=5,SKi=10; intIncremental_PI(intEncoder,intTarget){ staticintBias,Pwm,Last_bias; Bias=Encoder-Target;//計(jì)算偏差 Pwm+=SKp*(Bias-Last_bias)+SKi*Bias;//增量式PI控制器 Last_bias=Bias; //保存上一次偏差 returnPwm;//增量輸出}intSPWM=0;inttarget_v=20;intencoder_v=0;voidtimer3(){ if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET){//檢查TIM3更新中斷發(fā)生與否 encoder_v=get_encoder_val(); SPWM=Incremental_PI(encoder_v,target_v); if(SPWM>PWM_MAX)SPWM=PWM_MAX; elseif(SPWM<-PWM_MAX)SPWM=-PWM_MAX; set_motor_pwm(SPWM); printf("qh-0-%d,%d-ed\n",encoder_v,target_v); //key_deal(); TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx更新中斷標(biāo)志 }}u8flag_rev=0;//串口中斷接收標(biāo)志位u8flag_rev_num=0;//串口數(shù)據(jù)索引u8rxbuf[55]={1,9,3,4};//串口中斷接收數(shù)據(jù)BUFF//串口中斷函數(shù)voiduart1(uint16_tRes);intmain(void){ NVIC_init(); SYSTICK_DelayInit(); //延時(shí)函數(shù)初始化 GPIO_QuickInit(HW_GPIOC,GPIO_Pin_13,GPIO_Mode_Out_PP);//初始化與LED連接的硬件接口 UART_QuickInit(HW_UART1,115200,2,2,ENABLE); UART_CallbackInstall(HW_UART1,uart1);//串口中斷函數(shù)注冊 motor_init(); encoder_init(); key_init(); IIC_Init(); OLED_Init(); OLED_CLS(); OLED_P8x16Str(0,0,"TAR:");OLED_P8x16Num(48,0,target_v,0); OLED_P8x16Str(0,2,"CUR:");OLED_P8x16Num(48,2,encoder_v,0); OLED_P8x16Str(0,4,"P:");OLED_P8x16Num(48,4,SKp,2); OLED_P8x16Str(0,6,"I:");OLED_P8x16Num(48,6,SKi,2); TIM_ms_Init(TIM3,100,TIM_IT_Update,2,ENABLE); TIMER_CallbackInstall(HW_TIMER3,timer3); while(1){ PCout(13)=!PCout(13); OLED_P8x16Str(0,0,"TAR:");OLED_P8x16Num(48,0,target_v,0); OLED_P8x16Str(0,2,"CUR:");OLED_P8x16Num(48,2,encoder_v,0); OLED_P8x16Str(0,4,"P:");OLED_P8x16Num(48,4,SKp,2); OLED_P8x16Str(0,6,"I:");OLED_P8x16Num(48,6,SKi,2); }}//字符串轉(zhuǎn)數(shù)字函數(shù)floatgetNum(u8rb[]){ floatdata=0; inti; for(i=0;i<8;i++){ if(i==0&&rb[i]=='-')continue; if(rb[i]!='.'&&rb[i]!=121&&rb[i]!=','){ data=(data)*10+rb[i]-48; }else{ break; } } if(rb[i]=='.'){data=(data*10+rb[i+1]-48)/10;} if(rb[0]=='-'){data=-1*data;} returndata;}//字符串中得到PID函數(shù)voidgetPID(){ u8i=0;flag_rev_num=5; u8buf[15]; for(i=0;i<15&&rxbuf[4]=='-';i++){ buf[i]=121;buf[i+1]=121;buf[i+2]=121; buf[i]=rxbuf[flag_rev_num];flag_rev_num++; //printf("%c",buf[i]); if(rxbuf[flag_rev_num]==','){break;} } SKp=getNum(buf); if(rxbuf[flag_rev_num++]==','){ for(i=0;i<15;i++){ buf[i]=121; buf[i+1]=121;buf[i+2]=121; buf[i]=rxbuf[flag_rev_num];flag_rev_num++; printf("%c",buf[i]); if(rxbuf[flag_rev_num]==','){break;} } } SKi=getNum(buf); if(rxbuf[flag_rev_num++]==','){ for(i=0;i<15;i++){ buf[i]=121; buf[i+1]=121;buf[i+2]=121; buf[i]=rxbuf[flag_rev_num];flag_rev_num++; printf("%c",buf[i]); if(rxbuf[flag_rev_num]==','){break;} } } floatSKd=getNum(buf); if(rxbuf[flag_rev_num++]==','){ for(i=0;i<15;i++){ buf[i]=121; buf[i+1]=121;buf[i+2]=121; buf[i]=rxbuf[flag_rev_num];flag_rev_num++; printf("%c",buf[i]); if(rxbuf[flag_rev_num]==','){break;} } } target_v=getNum(buf); if(rxbuf[flag_rev_num++]==','){ for(i=0;i<15;i++){ buf[i]=121;buf[i+1]=121;buf[i+2]=121; buf[i]=rxbuf[flag_rev_num];flag_rev_num++; //printf("%c",buf[i]); if(rxbuf[flag_rev_num]=='-'){break;} } } PWM_MAX=getNum(buf); printf("qh-1-%.1f,%.1f,%.1f,%d,%d-ed",SKp,SKi,SKd,target_v,PWM_MAX); OLED_P8x16Str(0,0,"TAR:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論