1 引言
系統(tǒng)仿真" title="仿真">仿真是近30年才發(fā)展起來的一門新興學(xué)科,它通過對所研究系統(tǒng)的認(rèn)識和了解,,抽取其中的基本要素,,建立與現(xiàn)實系統(tǒng)相對應(yīng)的仿真模型,并通過系統(tǒng)模型實驗去研究一個已經(jīng)存在的或者正在設(shè)計的系統(tǒng)的過程,。Matlab是一種功能強大的的仿真工具,,它包括眾多的功能各異的工具箱、以矩陣和數(shù)組為基本單位的編程語言,為數(shù)學(xué)計算和試驗數(shù)據(jù)分析提供了極大的便利,。Siumlink是MATLAB的一個共生產(chǎn)品,,包括豐富的模塊資源和工具箱資源,具有相對獨立的功能和使用方法,,提供了建模,、分析和仿真各種動態(tài)系統(tǒng)的交互環(huán)境,建立仿真模型后可以很容易地通過改變仿真參數(shù),,得到不同參數(shù)的仿真結(jié)果,。結(jié)合MATLAB 和Simulin的特點,,可以實現(xiàn)各種電路的仿真,。
在構(gòu)建仿真電路時,有些可以直接調(diào)用Simulink模塊,,有些用Simulink模塊難以實現(xiàn)的,,可以通過編寫Simulink 支持的S函數(shù)來完成。對于比較復(fù)雜的仿真電路,,可以采用Simulink模塊調(diào)用和編程混合的方式實現(xiàn),。本文所實現(xiàn)的A/D" title="A/D">A/D轉(zhuǎn)換電路" title="轉(zhuǎn)換電路">轉(zhuǎn)換電路的仿真就是采用 Simulink模塊調(diào)用和MATLAB編程混合的方式。
2 A/D轉(zhuǎn)換電路的仿真
2.1A/D轉(zhuǎn)換電路的的仿真
模/數(shù)(A/D)轉(zhuǎn)換電路的任務(wù)是將連續(xù)變換的模擬信號轉(zhuǎn)換為離散的數(shù)字信號,,以便于數(shù)字系統(tǒng)進行處理,,模/數(shù)轉(zhuǎn)換一般要完成采樣、量化和編碼等幾個過程,。
采樣是在連續(xù)變化的模擬量上按一定的規(guī)律(周期地)取出其中的某一些瞬時值來代表這個連續(xù)的模擬量,。為了保證采樣信號不丟失的信息,即采樣后的離散信號能代替或能恢復(fù)原來的連續(xù)信號,,采樣必須遵循采樣定理,,即對信號采樣時,采樣頻率必須大于或等于信號最高頻率的兩倍,。
量化就是將f(nT)的所有值映射到數(shù)字量所表示的狀態(tài)上,。實際上,在量化過程中是將樣本的幅值范圍分為若干個量化層,,每一個量化層對應(yīng)一個量化輸出,,所有落于該量化層內(nèi)的樣本都統(tǒng)一取該量化輸出值。量化層的數(shù)目與量化后編碼的位數(shù)有關(guān),。
2.1.1 采樣功能的實現(xiàn)
A/D轉(zhuǎn)換就是一個量化的過程,,它把采樣后的模擬信號轉(zhuǎn)換成數(shù)字量。在實際工作中,,A/D轉(zhuǎn)換首先要選定一個合適的編碼方案,,然后根據(jù)編碼的位數(shù)確定量化層,從而確定采樣頻率。實現(xiàn)仿真電路的關(guān)鍵是采樣模塊的構(gòu)建,,由于Simulink的模塊難以構(gòu)建采樣功能,,采樣模塊主要是通過編寫Simulink支持的S函數(shù)實現(xiàn)的。S函數(shù)有固定的程序格式,,S函數(shù)的實現(xiàn)包括初始化,、連續(xù)狀態(tài)微分、計算輸出和仿真終止,??梢杂肕ATLAB語言可以編寫S函數(shù),也可以使用C 語言,、C++和Fortran 等語言編寫,。S函數(shù)使用一種特殊調(diào)用規(guī)則來實現(xiàn)用戶與Simulink的內(nèi)部解法器進行交互,并且這種交互可以適用于不同性質(zhì)的系統(tǒng),。S函數(shù)模塊存放在 Functions&Tables模塊庫中,通過此模塊可以創(chuàng)建包含S函數(shù)的Simulink模塊,。S函數(shù)文件名區(qū)域要填寫S函數(shù)的文件名。S函數(shù)參數(shù)區(qū)填入S函數(shù)所需要的參數(shù),。
本系統(tǒng)假定輸入的模擬信號周期為2,,編寫了4個S函數(shù),分別為sf_ad4,、sf_ad8,、sf_ad16、sf_ad32,,對應(yīng)的采樣時間分別為 0.5,、0.25、0.125,、0.0625,,即采樣頻率分別是信號最高頻率的四倍、八倍,、十六倍和三十二倍,。下面以sf_ad32函數(shù)為例,說明其算法及實現(xiàn)程序,。
首先,,設(shè)模擬信號是周期為2的Sine波,且用連續(xù)的時間函數(shù)f(t)表示,,采樣就是周期地取f(t)的瞬時值,。根據(jù)采樣定理,,對每個周期的模擬信號采樣32次,,則采樣的時間就為0.0625(2/32)的倍數(shù),。完成一個周期的采樣時間為0.0625*n(0<=32,n 為整數(shù)),延時為0,。采樣后將相應(yīng)值輸出,,但信號在量值上仍然是連續(xù)的,,需將f(nT)的所有值映射到數(shù)字量所表示的狀態(tài)上,,這種過程為量化。在量化過程中是將樣本的幅值范圍分為若干個量化層,,每一個量化層對應(yīng)一個量化輸出,,所有落在該量化層內(nèi)的樣本都統(tǒng)一取該量化輸出值。本實例中,,采用4位編碼,,則有 24=16個量化層。在編碼過程中采用從1000到0111的編碼,,來輸出相應(yīng)的量化值,。其源代碼如下:
function[sys,x0,str,ts]=sf_ad32(t,x,u,flag)
switch flag,
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
………
case 9,
sys=[];
otherwise
error([unhandle flag=,num2str(flag)]);
end
function[sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=0;
sizes.NumOutputs=1;
sizes.NumInputs=1;
sizes.DiRFeedthrough=1;
sizes.NumSampleTimes=32;
sys=simsizes(sizes);
x0=[];
str=[];
ts=[
0.0625 0
0.125 0
0.0625*3 0
0.25 0
………
0.0625*31 0
2 0 ];
function sys="mdlUpdate"(t,x,u)
sys=x;
function sys="mdlOutput"(t,x,u)
sys=u;
其中,sys依照flag的值返回不同的結(jié)果,x0為初始狀態(tài)值,,str用于設(shè)置輸出矢量為一個空矩陣,,ts采用兩列的矩陣來設(shè)置采樣時間和延遲,,sf_ad4是S函數(shù)的函數(shù)名,,t為目前仿真中的實現(xiàn)時間,x為狀態(tài)矢量,可為空,,u為輸入矢量,,flag為S函數(shù)行為標(biāo)示。
sf_ad8,、sf_ad16,、sf_ad32的S函數(shù)類似于sf_ad4,不同的就是采樣時間的個數(shù)和ts的采樣時間和延遲矩陣,。調(diào)用S函數(shù)時首先將所需的S函數(shù)模塊拖入調(diào)用模塊(Simulink->User-Defined Functions->S-Function)并設(shè)置S函數(shù)的參數(shù),,參數(shù)設(shè)置對話框如圖1所示。
|
圖1 S函數(shù)的調(diào)用 |
2.1.2 A/D轉(zhuǎn)換仿真電路的構(gòu)建
A/D轉(zhuǎn)換仿真電路由“模擬信號發(fā)生器”模塊,、“選擇采樣函數(shù)1~4”模塊,、“結(jié)果顯示”模塊和“A/D轉(zhuǎn)換電路”子系統(tǒng)組成,如圖2所示,。
“選擇采樣函數(shù)1~4”模塊是選擇采樣頻率,,構(gòu)建過程為:在Matlab的命令窗口中輸入命令Simulink打開Simnlink Library Browser子窗口,選中左邊目錄欄中的Simulink庫后單擊子目錄Sources,,右邊的子窗口顯示相應(yīng)的Sources庫中的模塊集,,選中 Constant常數(shù)模塊并拖入所建的仿真模塊中(簡單表述為Simulink->Sources->Constant,后文同此),,雙擊此模塊出現(xiàn)參數(shù)設(shè)置框,,輸入所要選擇函數(shù)對應(yīng)的編號1~4。“模擬信號發(fā)生器”模塊和“結(jié)果顯示”模塊通過直接調(diào)用模擬信號發(fā)生器和示波器構(gòu)建。“A/D轉(zhuǎn)換電路”子系統(tǒng)內(nèi)部主要是由1個選擇開關(guān)和四個S函數(shù)組成,。“采樣電路”子系統(tǒng)的構(gòu)建首先是調(diào)用一般的子系統(tǒng)(Simulink->Ports&Subsystems->Subsystem),,然后雙擊此子系統(tǒng),在子系統(tǒng)的內(nèi)部生成1個選擇開關(guān),,拖入四個S函數(shù),,把選擇開關(guān)與四個S函數(shù)相連。
|
圖2 “A/D轉(zhuǎn)換”仿真系統(tǒng)的主界面 |
2.1.3 A/D轉(zhuǎn)換電路的仿真結(jié)果
運行仿真電路時,,由“模擬信號發(fā)生器”模塊產(chǎn)生各種模擬輸入信號,,通過“選擇采樣函數(shù)1~4”模塊選定采樣頻率,結(jié)果在“結(jié)果顯示”模塊顯示,。
選擇采樣函數(shù)為4,,則A/D轉(zhuǎn)換的采樣時間為0.0625,選定輸入信號分別為正弦波和隨機波,。運行此仿真系統(tǒng)后的結(jié)果如圖3,、圖4所示。
|
圖3 輸入信號為正弦波的運行結(jié)果 圖4 輸入信號為隨機波的運行結(jié)果 |
3 結(jié)束語
本文作者創(chuàng)新點:由于Simulink的模塊庫中,,缺少各種可編程接口芯片模塊,,將Simulink 和MATLAB編程混合應(yīng)用到A/D、D/A轉(zhuǎn)換電路的仿真,,結(jié)果表明仿真效果良好,。這種方法可以應(yīng)用于多種控制電路、通信電路等系統(tǒng)的仿真中,。仿真電路的工作過程類似于真實的硬件,,而且更便宜、更靈活,,也很容易進行恢復(fù),,避免了操作錯誤造成的損失,按每個單位一年減少五千元計算,,具有明顯的經(jīng)濟效益和社會效益,。