倒立摆系统说明
控制對(duì)象:旋轉(zhuǎn)倒立擺 控制器:XS128
關(guān)于控制對(duì)象的基本說明
控制目標(biāo)
- 擺桿從初始時(shí)刻能夠自己起振到最高位置,并在最高位置保持不動(dòng)或者在很小范圍內(nèi)運(yùn)動(dòng)
- 擺桿受到外部干擾(硬幣或手等的敲打使其偏離豎直向上的位置)時(shí)可以自動(dòng)恢復(fù)到目標(biāo)位置
控制對(duì)象基本參數(shù)以及控制方式的選取
- 電機(jī)PWM控制頻率
- 10KHz
- 理由
- 頻率特別小時(shí),電機(jī)雖然死區(qū)比較小,但是電機(jī)特性比較硬,很小的占空比即可以產(chǎn)生較大的速度,而且速度調(diào)節(jié)精度很難控制(給調(diào)節(jié)參數(shù)帶來困難)。
- 頻率小時(shí),電機(jī)有可能工作在電流斷續(xù)狀態(tài),對(duì)點(diǎn)擊有害,而且電機(jī)產(chǎn)生的噪聲比較大
- 控制周期
- 0.5ms
- 將控制系統(tǒng)分為2事件,事件1進(jìn)行速度控制(外環(huán)),事件2進(jìn)行角度控制(內(nèi)環(huán)),外環(huán)控制周期為100ms,內(nèi)環(huán)控制周期為1ms;事件2中進(jìn)行電機(jī)PWM的輸出。故相當(dāng)于每1ms輸出1次PWM波
- 理由
- 控制周期太小,系統(tǒng)震蕩;控制周期太大,系統(tǒng)反應(yīng)不及時(shí)
- 此處的控制周期是參考學(xué)長(zhǎng)的控制周期
- 0.5ms
- 2級(jí)PID的選取
- 角度環(huán)
- 位置式PID
- 速度環(huán)
- 增量式PID
- 速度環(huán)的輸出作為角度環(huán)的輸入,而在此時(shí)角度環(huán)的初始設(shè)定值為250,因此如果用位置式的PID算法,得到的角度還需要進(jìn)行處理(在靜止不動(dòng)時(shí)輸出為250)才能賦值給角度環(huán)的輸入
- 角度環(huán)
起振
- 在擺桿豎直向下時(shí),當(dāng)擺角小于某一角度值時(shí),輸出固定占空比的PWM波,當(dāng)擺角大于某一值時(shí),電機(jī)
擺動(dòng)過程中判斷擺桿的方向,使得無論擺桿無論在哪個(gè)方向上擺動(dòng),電機(jī)的轉(zhuǎn)動(dòng)方向都會(huì)使它繼續(xù)沿著那個(gè)方向加速擺動(dòng)
- 實(shí)現(xiàn)方法:同時(shí)判斷擺桿角度和運(yùn)動(dòng)方向,再進(jìn)行控制
代碼
if( (PID4Pend.GetVal < LimA) || ( PID4Pend.GetVal >= ( 500 - LimA ) ) ) {OutDuty = 1200;if(PendDir==1) dir=2;else dir=1; } if( (PID4Pend.GetVal < (500 - LimA)) && (PID4Pend.GetVal > 260 )) {OutDuty = 0; } if( (PID4Pend.GetVal > LimA) && (PID4Pend.GetVal < 240 )) {OutDuty = 0; } SetMotorVoltage( OutDuty , dir );
編碼器讀取的方式
- 外部中斷
- 注意事項(xiàng)
- 在初始化時(shí)刻將外部中斷優(yōu)先級(jí)設(shè)置為最高
- 在進(jìn)入串口中斷或者定時(shí)中斷時(shí),均需要再次調(diào)用EnableInterrupts使能中斷
- 因?yàn)閿[桿在擺動(dòng)的時(shí)候會(huì)產(chǎn)生零偏,即編碼器的值會(huì)逐漸偏離原點(diǎn)(振動(dòng)產(chǎn)生,對(duì)應(yīng)此處的250);解決辦法:用Z進(jìn)行復(fù)位,記錄Z相脈沖低電平時(shí)對(duì)應(yīng)的脈沖個(gè)數(shù),每次Z相外部中斷觸發(fā)時(shí),直接改變脈沖計(jì)數(shù)的值。
- 編碼器需要A、B、Z相需要加上拉電阻,可以通過軟件配置上拉電阻即可。
速度環(huán)的輸出方式
斜坡輸出
- 目前采用的是這種方式,將得到的輸出量按照斜坡的方式繼續(xù)擰輸出
階躍輸出
- 還沒有嘗試
調(diào)試過程中遇到的問題
電機(jī)死區(qū)的處理
- 計(jì)算輸出占空比小于死區(qū)占空比時(shí),電機(jī)不轉(zhuǎn)動(dòng)
- 目前采用的是這種方法
- 電機(jī)輸出占空比小于死區(qū)占空比時(shí),電機(jī)按照最小速度運(yùn)動(dòng)
- 將計(jì)算得到的占空比得到輸出占空比按照一次函數(shù)關(guān)系進(jìn)行輸出,如OutDuty = 0.94 * OutDuty + 0.06,其中0.06是電機(jī)死區(qū)對(duì)應(yīng)的占空比
- 計(jì)算輸出占空比小于死區(qū)占空比時(shí),電機(jī)不轉(zhuǎn)動(dòng)
關(guān)于系統(tǒng)動(dòng)態(tài)與穩(wěn)態(tài)的協(xié)調(diào)問題
- 問題說明:采用PI控制時(shí),擺桿由自由下垂能夠自動(dòng)擺到豎直向上的位置,并保持運(yùn)動(dòng)在90度的范圍內(nèi)(一般在45度范圍內(nèi)),說明系統(tǒng)的穩(wěn)態(tài)性能達(dá)到要求,此時(shí)如果用外力使擺桿發(fā)生抖動(dòng),抖動(dòng)較小時(shí),擺桿可以回到穩(wěn)態(tài),但是如果比較大的時(shí)候,就不能回到穩(wěn)態(tài),比如施加干擾使其超過PID的控制角度范圍;采用PD控制時(shí),擺桿可以自起振,同時(shí)受到外界干擾可以比較好地恢復(fù),但是它不能保持在90度的范圍內(nèi),而是沿著某個(gè)方向緩慢旋轉(zhuǎn),即動(dòng)他性能達(dá)到要求,而穩(wěn)態(tài)性能不符合要求。
- 解決辦法:在擺桿處于PID的控制模式時(shí),采用PI控制,滿足系統(tǒng)的穩(wěn)態(tài)指標(biāo),處于啟動(dòng)模式時(shí)(即偏離豎直向上的角度大于某個(gè)值),采用PD控制,滿足系統(tǒng)的動(dòng)態(tài)要求。
一些管腳定義
串口
- PS0 -> RXD0
- PS1 -> TXD0
L298N驅(qū)動(dòng)
- IN1 -> PB1
- IN2 -> PB0
- ENA-> PP1
編碼器
- 擺桿編碼器
- A相(黑線) :PA0(GPIO讀取方向)
- B相(白線) :PH0(外部中斷讀取脈沖)
- Z相(橙線) :PH1(外部中斷清零操作)
- 藍(lán)線:GND
- 棕線:VCC(5V~12V)
- 旋轉(zhuǎn)電機(jī)編碼器
- 1、2 :可以不接
- pin3 :VCC通過100歐姆的電阻(限流)和該管腳連接
- pin4 :PA1(GPIO讀取方向)
- pin5 :PH2(外部中斷讀取脈沖)
- pin6 :GND
關(guān)于編程方法的一些說明
- 在.c文件里定義,在對(duì)應(yīng)的.h文件中用extern聲明
- 如果要引用該變量,可以在.h文件中#include一下,或者用extern int value
總結(jié)
- 上一篇: 安徽大学大学生创新项目报销流程
- 下一篇: adb打开蓝牙开关