




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、綜合測控實驗報告 班級 成員: 指導(dǎo)老師: 目錄綜合測控實驗報告1信號發(fā)生器信號采集及頻譜分析20球桿定位控制系統(tǒng)實驗1、 實驗培養(yǎng)目標(biāo)學(xué)生在實驗過程中,會把以前所學(xué)的控制理論知識應(yīng)用到實驗中,是一個理論付諸實踐的絕好機會;同時,實驗過程中還要用到Matlab和C+操作,學(xué)生做完實驗后會更好地掌握這兩款軟件。2、 實驗所用模型的數(shù)學(xué)表述球桿定位控制系統(tǒng)是一個經(jīng)典控制理論教學(xué)模型,它具有物理模型簡單、概念清晰、便于用控制理論算法進(jìn)行的特點,系統(tǒng)給出一個相對簡單的模型。(圖片摘自 黃弢. 機械基礎(chǔ)工程訓(xùn)練實驗指導(dǎo)書.)鋼球在滑道加速滾動的力是小球的重力在同滑道平行方向上的分力與摩擦力的合力。鋼球的
2、滾動的動力學(xué)方程,鋼球在滑道上滾動的加速度: 其中為鋼球與軌道之間的摩擦系數(shù),而為滑道與水平面之間的夾角。為了簡化系統(tǒng)模型,考慮到摩擦系數(shù)比較小,摩擦力可以忽略不計,因此,其基本的數(shù)學(xué)模型轉(zhuǎn)化成如下方式: 當(dāng)時,線性化處理后,得到傳遞函數(shù)如下: 其中為鋼球在滑道上的位置。在實際控制的過程中,滑道的仰角是由電動機的轉(zhuǎn)角輸出來實現(xiàn)的。影響電動機轉(zhuǎn)角和滑道仰角之間的關(guān)系主要因素就是齒輪的減速比和非線性。因此,我們把該模型進(jìn)一步簡化: 另一個模型: 其中c是一個包含了b和g的影響的參數(shù)。因此,球桿系統(tǒng)實際上可以簡化成一個二階系統(tǒng)。(以上摘自 黃弢. 機械基礎(chǔ)工程訓(xùn)練實驗指導(dǎo)書.)三、實驗所用控制工具的
3、數(shù)學(xué)模型本實驗中用到的控制工具是PID控制器,它的基本數(shù)學(xué)規(guī)律可由下式表達(dá): 對公式的描述有如下幾點:(1) 比例系數(shù)Kp直接決定控制作用的強弱,加大Kp可以減少系統(tǒng)的穩(wěn)態(tài)誤差,提高系統(tǒng)的動態(tài)響應(yīng)速度,但Kp過大會使動態(tài)質(zhì)量變壞,引起被控制量振蕩甚至導(dǎo)致閉環(huán)系統(tǒng)不穩(wěn)定;(2) 在比例調(diào)節(jié)的基礎(chǔ)上加上積分控制可以消除系統(tǒng)的穩(wěn)態(tài)誤差,因為只要存在偏差,它的積分所產(chǎn)生的控制量總是用來消除穩(wěn)態(tài)誤差的,知道積分的值為零,控制作用才停止。但它將使系統(tǒng)的動態(tài)過程變慢,而且過強的積分作用使系統(tǒng)的超調(diào)量增大,從而使系統(tǒng)的穩(wěn)定性變壞。(3) 微分的控制作用是跟偏差的變化速度有關(guān)的。微分控制能夠預(yù)測偏差,產(chǎn)生超前的
4、校正作用,它有助于減少超調(diào),克服振蕩,使系統(tǒng)趨于穩(wěn)定,并能加快系統(tǒng)的響應(yīng)速度,減少調(diào)整時間,從而改善了系統(tǒng)的動態(tài)性能。微分作用的不足之處是放大了噪聲信號。(以上公式解釋摘自 楊叔子,楊克沖. 機械工程控制基礎(chǔ). 武漢:華中科技大學(xué)出版社 2005(7) )4、 控制系統(tǒng)的搭建1. 建立主系統(tǒng)框架打開Matlab,點擊simulink圖標(biāo)。新建一個文件。將User-Defined Funcitions/S-Function拖入新建文件中,改名為Init。將一個Sources/Constant 拖入新建文件中,改名為Com。將Com輸入端鏈接Init輸入端。將Ports&Subsystem
5、s/Enabled Subsystem拖入新建文件中。(以上摘自 黃弢. 機械基礎(chǔ)工程訓(xùn)練實驗指導(dǎo)書.)結(jié)果得到如下的框圖這樣,主系統(tǒng)框架就搭好了,接下來的任務(wù)就是編輯子系統(tǒng),使之完成預(yù)定的功能。2. 子系統(tǒng)運動功能Move_Abs的搭建打開主系統(tǒng)框架中的Subsystem,將其中的“In1-Out1”刪掉,將User-Defined Functions/S-Function拖入Enabled Subsystem中,改名為move_absolute。將三個Sources/Constant拖入新建文件中。將文件mcqg.out,IPM100.CFG,Move_Abs.cpp,Move_Abs.h
6、,InitIPM_RAM.h ,InitIPM_RAM.cpp 等文件復(fù)制到已經(jīng)創(chuàng)建的文件夾XX中。在Init框圖上點擊右鍵/SFunction Parameters.將SFunction Name改為InitIPM_RAM并確定。在move_absolute框圖上點擊右鍵/SFunction Parameters.將SFunction Name改為Move_Abs,并確定。將matlab的命令輸入窗口上的Current Directory的路徑改為XX。在命令輸入窗口中依次輸入mex Move_Abs.cpp,mex InitIPM_RAM.cpp。這時可以看到move_absolute框圖
7、輸入端口為3個。輸出為零。將三個Constant與move_absolute3個輸入端口相連。保存新建文件取名為Move_Abs1.存入XX中。(以上摘自 黃弢. 機械基礎(chǔ)工程訓(xùn)練實驗指導(dǎo)書.)結(jié)果如下圖所示3. 子系統(tǒng)位置采集功能的搭建將User-Defined Functions/S-Function拖入Enabled Subsystem中,改名為Get_AD。另將一個Source/Constant拖入子系統(tǒng)中。在子系統(tǒng)中拖入一個示波器scop。將Constant的值改為5。名稱改為AD_NO.將AD_NO的輸入端與Get_AD的輸入端相連,將Get_AD的輸出端與示波器scop的輸入端相
8、連。在Get_AD框圖上點擊右鍵/SFunction Parameters.將SFunction Name改為Get_AD,并確定。將Get_AD.cpp、Get_AD.h復(fù)制到文件夾XX中。在命令輸入窗口中輸入mex Get_AD.cpp。將所搭建模塊另存到12中。取名為GetAD。用手使小球在球桿上移動,用示波器上顯示出小球運動位置的變化軌跡。(以上摘自 黃弢. 機械基礎(chǔ)工程訓(xùn)練實驗指導(dǎo)書.)結(jié)果如下圖所示:4. 嘗試建立使用PID控制器,控制球在球桿某個位置的 simulink控制模型搭建過程中用到了上面搭建的運動功能 Move_Abs和位置采集功能Get_AD。最終效果圖如下其中,PI
9、D控制器的內(nèi)部構(gòu)造如下(以上摘自 黃弢. 機械基礎(chǔ)工程訓(xùn)練實驗指導(dǎo)書.)其中的T、Kp、Ki、Kd/T等變量要在右鍵點擊PID框圖所出現(xiàn)的Mask Parameters中封裝。需要說明的是,我們參考其他同學(xué)的成功經(jīng)驗,仿照他們添加了一個濾波環(huán)節(jié),即下圖中央的filer。filter 至此,實驗所要用到的系統(tǒng)框圖都已經(jīng)搭建好了。5、 相關(guān)文件的注釋本實驗中用到的CPP文件有三個,分別是InitIPM_RAM.cpp、Move_Abs.cpp和Get_AD.cpp。對他們的注釋如下1.InitIPM_RAM.cpp的注釋#include "InitIPM_RAM.h"#defi
10、ne WIN32#include "windows.h"#define S_FUNCTION_LEVEL 2#define S_FUNCTION_NAME InitIPM_RAM#include "simstruc.h"#include "TML_lib.h"#pragma comment(lib, "TML_lib.lib")#pragma warning( disable: 4761 )#define IS_PARAM_DOUBLE(pVal) (mxIsNumeric(pVal) && !mx
11、IsLogical(pVal) &&!mxIsEmpty(pVal) && !mxIsSparse(pVal) && !mxIsComplex(pVal) && mxIsDouble(pVal)static void mdlInitializeSizes(SimStruct *S)/這個函數(shù)用來設(shè)置輸入、輸出和參數(shù)的 ssSetNumSFcnParams(S, 0); / 設(shè)置參數(shù)個數(shù)為0 if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S) return; / 如果參數(shù)不匹配會
12、提示錯誤 if (!ssSetNumInputPorts(S, 1) return; / 設(shè)置輸入變量的個數(shù)為1 ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED); /* 設(shè)置輸入變量的維數(shù),這里為動態(tài)分配*/ ssSetInputPortDirectFeedThrough(S, 0, 1); /設(shè)置輸入端口的信號是否在mdlOutputs函數(shù)中使用,這兒設(shè)置為true if (!ssSetNumOutputPorts(S,1) return; / 設(shè)置輸出變量的個數(shù)為1 ssSetOutputPortWidth(S, 0, DYNAMICALLY_SI
13、ZED); /* 設(shè)置輸入變量的維數(shù),這里為動態(tài)分配*/ ssSetNumSampleTimes(S, 1); / 設(shè)置采樣時間,此處為1s / 為C+對象預(yù)留空間 ssSetNumPWork(S, 1); ssSetOptions(S, SS_OPTION_WORKS_WITH_CODE_REUSE | SS_OPTION_EXCEPTION_FREE_CODE | SS_OPTION_USE_TLC_WITH_ACCELERATOR);static void mdlInitializeSampleTimes(SimStruct *S)/這個函數(shù)用來給SFunction設(shè)置采樣時間,所設(shè)置的
14、時間應(yīng)該與ssSetNumSampleTimes中所設(shè)置的一樣 ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME); / 繼承采樣時間 ssSetOffsetTime(S, 0, 0.0); ssSetModelReferenceSampleTimeDefaultInheritance(S); #define MDL_STARTstatic void mdlStart(SimStruct *S)/這個函數(shù)在模型執(zhí)行的一開始被調(diào)用一次,用于初始化輸入端口 / 儲存新的C+對象在指針矢量中short rtn;/ 選擇通信串口 InputRealPtrsType
15、 uPtrs = ssGetInputPortRealSignalPtrs(S,0);DWORD nBaud = 115200;BYTE nHostID = 255;BYTE nRSType=SERIAL_RS232;BYTE nPort=1; WORD start_address; nPort=*uPtrs0;rtn=TS_OpenSerialPort(nRSType, nPort, nHostID, nBaud); rtn=TS_SetupAxis(255,"IPM100.cfg"); rtn=TS_SelectAxis(255); rtn=TS_Reset();Sle
16、ep(100); / 使計算機可以發(fā)送on-linecommandsTS_DownloadProgram("mcqg.out", start_address);TS_GOTO(start_address); / 伺服電源打開rtn=TS_Power(POWER_ON); rtn=TS_MoveAbsolute(4420, 5, 1, UPDATE_IMMEDIATE, FROM_REFERENCE); Sleep(100); static void mdlOutputs(SimStruct *S, int_T tid)/這個函數(shù)用來計算S-Function的輸出 real_
17、T *y = ssGetOutputPortRealSignal(S, 0); / 設(shè)置輸出參數(shù) *y = 1;static void mdlTerminate(SimStruct *S)/這個函數(shù)用來實現(xiàn)仿真中的所有終端功能 TS_Power(POWER_OFF); / 關(guān)掉伺服電源TS_CloseSerialPort(); / 關(guān)閉通信串口#ifdef MATLAB_MEX_FILE / 判斷文件是否作為mex文件被編譯#include "simulink.c" #else#include "cg_sfun.h" #endif(以上注釋參考了文件In
18、itIPM_RAM.cpp中的英文解釋)2.Move_Abs.cpp的注釋#include "Move_Abs.h"#define WIN32#include "windows.h"#define S_FUNCTION_LEVEL 2#define S_FUNCTION_NAME Move_Abs /命名為Move_Abs#include "simstruc.h" /程序里面要用到的頭文件在這里引用,如“math.h”等#include "TML_lib.h"#pragma comment(lib, "T
19、ML_lib.lib")#pragma warning( disable: 4761 )#define IS_PARAM_DOUBLE(pVal) (mxIsNumeric(pVal) && !mxIsLogical(pVal) &&!mxIsEmpty(pVal) && !mxIsSparse(pVal) && !mxIsComplex(pVal) && mxIsDouble(pVal)static void mdlInitializeSizes(SimStruct *S) /這個函數(shù)用來設(shè)置輸入、輸出
20、和參數(shù)的int i; ssSetNumSFcnParams(S, 0); /設(shè)置參數(shù)個數(shù)為3 / Parameter mismatch will be reported by Simulink if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S) return; / 判斷參數(shù)匹配是否錯誤 if (!ssSetNumInputPorts(S, 3) return; / 設(shè)置輸入變量的個數(shù)為3 for(i=0;i<3;i+) ssSetInputPortWidth(S, i, 1); / 設(shè)置輸入變量的維數(shù)為動態(tài)分配 ssSetInputP
21、ortDirectFeedThrough(S, i, 1);/* 設(shè)置輸入端口的信號是否在mdlOutputs函數(shù)中使用,這兒設(shè)置為true*/ if (!ssSetNumOutputPorts(S,0) return; / 設(shè)置輸出變量的個數(shù)為0 ssSetNumSampleTimes(S, 1); / 設(shè)置采樣時間為1s / 為C+對象預(yù)留空間 ssSetNumPWork(S, 1); ssSetOptions(S, SS_OPTION_WORKS_WITH_CODE_REUSE | SS_OPTION_EXCEPTION_FREE_CODE | SS_OPTION_USE_TLC_WIT
22、H_ACCELERATOR);static void mdlInitializeSampleTimes(SimStruct *S)/這個函數(shù)用來給SFunction設(shè)置采樣時間,所設(shè)置的時間應(yīng)該與ssSetNumSampleTimes中所設(shè)置的一樣 ssSetSampleTime(S,0,CONTINUOUS_SAMPLE_TIME); / 繼承采樣時間 ssSetOffsetTime(S, 0, 0.0); ssSetModelReferenceSampleTimeDefaultInheritance(S); #define MDL_START/這個函數(shù)在模型執(zhí)行的一開始被調(diào)用一次,用于初始
23、化輸入端口static void mdlStart(SimStruct *S) DoubleAdder *da = new DoubleAdder(); / 儲存新的C+對象在指針矢量中 InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0); ssGetPWork(S)0 = da; static void mdlOutputs(SimStruct *S, int_T tid)/這個函數(shù)用來計算S-Function的輸出InputRealPtrsType u = ssGetInputPortRealSignalPtrs(S,0)
24、; / 從指針矢量中恢復(fù)C+變量,獲取輸入輸出的地址信息real_T *y = ssGetOutputPortRealSignal(S, 0); / 設(shè)置輸出參數(shù) / 將輸入的參數(shù)記錄到rtn.txt中 short rtn;FILE *pfile; pfile=fopen("rtn.txt","wt");fprintf(pfile,"*u0:%ldn",*u0);fprintf(pfile,"*u1:%fn",*u1);fprintf(pfile,"*u2:%fn",*u2);rtn=TS_Mo
25、veAbsolute(*u0,*u1,*u2,UPDATE_IMMEDIATE, FROM_REFERENCE); / 驅(qū)動電機以特定的速度、加速度運動到目標(biāo)位置 fprintf(pfile,"TS_MoveAbsolute:%dn",rtn); / 記錄TS_MoveAbsolute的返回值 fclose(pfile); / 關(guān)掉rtn.txtstatic void mdlTerminate(SimStruct *S)/這個函數(shù)用來實現(xiàn)仿真中的所有終端功能 #ifdef MATLAB_MEX_FILE / 判斷文件是否作為mex文件被編譯#include "si
26、mulink.c" #else#include "cg_sfun.h" #endif(以上注釋參考了文件Move_Abs.cpp中的英文解釋)3.Get_AD.cpp的注釋#include "Get_AD.h"#define WIN32#include "windows.h"#define S_FUNCTION_LEVEL 2#define S_FUNCTION_NAME Get_AD#include "simstruc.h"#include "TML_lib.h"#pragma co
27、mment(lib, "TML_lib.lib")#pragma warning( disable: 4761 )#define IS_PARAM_DOUBLE(pVal) (mxIsNumeric(pVal) && !mxIsLogical(pVal) &&!mxIsEmpty(pVal) && !mxIsSparse(pVal) && !mxIsComplex(pVal) && mxIsDouble(pVal)static void mdlInitializeSizes(SimStruct
28、*S)/這個函數(shù)用來定義S-Function的特性,包括輸入輸出的數(shù)量以及狀態(tài)的數(shù)量 ssSetNumSFcnParams(S, 0); / 設(shè)置參數(shù)個數(shù)為0 if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S) return; / 如果參數(shù)不匹配會提示錯誤 if (!ssSetNumInputPorts(S, 1) return; /*設(shè)置輸入?yún)?shù)個數(shù)為1*/ ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED);/ 設(shè)置輸入變量的維數(shù),這里為動態(tài)分配 ssSetInputPortDirectFeedTh
29、rough(S, 0, 1); / 設(shè)置輸入端口的信號是否在mdlOutputs函數(shù)中使用,這兒設(shè)置為true if (!ssSetNumOutputPorts(S,1) return; /*設(shè)置輸出參數(shù)個數(shù)為1*/ ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED);/* 設(shè)置輸出變量的維數(shù),這里為動態(tài)分配*/ ssSetNumSampleTimes(S, 1); /*設(shè)置采樣時間,此處為1s*/ / 為C+對象預(yù)留空間 ssSetNumPWork(S, 1); ssSetOptions(S, SS_OPTION_WORKS_WITH_CODE_REU
30、SE | SS_OPTION_EXCEPTION_FREE_CODE | SS_OPTION_USE_TLC_WITH_ACCELERATOR);static void mdlInitializeSampleTimes(SimStruct *S)/這個函數(shù)用來給SFunction設(shè)置采樣時間,所設(shè)置的時間應(yīng)該與ssSetNumSampleTimes中所設(shè)置的一樣 ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME); /*繼承采樣時間*/ ssSetOffsetTime(S, 0, 0.0); ssSetModelReferenceSampleTimeDe
31、faultInheritance(S); #define MDL_STARTstatic void mdlStart(SimStruct *S)/這個函數(shù)在模型執(zhí)行的一開始被調(diào)用一次,用于初始化輸入端口 DoubleAdder *da = new DoubleAdder(); /*儲存新的C+對象在指針矢量中*/ ssGetPWork(S)0 = da;static void mdlOutputs(SimStruct *S, int_T tid)/*這個函數(shù)用來計算S-Function的輸出*/ InputRealPtrsType u = ssGetInputPortRealSignalPtr
32、s(S,0); / 從指針矢量中恢復(fù)C+變量,獲取輸入輸出的地址信息 real_T *y = ssGetOutputPortRealSignal(S, 0); /*設(shè)置輸出參數(shù)*/ / 調(diào)用AddTo方法,并返回峰值 short val_ad;short AD_No;WORD adr_AD;AD_No=*u0;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)(unsigned short
33、)val_ad/65535.00); static void mdlTerminate(SimStruct *S)/*這個函數(shù)用來實現(xiàn)仿真中的所有終端功能*/#ifdef MATLAB_MEX_FILE /*判斷文件是否作為mex文件被編譯*/ #include "simulink.c" #else#include "cg_sfun.h" /*密碼生成功能*/ #endif(以上注釋參考了文件Get_AD.cpp中的英文解釋)6、 PID參數(shù)調(diào)試PID參數(shù)調(diào)試的目標(biāo)是使小球能夠快速準(zhǔn)確地停在指定的位置。下面是我們大致的調(diào)試過程。(1)一開始處在胡亂摸索階
34、段,我們使用了Kp=30,Ki=3,Kd=8,T=0.02這組設(shè)定值預(yù)設(shè)位置為200,得到如下波形從波形可以看到,系統(tǒng)運動相當(dāng)不穩(wěn)定,我們判斷是Kp給大了,于是決定將它改小并相應(yīng)改小其他參數(shù)。(2)經(jīng)過比較長時間的反復(fù)實驗后,我們得到了具有階段性成果的一組參數(shù)值 Kp=15,Ki=1,Kd=8,T=0.02我們得到如下幾幅截圖預(yù)設(shè)位置值為200時預(yù)設(shè)位置值為250時預(yù)設(shè)位置值為300時從圖中可以看見,雖然預(yù)設(shè)位置值為250時效果很好,但是預(yù)設(shè)位置值為200和300時的穩(wěn)態(tài)誤差比較明顯,故需要繼續(xù)調(diào)整。(3) 要減小穩(wěn)態(tài)誤差,有兩個途徑,一個是增大Kp,一個增大Ki,在調(diào)試過程中,我們發(fā)現(xiàn)增大K
35、i要付出很大的代價,因為它的增大會給系統(tǒng)帶來很大的不穩(wěn)定性,相比之下,我們發(fā)現(xiàn)增大Kp的值更加安全,于是,經(jīng)過幾番嘗試之后,我們確定了效果最后的一組參數(shù)KP=20,Ki=1,Kd=8,T=0.02得到一下截圖預(yù)設(shè)位置值為200時預(yù)設(shè)位置值為250時預(yù)設(shè)位置值為300時可以看出,雖然在預(yù)設(shè)位置值為200是還是有點小波動,但總體效果來看已經(jīng)很令人滿意了,所以我們以這組參數(shù)作為最終標(biāo)準(zhǔn)。7、 球桿實驗的簡單歸納整個球桿實驗主要歸納為(1) 熟悉球桿定位控制系統(tǒng)的數(shù)學(xué)模型(2) 在simulink中搭建運動功能模塊(3) 在simulink中搭建位置采集模塊(4) 在simulink中,以(2)、(3
36、)的成果為基礎(chǔ),搭建包含PID控制器的球桿定位控制系統(tǒng)(5)調(diào)試PID參數(shù),以實現(xiàn)準(zhǔn)確快速而且穩(wěn)定的小球位置控制信號發(fā)生器信號采集及頻譜分析一 實驗?zāi)康?. 學(xué)習(xí)matalab中的Simulink仿真功能;2. 運用mtalab完成數(shù)據(jù)的采集程序設(shè)計;3. 運用matlab實現(xiàn)數(shù)據(jù)的可視化和界面設(shè)計;4. 利用所設(shè)計的采集程序采集信號發(fā)生器的信號,以及利用編寫的數(shù)據(jù)處理代碼來進(jìn)行頻譜分析。二 實驗器材信號發(fā)生器 1臺 matlab 7.0軟件 1套信號采集工作臺 1臺 三 實驗原理時域測量以被測信號和網(wǎng)絡(luò)系統(tǒng)在時域內(nèi)的特性為依據(jù),研究的是被測對象的幅度時間特性,時域測量常用的測試信號是脈沖或階
37、躍信號,研究的是待測信號的瞬變過程或網(wǎng)絡(luò)輸出的沖激或階躍響應(yīng):關(guān)鍵是時域信號的采集和分析頻域測量以被測信號和被測網(wǎng)絡(luò)系統(tǒng)在頻域的特性為依據(jù),研究的是被測對象的幅頻特性和相頻特性,頻域測量常用的測試信號為正弦波,研究的是待測信號或網(wǎng)絡(luò)輸出的穩(wěn)態(tài)響應(yīng):關(guān)鍵是特定頻率的產(chǎn)生和選擇。由傅立葉變換知,時域電信號可以分解為一個、多個、甚至是連續(xù)的不同頻率、不同幅度和不同相位的正弦波。因此,用適當(dāng)?shù)姆椒?,我們可以把時域波形分解為相應(yīng)的正弦波分量,然后對它們分別進(jìn)行分析與測量,每個正弦波的性質(zhì)由幅度和相位決定,換句話說,可以把時域信號等效到頻域中去進(jìn)行分析和測量,這就是頻譜分析。四 實驗內(nèi)容設(shè)計步驟:先利用s
38、imuink創(chuàng)建仿真,然后編寫采集程序,以及信號的頻譜分析代碼(功率譜、幅值譜、相位譜),最后從信號發(fā)生器采集信號,并進(jìn)行頻譜分析1. 利用Simulink創(chuàng)建仿真新建simulink文件hp.mdl如下:Simulink model:模型中含有三個輸入端,兩個輸出端,但實際輸出只有一個輸出端。下面是一些代碼的及注釋:(1)多個輸入輸出設(shè)置:/設(shè)置3個輸入通道if (!ssSetNumInputPorts(S, 3) return; ssSetInputPortWidth(S, 0, 1);ssSetInputPortRequiredContiguous(S, 0, true); /*dire
39、ct input signal access*/添加兩個新的輸入通道 ssSetInputPortWidth(S, 1, 1); ssSetInputPortRequiredContiguous(S, 1, true); ssSetInputPortWidth(S, 2, 1);ssSetInputPortRequiredContiguous(S, 2, true); ssSetInputPortDirectFeedThrough(S, 0, 1); ssSetInputPortDirectFeedThrough(S, 1, 1); ssSetInputPortDirectFeedThroug
40、h(S, 2, 1);/設(shè)置兩個輸出通道if (!ssSetNumOutputPorts(S, 2) return;ssSetOutputPortWidth(S, 0, 1); /*direct output signal access*/添加一個新輸出通道 ssSetOutputPortWidth(S, 1, 1);然后在matlab的命令窗口中輸入mex Myon.cpp,在S-Function中調(diào)用模塊時,模塊有三個輸入接口和一個輸出接口。(2)標(biāo)注輸入輸出設(shè)置,如下圖其中port_label('input',1,'fre') /設(shè)置第一個輸入接口為fre
41、port_label('input',2,'cha') /設(shè)置第二個輸入接口為chaport_label('input',3,'chb') /設(shè)置第三個輸入接口為chbport_label('output',1,'data1') /設(shè)置第一個輸出接口為data1disp('MyOn')(3)采集卡初始化以及數(shù)據(jù)采集:/全局變量:2個通道的數(shù)據(jù)緩存buffer,讀取指針數(shù)和8通道2進(jìn)制表示值double buffer5000;double buffer15000;int pnum;in
42、t chnum=1;static void mdlStart(SimStruct *S) const real_T *u1 = (const real_T *)ssGetInputPortRealSignalPtrs(S,0);/定義兩個新添加通道的采集 const real_T *u2 = (const real_T *)ssGetInputPortRealSignalPtrs(S,1); const real_T *u3 = (const real_T *)ssGetInputPortRealSignalPtrs(S,2); double Fs=u10; /采樣頻率/采集卡初始化if( A
43、DCardInit() != 1 ) ssSetErrorStatus(S,"Can't find the DAQCard!"); DAQ1(0x10, 5000, 1024*4 , buffer); /開啟采集,0x10代表通道5 pnum=0;/初始化buf指針位置(4)讀取BUF數(shù)據(jù)和輸出數(shù)據(jù):對simulink的輸出函數(shù)進(jìn)行如下修改static void mdlOutputs(SimStruct *S, int_T tid) int Length=1024*4;/讀取的buffer長度 ReadDaq(5,Length, buffer); /從采集卡讀取bu
44、ffer real_T *y = ssGetOutputPortRealSignal(S,0);/獲取輸出指針 if( pnum >= Length ) pnum=0; /判斷指針是否已滿 *y = bufferpnum;/輸出第pnum個點的值 pnum+;/指針加1(5)退出采集卡:函數(shù)ADCardQuit()是采集dll函數(shù),其作用是退出采集卡。static void mdlTerminate(SimStruct *S) ADCardQuit(); /退出采集卡2.創(chuàng)建圖形界面新建m文件,命名為Mytext.m,代碼如下:Mytext.m文件代碼:clf reset % clear
45、set(gcf,'menubar','none') %無菜單set(gcf,'unit','normalized','position',0.2,0.2,0.5,0.35);%設(shè)置圖形窗大小set(gcf,'defaultuicontrolunits','normalized');%設(shè)置用戶缺省控件單位屬性值str='頻域分析'set(gcf,'name',str,'numbertitle','off'); %書寫圖形窗
46、名h_axes1=axes('position',0.1,0.8,0.55,0.14, 'fontsize',8); %定義軸位框位置title('傳感器輸出波形'); %添加圖形標(biāo)題xlabel('時間(s)'); %定義X坐標(biāo)含義ylabel('電壓(mv)'); %定義Y坐標(biāo)含義grid on; %畫網(wǎng)格線h_axes2=axes('position',0.1,0.55,0.55,0.14,'xlim',0,100,'fontsize',8);title(
47、9;頻域分析圖');xlabel('頻率(Hz)');ylabel('電壓(mv)');grid on;h_axes3=axes('position',0.1,0.3,0.55,0.14,'xlim',0,100,'fontsize',8);title('幅值譜');xlabel('頻率(Hz)');ylabel('電壓(mv)');grid on;h_axes4=axes('position',0.1,0.05,0.55,0.14,'
48、xlim',0,100,'fontsize',8);title('相位譜');xlabel('頻率(Hz)');ylabel('電壓(mv)');grid on;uicontrol('style','frame','position',0.75,0.65,0.08,0.05); %創(chuàng)建用戶控件區(qū)htext1=uicontrol(gcf,'style','text','position',0.765,0.653,0.05,0.04
49、,'fontname','正體','fontsize',13,'string','頻率:'); %添加靜態(tài)文本uicontrol('style','frame','position',0.75,0.75,0.08,0.05); htext2=uicontrol(gcf,'style','text','position',0.765,0.753,0.05,0.04,'fontname','正體
50、9;,'fontsize',13,'string','幅值:');hedit1=uicontrol(gcf,'style','edit','position',0.85,0.65,0.08,0.05); %添加可編輯文本框hedit2=uicontrol(gcf,'style','edit','position',0.85,0.75,0.08,0.05);ht=uicontrol(gcf,'style','toggle'
51、,'string','Grid','position',0.8,0.5,0.1,0.05,'callback','grid'); %制作雙位按鍵hpush1=uicontrol(gcf,'Style','push',.%制作“開始”按鈕 'position',0.75,0.3,0.2,0.14,'fontname','隸書','string','開始','fontsize',20);hpu
52、sh2=uicontrol(gcf,'Style','push',.%制作“停止”按鈕 'position',0.75,0.05,0.2,0.14,'fontname','隸書','string','停止','fontsize',20);set(hpush1,'callback',. 'set_param(''hp'',''SimulationCommand'',''
53、;start''),',. 't=timer(''TimerFcn'',''getdata'',''Period'',1,''ExecutionMode'',''fixedSpacing'',''TasksToExecute'',inf),',.%設(shè)置定時器,運行g(shù)etdata文件,與上面是一行。'pause(2);start(t);',. %暫停2秒并啟動定時器); %“停止”按鍵引起的回調(diào)set(hpush2,'callback','stop(t);set_param(''hp'',''SimulationCommand'',''stop'');');%停止定時器 ,mdl文件停止運行。圖形界面如下圖:2. 編寫信號頻譜分析代碼新建一個m文件,命名為getdata.m,主要實現(xiàn)頻域內(nèi)對信號的功率譜、幅值譜以
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國平紋網(wǎng)數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國仿石桌面數(shù)據(jù)監(jiān)測研究報告
- 2025年消防設(shè)施操作員之消防設(shè)備高級技能題庫練習(xí)試卷B卷附答案
- 質(zhì)檢員基礎(chǔ)知識培訓(xùn)課件
- 2025年大學(xué)生防詐騙知識競賽題庫試題及答案(共60題)
- 企業(yè)人力資源管理系統(tǒng)開發(fā)維護(hù)合同書
- 如何提升英語聽力水平:聽力技巧與素材選擇教學(xué)教案
- 年度金融科技行業(yè)投資研究報告表
- 水暖安裝勞務(wù)合同
- 戶外廣告位租賃經(jīng)營協(xié)議書
- 人教版八年級下冊英語全冊教案完整版教學(xué)設(shè)計含教學(xué)反思
- 煤礦探放水作業(yè)安全技術(shù)實際操作考試標(biāo)準(zhǔn)
- 銀行案件風(fēng)險排查方案
- 2020年中國高爾夫球運動行業(yè)發(fā)展現(xiàn)狀及趨勢分析:消費大眾化、年輕化圖
- 《中華人民共和國職業(yè)分類大典》電子版
- HD7簡明實用操作手冊
- 最終版冷卻塔安裝施工方案
- 徠卡說明書tps1200系列全站儀tps
- 干式變壓器和低壓配電柜日常巡檢書
- 研究性學(xué)習(xí)成果一覽表
- 生產(chǎn)一致性控制計劃
評論
0/150
提交評論