




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PAGEPAGE28球桿控制定位系統(tǒng)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)小組成員:周開城u200910555機(jī)械0902班張偉u200910571機(jī)械0902班一實(shí)驗(yàn)?zāi)康模?)掌握對實(shí)際物理模型的建模方法。(2)掌握在Matlab中利用Simulink等工具對系統(tǒng)進(jìn)行模型分析的方法。(3)掌握PID控制算法的原理和實(shí)際應(yīng)用。(4)學(xué)習(xí)PID參數(shù)的調(diào)節(jié)方法。二實(shí)驗(yàn)系統(tǒng)及實(shí)驗(yàn)原理(一)球桿系統(tǒng)的特點(diǎn)球桿系統(tǒng)是一個(gè)典型的非線性系統(tǒng),理論上而言,它是一個(gè)真正意義上的非線性系統(tǒng),其執(zhí)行機(jī)構(gòu)還具有很多非線性特性,包括:?死區(qū)?直流馬達(dá)和帶輪的傳動(dòng)非線性。?位置測量的不連續(xù)性。?導(dǎo)軌表面不是嚴(yán)格的光滑表面,產(chǎn)生非線性阻力。這些非線性因素對于傳統(tǒng)意義上的測量和建模造成很大的影響,并對系統(tǒng)的控制性能造成非常大的影響,怎樣去設(shè)計(jì)一個(gè)魯棒的控制系統(tǒng),是現(xiàn)代控制理論的一個(gè)重要問題。固高科技提供的球桿系統(tǒng)既可以用于研究控制系統(tǒng)運(yùn)行的非線性動(dòng)力學(xué),也可以用于研究控制系統(tǒng)的非線性觀測器等,是一個(gè)較為通用的實(shí)驗(yàn)設(shè)備。因?yàn)橄到y(tǒng)機(jī)械結(jié)構(gòu)的特點(diǎn),球桿系統(tǒng)具有一個(gè)最重要的特性——不穩(wěn)定性,對于傳統(tǒng)的實(shí)驗(yàn)方法,存在一些實(shí)驗(yàn)的難處,不穩(wěn)定的系統(tǒng)容易對實(shí)驗(yàn)人員產(chǎn)生危險(xiǎn)或是不可預(yù)料的傷害,球桿系統(tǒng)相對而言,機(jī)械比較簡單,結(jié)構(gòu)比較緊湊,安全性也比較高,是一個(gè)可以避免這些危險(xiǎn)和傷害的實(shí)驗(yàn)設(shè)備。采用智能伺服驅(qū)動(dòng)模塊和直觀的Windows程序界面,是控制系統(tǒng)實(shí)驗(yàn)的一個(gè)理想的實(shí)驗(yàn)設(shè)備。(二)球桿系統(tǒng)如圖1所示,包括控制計(jì)算機(jī)、IPM100伺服驅(qū)動(dòng)器、球桿本體和光電碼盤、線性傳感器、伺服電機(jī)和球桿裝置等部分,組成一個(gè)閉環(huán)系統(tǒng)。光電碼盤將杠桿臂與水平方向的夾角、角速度通過RS232接口與計(jì)算機(jī)通信。在控制系統(tǒng)中,輸入鋼球的控制位置和控制參數(shù),通過控制決策計(jì)算輸出電機(jī)轉(zhuǎn)動(dòng)方向、轉(zhuǎn)動(dòng)速度、加速度等,并由智能伺服驅(qū)動(dòng)器產(chǎn)生相應(yīng)的控制量,發(fā)出模擬信號使電機(jī)轉(zhuǎn)動(dòng),帶動(dòng)杠桿臂運(yùn)動(dòng)從而控制球的位置。本系統(tǒng)為一個(gè)單輸入(電機(jī)轉(zhuǎn)角θ)、單輸出(鋼球位置x)系統(tǒng)。其中,θ由伺服電機(jī)的角度編碼器測定,輸出量x由軌道上電位器輸出的電壓信號獲得。系統(tǒng)的控制框,如圖1所示。整個(gè)機(jī)構(gòu)運(yùn)行如圖2所示:球桿系統(tǒng)主要由以下幾部分組成,如圖所示。(三)機(jī)械部分:機(jī)械部分包括底座、小球、橫桿、減速皮帶輪、支撐部分、馬達(dá)等。小球可以在橫桿上自由的滾動(dòng),橫桿的一端通過轉(zhuǎn)軸固定,另一端可以上下轉(zhuǎn)動(dòng),通過控制直流伺服電機(jī)的位置,帶動(dòng)皮帶輪轉(zhuǎn)動(dòng),通過傳動(dòng)機(jī)構(gòu)就可以控制橫桿的傾斜角。直流伺服電機(jī)帶有增量式編碼器(1000P/R),可以檢測電機(jī)的實(shí)際位置,在橫桿上的凹槽內(nèi),有一線性的傳感器用于檢測小球的實(shí)際位置,兩個(gè)實(shí)際位置的信號都被傳送給控制系統(tǒng),構(gòu)成一個(gè)閉環(huán)反饋系統(tǒng)。當(dāng)帶輪轉(zhuǎn)動(dòng)角度θ,橫桿的轉(zhuǎn)動(dòng)角度為α,當(dāng)橫桿偏離水平的平衡位置后,在重力作用下,小球開始沿橫桿滾動(dòng)。(四)電氣部分球滾動(dòng)時(shí)位移的測量:直線位移傳感器。線性軌道傳感器接+5V電壓。軌道兩邊測得的電壓作為IPM100控制卡A/D輸入口的信號。當(dāng)小球在軌道上滾動(dòng)時(shí),通過不銹鋼桿上輸出的電壓信號的測量可得到小球在軌道上的位置。伺服輸出角度的測量:采用IPM100控制器,電機(jī)驅(qū)動(dòng)齒輪轉(zhuǎn)動(dòng)時(shí)通過電機(jī)實(shí)際位置轉(zhuǎn)換得到角度θ。(五)智能伺服驅(qū)動(dòng)電機(jī)的運(yùn)動(dòng)通過IPM100智能伺服驅(qū)動(dòng)器進(jìn)行控制,IPM100是一個(gè)智能的高精度、全數(shù)字的控制器,內(nèi)嵌100W的驅(qū)動(dòng)電路,適合于有刷和無刷電機(jī)?;诜答伩刂圃?,在得到傳感器信號后,對信號進(jìn)行處理,然后給電機(jī)繞組施加適當(dāng)?shù)腜WM電壓信號,這樣,一個(gè)相應(yīng)的扭矩作用于電機(jī)軸,使電機(jī)開始運(yùn)動(dòng),扭矩的大小決定于用戶程序中的控制算法。IPM100是一款智能的控制器,它除了板載的用于放大控制信號的驅(qū)動(dòng)放大器和PWM調(diào)制電路,還有一個(gè)全數(shù)字的DSP處理芯片,內(nèi)存以及其它邏輯元件,有了這些,就可以實(shí)現(xiàn)先進(jìn)的運(yùn)動(dòng)控制技術(shù)和PLC的功能,它產(chǎn)生實(shí)時(shí)的軌跡路徑,實(shí)現(xiàn)閉環(huán)伺服控制,執(zhí)行上位機(jī)的操作命令,完成板載IO信號的處理,所有這些都依照儲(chǔ)存器的程序指令或是主機(jī)的在線命令執(zhí)行,這種嵌入式的智能控制可以提供一個(gè)實(shí)時(shí)性非常好的控制效果,即使因?yàn)镻C的非實(shí)時(shí)操作系統(tǒng)而產(chǎn)生延時(shí)的情況下。因?yàn)榭刂破骺梢元?dú)立運(yùn)行,也可以采用從動(dòng)模式,本手冊介紹的球桿系統(tǒng)將采用兩種模式。IPM100安裝于控制箱內(nèi)部,通過RS232和上位計(jì)算機(jī)進(jìn)行通訊,直流電源也置于控制箱內(nèi)部。(六)球桿系統(tǒng)的數(shù)學(xué)模型建立實(shí)際上使小球在導(dǎo)軌上加速滾動(dòng)的力是小球的重力在同導(dǎo)軌平行方向上的分力同小球受到的摩擦力的合力??紤]小球滾動(dòng)的動(dòng)力學(xué)方程,小球在V型桿上滾動(dòng)的加速度:(1-1)其中m——小球質(zhì)量;J——小球的轉(zhuǎn)動(dòng)慣量;R——小球半徑;r——小球位置偏移;g——重力加速度;α——軌道桿與水平面之間的夾角;θ——電動(dòng)機(jī)轉(zhuǎn)角;又有:由于實(shí)際摩擦力較小,忽略摩擦力,并由于較小,因此可以忽略此項(xiàng)的影響,其基本的數(shù)學(xué)模型轉(zhuǎn)換成如下方式:(1-2)當(dāng)α<<1時(shí),將上式線性化,得到傳遞函數(shù)如下
(1-3)但是,在實(shí)際控制的過程中,桿的仰角α是由電動(dòng)機(jī)的轉(zhuǎn)角輸出來實(shí)現(xiàn)的。影響電動(dòng)機(jī)轉(zhuǎn)角θ和桿仰角α之間關(guān)系的主要因素就是齒輪的減速比和非線性。因此,我們把該模型進(jìn)一步簡化:θ(s)=L/d?α(s)(1-4)把(1-4)式代入(1-3)式,我們可以得到另一個(gè)模型:得到球桿系統(tǒng)從齒輪角度θ(s)和小球位置(R(s))的傳遞函數(shù):(1-5)因此,球桿系統(tǒng)實(shí)際上可以簡化為一個(gè)二階系統(tǒng)。(七)比例環(huán)節(jié)控制原理P控制分析對于具有比例控制作用的控制器,控制器的輸出u(t)與誤差作用信號e(t)之間的關(guān)系為:或者表示成拉普拉斯變換量的形式如下:式中Kp稱為比例增益。無論是哪一種實(shí)際機(jī)構(gòu),也無論是哪一種形式的操作功率,比例控制器實(shí)質(zhì)上是一種增益可調(diào)的放大器??刂葡到y(tǒng)如下圖所示:球桿系統(tǒng)P控制器原理圖可以得到單位負(fù)反饋系統(tǒng)的閉環(huán)傳遞函數(shù)為:可以看出是一個(gè)二階系統(tǒng)(忽略了各種阻力)。(八)比例積分控制器原理PD控制器的控制作用可以由下列方程定義:其傳遞函數(shù)為:式中Kp為比例增益,而Td稱為微分時(shí)間常數(shù),Kp,Td都可以調(diào)節(jié),微分控制作用也稱為速率控制,它是控制器輸出中與作用誤差信號變化率成比例的一部分,微分時(shí)間Td是速率控制作用超前于比例控制作用效果的時(shí)間間隔,微分控制作用具有預(yù)測的優(yōu)點(diǎn),但是它也具有缺點(diǎn),因?yàn)樗糯罅嗽肼曅盘?,并且還可能在執(zhí)行器中造成飽和效應(yīng)。微分控制作用不能單獨(dú)使用,因?yàn)樗鼉H僅在瞬態(tài)過程中才是有效的。控制系統(tǒng)如下圖所示:圖3-1球桿系統(tǒng)PD控制器原理圖可以得到單位負(fù)反饋系統(tǒng)的閉環(huán)傳遞函數(shù)為:(九)PID控制原理比例控制作用、積分控制作用和微分控制作用的組合叫做比例-加-積分-加-微分控制作用,這種組合具有三種控制作用的優(yōu)點(diǎn),具有這種組合作用的控制器方程為:即其傳遞函數(shù)為:式中Kp為比例增益,Ti為積分時(shí)間,Td為微分時(shí)間??刂葡到y(tǒng)如下圖所示:圖4-1球桿系統(tǒng)PID控制器原理圖可以得到單位負(fù)反饋系統(tǒng)的閉環(huán)傳遞函數(shù)為:按照齊格勒-尼赫爾斯法則設(shè)計(jì)PID控制器,因?yàn)楹蟹e分器,所以按照第二法設(shè)計(jì),首先假設(shè)Ki=0,Kd=0,增加Kp直到呈現(xiàn)周期振蕩,取呈現(xiàn)周期振蕩的最小的Kp=Kcr,設(shè)周期振蕩的周期為Pcr,按下表計(jì)算PID參數(shù):控制器類型KpKiKdP0.5Kcr00PI0.45Kcr1.2/Pcr0PID0.6Kcr2/Pcr0.125Pcr(十)PID參數(shù)調(diào)節(jié)方法(1)經(jīng)驗(yàn)法:又叫現(xiàn)場湊試法,即先確定一個(gè)調(diào)節(jié)器的參數(shù)值PB和Ti,通過改變給定值對控制系統(tǒng)施加一個(gè)擾動(dòng),現(xiàn)場觀察判斷控制曲線形狀。若曲線不夠理想,可改變PB或Ti,再畫控制過程曲線,經(jīng)反復(fù)湊試直到控制系統(tǒng)符合動(dòng)態(tài)過程品質(zhì)要求為止,這時(shí)的PB和Ti就是最佳值。如果調(diào)節(jié)器是PID三作用式,那么要在整定好的PB和Ti的基礎(chǔ)上加進(jìn)微分作用。由于微分作用有抵制偏差變化的能力,所以確定一個(gè)Td值后,可把整定好的PB和Ti值減小一點(diǎn)再進(jìn)行現(xiàn)場湊試,直到PB、Ti和Td取得最佳值為止。顯然用經(jīng)驗(yàn)法整定的參數(shù)是準(zhǔn)確的。但花時(shí)間較多。為縮短整定時(shí)間,應(yīng)注意以下幾點(diǎn):①根據(jù)控制對象特性確定好初始的參數(shù)值PB、Ti和Td??蓞⒄赵趯?shí)際運(yùn)行中的同類控制系統(tǒng)的參數(shù)值,或參照表所給的參數(shù)值,使確定的初始參數(shù)盡量接近整定的理想值。這樣可大大減少現(xiàn)場湊試的次數(shù)。②在湊試過程中,若發(fā)現(xiàn)被控量變化緩慢,不能盡快達(dá)到穩(wěn)定值,這是由于PB過大或Ti過長引起的,但兩者是有區(qū)別的:PB過大,曲線漂浮較大,變化不規(guī)則,Ti過長,曲線帶有振蕩分量,接近給定值很緩慢。這樣可根據(jù)曲線形狀來改變PB或Ti。③PB過小,Ti過短,Td太長都會(huì)導(dǎo)致振蕩衰減得慢,甚至不衰減,其區(qū)別是PB過小,振蕩周期較短;Ti過短,振蕩周期較長;Td太長,振蕩周期最短。④如果在整定過程中出現(xiàn)等幅振蕩,并且通過改變調(diào)節(jié)器參數(shù)而不能消除這一現(xiàn)象時(shí),可能是閥門定位器調(diào)校不準(zhǔn),調(diào)節(jié)閥傳動(dòng)部分有間隙(或調(diào)節(jié)閥尺寸過大)或控制對象受到等幅波動(dòng)的干擾等,都會(huì)使被控量出現(xiàn)等幅振蕩。這時(shí)就不能只注意調(diào)節(jié)器參數(shù)的整定,而是要檢查與調(diào)校其它儀表和環(huán)節(jié)。(2)衰減曲線法:是以4:1衰減作為整定要求的,先切除調(diào)節(jié)器的積分和微分作用,用湊試法整定純比例控制作用的比例帶PB(比同時(shí)湊試二個(gè)或三個(gè)參數(shù)要簡單得多),使之符合4:1衰減比例的要求,記下此時(shí)的比例帶PBs和振蕩周期Ts。如果加進(jìn)積分和微分作用,可按表給出經(jīng)驗(yàn)公式進(jìn)行計(jì)算。若按這種方式整定的參數(shù)作適當(dāng)?shù)恼{(diào)整。對有些控制對象,控制過程進(jìn)行較快,難以從記錄曲線上找出衰減比。這時(shí),只要被控量波動(dòng)2次就能達(dá)到穩(wěn)定狀態(tài),可近似認(rèn)為是4:1的衰減過程,其波動(dòng)一次時(shí)間為Ts。(3)臨界比例帶法,用臨界比例帶法整定調(diào)節(jié)器參數(shù)時(shí),先要切除積分和微分作用,讓控制系統(tǒng)以較大的比例帶,在純比例控制作用下運(yùn)行,然后逐漸減小PB,每減小一次都要認(rèn)真觀察過程曲線,直到達(dá)到等幅振蕩時(shí),記下此時(shí)的比例帶PBk(稱為臨界比例帶)和波動(dòng)周期Tk,然后按表3-4-3給出的經(jīng)驗(yàn)公式求出調(diào)節(jié)器的參數(shù)值。按該表算出參數(shù)值后,要把比例帶放在比計(jì)算值稍大一點(diǎn)的值上,把Ti和Td放在計(jì)算值上,進(jìn)行現(xiàn)場觀察,如果比例帶可以減小,再將PB放在計(jì)算值上。這種方法簡單,應(yīng)用比較廣泛。但對PBk很小的控制系統(tǒng)不適用。(4)反應(yīng)曲線法,前三種整定調(diào)節(jié)器參數(shù)的方法,都是在預(yù)先不知道控制對象特性的情況下進(jìn)行的。如果知道控制對象的特性參數(shù),即時(shí)間常數(shù)T、時(shí)間遲延ξ和放大系數(shù)K,則可按經(jīng)驗(yàn)公式計(jì)算出調(diào)節(jié)器的參數(shù)。利用這種方法整定的結(jié)果可達(dá)到衰減率φ=0.75的要求三實(shí)驗(yàn)內(nèi)容及實(shí)驗(yàn)過程(一)實(shí)驗(yàn)步驟(1)認(rèn)真觀察球桿控制定位系統(tǒng),指出系統(tǒng)的各個(gè)部分,打開后蓋,認(rèn)知相關(guān)的電氣控制部分及機(jī)械傳動(dòng)部分,并做好記錄。(2)安裝好后蓋,將電源線,通訊線與電源箱,電腦正常連接。(3)接通電源,打開測試軟件。(4)在matlab下打開QGTEST.MDL進(jìn)入測試界面。(5)點(diǎn)擊運(yùn)行(6)設(shè)置運(yùn)動(dòng)位置POS,觀察球桿運(yùn)動(dòng)情況。(7)切換伺服開關(guān),運(yùn)動(dòng),停止開關(guān),測試硬件響應(yīng)。(8)改變運(yùn)動(dòng)速度,加速度及位置,觀察運(yùn)動(dòng)情況。(9)打開各個(gè)示波器(10)用手輕撥鋼球,讓鋼球在滑道上緩慢滾動(dòng),觀察采集到鋼球的位置數(shù)據(jù)。(11)停止實(shí)時(shí)仿真,觀察各示波器數(shù)據(jù),并保存到相應(yīng)的文件。(二)控制系統(tǒng)的搭建(1)通過改變?nèi)齻€(gè)輸入常量的值,改變曲柄的運(yùn)動(dòng)速度,加速度和最終停留位置Move_Abs的創(chuàng)建A在桌面上新建一個(gè)文件夾,如:“班號組號”。B打開matlab.點(diǎn)擊simulink圖標(biāo)。新建一個(gè)文件。C將User-DefinedFunctions/S-Function拖入新建文件中,改名為Init。D將一個(gè)Source/Constant拖入新建文件中,并打開。E將Com輸出端連接Init輸入端。F將Port&Subsystems/EnabledSubsystem拖入新建文件中,并打開。G將其中的“In1—Out1”刪掉。H將User-DefinedFunctions/S-Function拖入EnabledSubsystem中,改名為move_absolute。I將三個(gè)Source/Const拖入新建文件中。J將文件mcqg.out,IPM100.CFG,Move_Abs.h,InitIPM_RAM.h,InitIPM_RAM.cpp,TMLcommn.dll,TML_lid.dll,TML_lib.h,TML_lib.lib,文件復(fù)制到班號組號中。K在Init框圖上點(diǎn)擊右鍵/S-FunctionParameters.將S-FunctionName改為InitIPM_RAM并確定。I在move_absolute??驁D上點(diǎn)擊右鍵/S-FunctionParameters.將S-FunctionName改為move_Abs.并確定。M將matlab的命令輸入窗口上的CurrentDirectory的路徑設(shè)為“班號組號”的路徑。N在命令輸入窗口中依次輸入mexMove_Abs.cpp,mexInitIPM_RAM.cpp。這是可以看到move_absolute框圖輸入端口為3個(gè)。輸出為零。O將三個(gè)Constant與move_absolute3個(gè)輸出端口相連。P保存新建文件取名為Move_Abs1.存入“班級組號”中。運(yùn)行,觀察曲柄的運(yùn)行速度,加速度和最終停留位置。(2)小球在球桿上位置數(shù)據(jù)采集Get_AD的創(chuàng)建A在桌面上新建一個(gè)文件夾,如:“班號組號”。B打開matlab.點(diǎn)擊simulink圖標(biāo)。新建一個(gè)文件。C將User-DefinedFunctions/S-Function拖入新建文件中,改名為Init。D將一個(gè)Source/Constant拖入新建文件中,并打開。E將Com輸出端連接Init輸入端。F將Port&Subsystems/EnabledSubsystem拖入新建文件中,并打開。G將其中的“In1—Out1”刪掉。H將User-DefinedFunctions/S-Function拖入EnabledSubsystem中,改名為Get_ADI另將一個(gè)Source/Constant拖入子系統(tǒng)中。J在子系統(tǒng)中拖入一個(gè)示波器scop。K將Constant的值改為5.名稱改為AD_NO。L將AD_NO的輸出端與Get_AD的輸出端相連,將Get_AD的輸出端與示波器scop的輸入端相連。M在Get_AD框圖上點(diǎn)擊右鍵/S-FunctionParameters.將S-FunctionName改為Get_AD并確定。N將Get_AD.cpp,Get_AD.h復(fù)制到文件夾“班號組號”中。O在命令輸入窗口輸入mexGet_AD.cpp。P將所搭建的模塊另存到12中。取名為GetAD.用手使小球在球桿上移動(dòng),用示波器上顯示出小球運(yùn)動(dòng)位置的變化軌跡。(3)伺服控制stopandservo的創(chuàng)建A在桌面上新建一個(gè)文件夾,如:“班號組號”。B打開matlab.點(diǎn)擊simulink圖標(biāo)。新建一個(gè)文件。C將User-DefinedFunctions/S-Function拖入新建文件中,改名為Init。D將一個(gè)Source/Constant拖入新建文件中,并打開。E將Com輸出端連接Init輸入端。F將Port&Subsystems/EnabledSubsystem拖入新建文件中,并打開。G將其中的“In1—Out1”刪掉。H將兩個(gè)User-DefinedFunctions/S-Function拖入EnabledSubsystem中,分別改名為stop和servo。I將兩個(gè)SignalRouting/ManualSwitch(分別取名為ManualSwitch1和ManualSwitch2)和4個(gè)Source/Constant拖入Sbsystem中。J將ManualSwitch1和ManualSwitch2的兩個(gè)輸入端分別與兩個(gè)Constant相連。K將ManualSwitch1的輸出端與stop相連。將ManualSwitch2的輸出端與servo相連。L與ManualSwitch1相連的兩個(gè)Constant分別取值-1,改名continue和3,改名為stop.與ManualSwitch2相連的兩個(gè)Constant分別取值0,改名POWEROFF和1,改名為POWERON。M將Stop.cpp,Stop.h,Servo.cpp,Servo.h復(fù)制粘貼到“班號組號”中。N在命令輸入窗口中一次輸入mexStop.cpp,mexServo.cpp。O將所搭建的模塊另存到“班號組號”中。取名為stoppandservo.運(yùn)行:若將stop與-1連接,servo與1連接。則運(yùn)行時(shí),曲柄將運(yùn)動(dòng)到特定位置后停止運(yùn)動(dòng);若在中途改變stop與3連接,則曲柄立即停止運(yùn)動(dòng);若沒有上一步,將servo改為與0相連,則曲柄立即自然下垂到初始位置,再將servo改為與1相連,則曲柄立即又回到目標(biāo)位置。(4)根據(jù)球桿系統(tǒng)的模型,建立PID控制器,控制球在球桿某個(gè)位置的simulink控制模型。A在桌面上新建一個(gè)文件夾,如:“班號組號”。B打開matlab.點(diǎn)擊simulink圖標(biāo)。新建一個(gè)文件。C將User-DefinedFunctions/S-Function拖入新建文件中,改名為Init。D將一個(gè)Source/Constant拖入新建文件中,并打開。E將Com輸出端連接Init輸入端。F將Port&Subsystems/EnabledSubsystem拖入新建文件中,并打開。G將其中的“In1—Out1”刪掉。H創(chuàng)建子系統(tǒng)如下圖所示,離散PID控制器如下圖所示。圖(a)圖(b)圖(c)(三)實(shí)驗(yàn)C代碼及相關(guān)函數(shù)說明(1)球桿模型c代碼Get_AD.cpp/*Copyright2003-2004TheMathWorks,Inc.*///*******************************************************************//****Tobuildthismexfunctionuse:mexMytst.cpp****//*******************************************************************#include"Get_AD.h"#defineWIN32//#ifndefWIN32//#error"OnlyWIN32versionisavailable"http://#endif#include"windows.h"#defineS_FUNCTION_LEVEL2#defineS_FUNCTION_NAMEGet_AD//Needtoincludesimstruc.hforthedefinitionoftheSimStructand//itsassociatedmacrodefinitions.#include"simstruc.h"#include"TML_lib.h"http://#include"TML_lib_compact.h"#pragmacomment(lib,"TML_lib.lib")#pragmawarning(disable:4761)#defineIS_PARAM_DOUBLE(pVal)(mxIsNumeric(pVal)&&!mxIsLogical(pVal)&&\!mxIsEmpty(pVal)&&!mxIsSparse(pVal)&&!mxIsComplex(pVal)&&mxIsDouble(pVal))//Function:mdlInitializeSizes===============================================//Abstract://ThesizesinformationisusedbySimulinktodeterminetheS-function//block'scharacteristics(numberofinputs,outputs,states,etc.).staticvoidmdlInitializeSizes(SimStruct*S){//NoexpectedparametersssSetNumSFcnParams(S,0);//ParametermismatchwillbereportedbySimulinkif(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S)){return;}//SpecifyI/O//if(!ssSetNumInputPorts(S,0))return;if(!ssSetNumInputPorts(S,1))return;ssSetInputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetInputPortDirectFeedThrough(S,0,1);if(!ssSetNumOutputPorts(S,1))return;ssSetOutputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetNumSampleTimes(S,1);//ReserveplaceforC++objectssSetNumPWork(S,1);ssSetOptions(S,SS_OPTION_WORKS_WITH_CODE_REUSE|SS_OPTION_EXCEPTION_FREE_CODE|SS_OPTION_USE_TLC_WITH_ACCELERATOR);}//Function:mdlInitializeSampleTimes=========================================//Abstract://Thisfunctionisusedtospecifythesampletime(s)foryour//S-function.Youmustregisterthesamenumberofsampletimesas//specifiedinssSetNumSampleTimes.staticvoidmdlInitializeSampleTimes(SimStruct*S){ssSetSampleTime(S,0,CONTINUOUS_SAMPLE_TIME);//INHERITED_SAMPLE_TIMEssSetOffsetTime(S,0,0.0);ssSetModelReferenceSampleTimeDefaultInheritance(S);}//Function:mdlStart=======================================================//Abstract://Thisfunctioniscalledonceatstartofmodelexecution.Ifyou//havestatesthatshouldbeinitializedonce,thisistheplace//todoit.#defineMDL_STARTstaticvoidmdlStart(SimStruct*S){//StorenewC++objectinthepointersvectorDoubleAdder*da=newDoubleAdder();//InputRealPtrsTypeuPtrs=ssGetInputPortRealSignalPtrs(S,0);ssGetPWork(S)[0]=da;}//Function:mdlOutputs=======================================================//Abstract://Inthisfunction,youcomputetheoutputsofyourS-function//block.Generallyoutputsareplacedintheoutputvector,ssGetY(S).staticvoidmdlOutputs(SimStruct*S,int_Ttid){//RetrieveC++objectfromthepointersvector//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//GetdataaddressesofI/OInputRealPtrsTypeu=ssGetInputPortRealSignalPtrs(S,0);real_T*y=ssGetOutputPortRealSignal(S,0);////CallAddTomethodandreturnpeakvalue//y[0]=da->AddTo(*u[0]);//shortval_ad;shortAD_No;WORDadr_AD;AD_No=*u[0];adr_AD=0;if(AD_No==2)adr_AD=0x23e;if(AD_No==5)adr_AD=0x241;if(adr_AD!=0){TS_GetIntVariable(adr_AD,val_ad);*y=400.00*((float)(unsignedshort)val_ad/65535.00);}//}//Function:mdlTerminate=====================================================//Abstract://Inthisfunction,youshouldperformanyactionsthatarenecessary//attheterminationofasimulation.Forexample,ifmemorywas//allocatedinmdlStart,thisistheplacetofreeit.staticvoidmdlTerminate(SimStruct*S){//RetrieveanddestroyC++object//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//deleteda;}//RequiredS-functiontrailer#ifdefMATLAB_MEX_FILE/*IsthisfilebeingcompiledasaMEX-file?*/#include"simulink.c"/*MEX-fileinterfacemechanism*/#else#include"cg_sfun.h"/*Codegenerationregistrationfunction*/#endifInitIPM_RAM.cpp/*Copyright2003-2004TheMathWorks,Inc.*///*******************************************************************//****Tobuildthismexfunctionuse:mexMytst.cpp****//*******************************************************************#include"InitIPM_RAM.h"#defineWIN32//#ifndefWIN32//#error"OnlyWIN32versionisavailable"http://#endif#include"windows.h"#defineS_FUNCTION_LEVEL2#defineS_FUNCTION_NAMEInitIPM_RAM//Needtoincludesimstruc.hforthedefinitionoftheSimStructand//itsassociatedmacrodefinitions.#include"simstruc.h"#include"TML_lib.h"http://#include"TML_lib_compact.h"#pragmacomment(lib,"TML_lib.lib")#pragmawarning(disable:4761)#defineIS_PARAM_DOUBLE(pVal)(mxIsNumeric(pVal)&&!mxIsLogical(pVal)&&\!mxIsEmpty(pVal)&&!mxIsSparse(pVal)&&!mxIsComplex(pVal)&&mxIsDouble(pVal))//Function:mdlInitializeSizes===============================================//Abstract://ThesizesinformationisusedbySimulinktodeterminetheS-function//block'scharacteristics(numberofinputs,outputs,states,etc.).staticvoidmdlInitializeSizes(SimStruct*S){//NoexpectedparametersssSetNumSFcnParams(S,0);//ParametermismatchwillbereportedbySimulinkif(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S)){return;}//SpecifyI/O//if(!ssSetNumInputPorts(S,0))return;if(!ssSetNumInputPorts(S,1))return;ssSetInputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetInputPortDirectFeedThrough(S,0,1);if(!ssSetNumOutputPorts(S,1))return;ssSetOutputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetNumSampleTimes(S,1);//ReserveplaceforC++objectssSetNumPWork(S,1);ssSetOptions(S,SS_OPTION_WORKS_WITH_CODE_REUSE|SS_OPTION_EXCEPTION_FREE_CODE|SS_OPTION_USE_TLC_WITH_ACCELERATOR);}//Function:mdlInitializeSampleTimes=========================================//Abstract://Thisfunctionisusedtospecifythesampletime(s)foryour//S-function.Youmustregisterthesamenumberofsampletimesas//specifiedinssSetNumSampleTimes.staticvoidmdlInitializeSampleTimes(SimStruct*S){ssSetSampleTime(S,0,INHERITED_SAMPLE_TIME);ssSetOffsetTime(S,0,0.0);ssSetModelReferenceSampleTimeDefaultInheritance(S);}//Function:mdlStart=======================================================//Abstract://Thisfunctioniscalledonceatstartofmodelexecution.Ifyou//havestatesthatshouldbeinitializedonce,thisistheplace//todoit.#defineMDL_STARTstaticvoidmdlStart(SimStruct*S){//StorenewC++objectinthepointersvector//DoubleAdder*da=newDoubleAdder();shortrtn;InputRealPtrsTypeuPtrs=ssGetInputPortRealSignalPtrs(S,0);//ssGetPWork(S)[0]=da;//FILE*pfile;DWORDnBaud=115200;BYTEnHostID=255;BYTEnRSType=SERIAL_RS232;BYTEnPort=1;WORDstart_address;//pfile=fopen("rtn.txt","wt");nPort=*uPtrs[0];rtn=TS_OpenSerialPort(nRSType,nPort,nHostID,nBaud);//fprintf(pfile,"TS_OpenSerialPort:%d\n",rtn);rtn=TS_SetupAxis(255,"IPM100.cfg");//fprintf(pfile,"TS_SetupAxis:%d\n",rtn);rtn=TS_SelectAxis(255);//fprintf(pfile,"TS_SelectAxis:%d\n",rtn);rtn=TS_Reset();Sleep(100);////1¤×÷·?ê?????_20060917//Downloadthe"Ex29RAM.out"fileonthedriveTS_DownloadProgram("mcqg.out",start_address);//Afterthefiledownload,executethedownloadedcodeTS_GOTO(start_address);//gotothestartaddressofthesetupprogram//Afterthis,youcanstartsendingon-linecommandstowardsthedrive//rtn=TS_Power(POWER_ON);//fprintf(pfile,"TS_Power:%d\n",rtn);//rtn=TS_MoveVelocity(2,0.64,MOVE_IMMEDIATE,FROM_REFERENCE);rtn=TS_MoveAbsolute(4420,5,1,UPDATE_IMMEDIATE,FROM_REFERENCE);//fprintf(pfile,"TS_MoveVelocity:%d\n",rtn);//fclose(pfile);Sleep(100);}//Function:mdlOutputs=======================================================//Abstract://Inthisfunction,youcomputetheoutputsofyourS-function//block.Generallyoutputsareplacedintheoutputvector,ssGetY(S).staticvoidmdlOutputs(SimStruct*S,int_Ttid){//RetrieveC++objectfromthepointersvector//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//GetdataaddressesofI/O//InputRealPtrsTypeu=ssGetInputPortRealSignalPtrs(S,0);real_T*y=ssGetOutputPortRealSignal(S,0);//CallAddTomethodandreturnpeakvalue//y[0]=da->AddTo(*u[0]);///*WORDadr_APOS=0x228;//addressoftheAPOSTMLvariable-measuredpositionlongi_APOS=0;//variablestoringtheactualpositionreadfromthedriveTS_GetLongVariable(adr_APOS,i_APOS);//readtheactualpositionif(i_APOS<(4420-10))*y=1;//*/////Sleep(50);*y=1;}//Function:mdlTerminate=====================================================//Abstract://Inthisfunction,youshouldperformanyactionsthatarenecessary//attheterminationofasimulation.Forexample,ifmemorywas//allocatedinmdlStart,thisistheplacetofreeit.staticvoidmdlTerminate(SimStruct*S){//RetrieveanddestroyC++object//TS_MoveAbsolute(0,3,0.1,UPDATE_IMMEDIATE,FROM_REFERENCE);//FROM_MEASURE//Sleep(200);//TS_MoveVelocity(0,0.1,MOVE_IMMEDIATE,FROM_REFERENCE);TS_Power(POWER_OFF);TS_CloseSerialPort();//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//deleteda;}//RequiredS-functiontrailer#ifdefMATLAB_MEX_FILE/*IsthisfilebeingcompiledasaMEX-file?*/#include"simulink.c"/*MEX-fileinterfacemechanism*/#else#include"cg_sfun.h"/*Codegenerationregistrationfunction*/#endifMove_AbS.cpp/*Copyright2003-2004TheMathWorks,Inc.*///*******************************************************************//****Tobuildthismexfunctionuse:mexMytst.cpp****//*******************************************************************#include"Move_Abs.h"#defineWIN32//#ifndefWIN32//#error"OnlyWIN32versionisavailable"http://#endif#include"windows.h"#defineS_FUNCTION_LEVEL2#defineS_FUNCTION_NAMEMove_Abs//Needtoincludesimstruc.hforthedefinitionoftheSimStructand//itsassociatedmacrodefinitions.#include"simstruc.h"#include"TML_lib.h"http://#include"TML_lib_compact.h"#pragmacomment(lib,"TML_lib.lib")#pragmawarning(disable:4761)#defineIS_PARAM_DOUBLE(pVal)(mxIsNumeric(pVal)&&!mxIsLogical(pVal)&&\!mxIsEmpty(pVal)&&!mxIsSparse(pVal)&&!mxIsComplex(pVal)&&mxIsDouble(pVal))//Function:mdlInitializeSizes===============================================//Abstract://ThesizesinformationisusedbySimulinktodeterminetheS-function//block'scharacteristics(numberofinputs,outputs,states,etc.).staticvoidmdlInitializeSizes(SimStruct*S){//Noexpectedparametersinti;ssSetNumSFcnParams(S,0);//ParametermismatchwillbereportedbySimulinkif(ssGetNumSFcnParams(S)!=ssGetSFcnParamsCount(S)){return;}//SpecifyI/Oif(!ssSetNumInputPorts(S,3))return;for(i=0;i<3;i++){ssSetInputPortWidth(S,i,1);//DYNAMICALLY_SIZEDssSetInputPortDirectFeedThrough(S,i,1);}if(!ssSetNumOutputPorts(S,0))return;//ssSetOutputPortWidth(S,0,DYNAMICALLY_SIZED);ssSetNumSampleTimes(S,1);//ReserveplaceforC++objectssSetNumPWork(S,1);ssSetOptions(S,SS_OPTION_WORKS_WITH_CODE_REUSE|SS_OPTION_EXCEPTION_FREE_CODE|SS_OPTION_USE_TLC_WITH_ACCELERATOR);}//Function:mdlInitializeSampleTimes=========================================//Abstract://Thisfunctionisusedtospecifythesampletime(s)foryour//S-function.Youmustregisterthesamenumberofsampletimesas//specifiedinssSetNumSampleTimes.staticvoidmdlInitializeSampleTimes(SimStruct*S){ssSetSampleTime(S,0,CONTINUOUS_SAMPLE_TIME);//INHERITED_SAMPLE_TIMEssSetOffsetTime(S,0,0.0);ssSetModelReferenceSampleTimeDefaultInheritance(S);}//Function:mdlStart=======================================================//Abstract://Thisfunctioniscalledonceatstartofmodelexecution.Ifyou//havestatesthatshouldbeinitializedonce,thisistheplace//todoit.#defineMDL_STARTstaticvoidmdlStart(SimStruct*S){//StorenewC++objectinthepointersvectorDoubleAdder*da=newDoubleAdder();InputRealPtrsTypeuPtrs=ssGetInputPortRealSignalPtrs(S,0);ssGetPWork(S)[0]=da;}//Function:mdlOutputs=======================================================//Abstract://Inthisfunction,youcomputetheoutputsofyourS-function//block.Generallyoutputsareplacedintheoutputvector,ssGetY(S).staticvoidmdlOutputs(SimStruct*S,int_Ttid){//RetrieveC++objectfromthepointersvector//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//GetdataaddressesofI/OInputRealPtrsTypeu=ssGetInputPortRealSignalPtrs(S,0);real_T*y=ssGetOutputPortRealSignal(S,0);////CallAddTomethodandreturnpeakvalue//y[0]=da->AddTo(*u[0]);//shortrtn;FILE*pfile;pfile=fopen("rtn.txt","wt");fprintf(pfile,"*u[0]:%ld\n",*u[0]);fprintf(pfile,"*u[1]:%f\n",*u[1]);fprintf(pfile,"*u[2]:%f\n",*u[2]);rtn=TS_MoveAbsolute(*u[0],*u[1],*u[2],UPDATE_IMMEDIATE,FROM_REFERENCE);//rtn=TS_MoveAbsolute(2000,5,0.01,UPDATE_IMMEDIATE,FROM_REFERENCE);fprintf(pfile,"TS_MoveAbsolute:%d\n",rtn);fclose(pfile);//}//Function:mdlTerminate=====================================================//Abstract://Inthisfunction,youshouldperformanyactionsthatarenecessary//attheterminationofasimulation.Forexample,ifmemorywas//allocatedinmdlStart,thisistheplacetofreeit.staticvoidmdlTerminate(SimStruct*S){//RetrieveanddestroyC++object//DoubleAdder*da=static_cast<DoubleAdder*>(ssGetPWork(S)[0]);//deleteda;}//RequiredS-functiontrailer#ifdefMATLAB_MEX_FILE/*IsthisfilebeingcompiledasaMEX-file?*/#include"simulink.c"/*MEX-fileinterfacemechanism*/#else#include"cg_sfun.h"/*Codegenerationregistrationfunction*/#endif(1)Get_ADA函數(shù)功能:采集AD數(shù)據(jù)(對于球桿系統(tǒng)為采集小球位置);B函數(shù)實(shí)現(xiàn)描述:定義AD采樣端口的值、地址、AD端口號等變量對他們賦初始值IPM100運(yùn)動(dòng)控制器有兩個(gè)10位的模擬量輸入端口,AD2和AD5,該函數(shù)中對AD端口號AD_No(系統(tǒng)默認(rèn)為5)進(jìn)行判斷并讀取該端口模擬量的值,并賦給變量val_ad。再通過讀取內(nèi)存中模擬量輸入端口對應(yīng)地址單元內(nèi)的值,根據(jù)*y=400.00*((float)(unsignedshort)val_ad/65535.00)計(jì)算出小球的實(shí)際位置(單位毫米)。其中400為整個(gè)位移傳感器的長度(400毫米),65535(1111111111111111)B為小球位置為400mm時(shí)對應(yīng)的值。備注:AD轉(zhuǎn)換結(jié)果有10位的分辨率,并左移6位。這樣AD轉(zhuǎn)換后的值在內(nèi)存中為16位。該函數(shù)的輸入是AD輸入通道模擬量經(jīng)轉(zhuǎn)換后在內(nèi)存中的值,輸出為計(jì)算出來的小球的實(shí)際位置。C使用說明:1個(gè)輸入:AD端口號1個(gè)輸出:經(jīng)過換算出來的小球的位置Y(2)Move_Abs函數(shù)功能:絕對運(yùn)動(dòng)命令:控制電機(jī)運(yùn)動(dòng)函數(shù)實(shí)現(xiàn)描述:輸入電機(jī)的目標(biāo)位置、目標(biāo)速度和目標(biāo)加速度,使電機(jī)運(yùn)動(dòng)到設(shè)定的目標(biāo)位置使用說明:3個(gè)輸入:設(shè)定運(yùn)動(dòng)的速度和加速度及目標(biāo)位置(3)Stop函數(shù)功能:運(yùn)動(dòng)停止命令函數(shù)函數(shù)實(shí)現(xiàn)描述:讀入電機(jī)停車的方式(默認(rèn)STOP_3系統(tǒng)以設(shè)定的加減速度使用說明:一個(gè)輸入:設(shè)定停止模式(4)Servo_on函數(shù)功能:電機(jī)伺服控制函數(shù)實(shí)現(xiàn)描述:讀
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 男女婚前彩禮協(xié)議書
- 游戲公測保密協(xié)議書
- 上市企業(yè)退股協(xié)議書
- 農(nóng)村農(nóng)戶用水協(xié)議書
- 隧道保密協(xié)議書范本
- 火災(zāi)賠款協(xié)議書范本
- 疫情期間黑白協(xié)議書
- 機(jī)器購買免責(zé)協(xié)議書
- 中介租房委托協(xié)議書
- 消費(fèi)贈(zèng)與協(xié)議書模板
- 銀行案件防控課件
- 2025年江蘇省安全員B證考試題庫附答案
- 科級試用期滿工作總結(jié)(4篇)
- 歷史-安徽省蚌埠市2025屆高三年級第二次教學(xué)質(zhì)量檢查考試(蚌埠二模)試題和答案
- 2025年浙江省金華市中考一模數(shù)學(xué)模擬試題(含答案)
- 2024年國家發(fā)展和改革委員會(huì)直屬單位招聘考試真題
- 《中國古代神話》課件
- 供應(yīng)商考核管理制度
- 酒店動(dòng)火作業(yè)安全制度
- 電纜故障知識培訓(xùn)課件
評論
0/150
提交評論