接口電路仿真的算法分析及實(shí)現(xiàn)
1 引言
系統(tǒng)仿真是近30年才發(fā)展起來的一門新興學(xué)科,它通過對所研究系統(tǒng)的認(rèn)識和了解,抽取其中的基本要素,建立與現(xiàn)實(shí)系統(tǒng)相對應(yīng)的仿真模型,并通過系統(tǒng)模型實(shí)驗(yàn)去研究一個(gè)已經(jīng)存在的或者正在設(shè)計(jì)的系統(tǒng)的過程。Matlab是一種功能強(qiáng)大的的仿真工具,它包括眾多的功能各異的工具箱、以矩陣和數(shù)組為基本單位的編程語言,為數(shù)學(xué)計(jì)算和試驗(yàn)數(shù)據(jù)分析提供了極大的便利。Siumlink是MATLAB的一個(gè)共生產(chǎn)品,包括豐富的模塊資源和工具箱資源,具有相對獨(dú)立的功能和使用方法,提供了建模、分析和仿真各種動態(tài)系統(tǒng)的交互環(huán)境,建立仿真模型后可以很容易地通過改變仿真參數(shù),得到不同參數(shù)的仿真結(jié)果。結(jié)合MATLAB 和Simulin的特點(diǎn),可以實(shí)現(xiàn)各種電路的仿真。
在構(gòu)建仿真電路時(shí),有些可以直接調(diào)用Simulink模塊,有些用Simulink模塊難以實(shí)現(xiàn)的,可以通過編寫Simulink 支持的S函數(shù)來完成。對于比較復(fù)雜的仿真電路,可以采用Simulink模塊調(diào)用和編程混合的方式實(shí)現(xiàn)。本文所實(shí)現(xiàn)的A/D轉(zhuǎn)換電路的仿真就是采用 Simulink模塊調(diào)用和MATLAB編程混合的方式。
2 A/D轉(zhuǎn)換電路的仿真
2.1 A/D轉(zhuǎn)換電路的的仿真
模/數(shù)(A/D)轉(zhuǎn)換電路的任務(wù)是將連續(xù)變換的模擬信號轉(zhuǎn)換為離散的數(shù)字信號,以便于數(shù)字系統(tǒng)進(jìn)行處理,模/數(shù)轉(zhuǎn)換一般要完成采樣、量化和編碼等幾個(gè)過程。
采樣是在連續(xù)變化的模擬量上按一定的規(guī)律(周期地)取出其中的某一些瞬時(shí)值來代表這個(gè)連續(xù)的模擬量。為了保證采樣信號不丟失的信息,即采樣后的離散信號能代替或能恢復(fù)原來的連續(xù)信號,采樣必須遵循采樣定理,即對信號采樣時(shí),采樣頻率必須大于或等于信號最高頻率的兩倍。
量化就是將f(nT)的所有值映射到數(shù)字量所表示的狀態(tài)上。實(shí)際上,在量化過程中是將樣本的幅值范圍分為若干個(gè)量化層,每一個(gè)量化層對應(yīng)一個(gè)量化輸出,所有落于該量化層內(nèi)的樣本都統(tǒng)一取該量化輸出值。量化層的數(shù)目與量化后編碼的位數(shù)有關(guān)。
2.1.1 采樣功能的實(shí)現(xiàn)
A/D轉(zhuǎn)換就是一個(gè)量化的過程,它把采樣后的模擬信號轉(zhuǎn)換成數(shù)字量。在實(shí)際工作中,A/D轉(zhuǎn)換首先要選定一個(gè)合適的編碼方案,然后根據(jù)編碼的位數(shù)確定量化層,從而確定采樣頻率。實(shí)現(xiàn)仿真電路的關(guān)鍵是采樣模塊的構(gòu)建,由于Simulink的模塊難以構(gòu)建采樣功能,采樣模塊主要是通過編寫Simulink支持的S函數(shù)實(shí)現(xiàn)的。S函數(shù)有固定的程序格式,S函數(shù)的實(shí)現(xiàn)包括初始化、連續(xù)狀態(tài)微分、計(jì)算輸出和仿真終止。可以用MATLAB語言可以編寫S函數(shù),也可以使用C 語言、C++和Fortran 等語言編寫。S函數(shù)使用一種特殊調(diào)用規(guī)則來實(shí)現(xiàn)用戶與Simulink的內(nèi)部解法器進(jìn)行交互,并且這種交互可以適用于不同性質(zhì)的系統(tǒng)。S函數(shù)模塊存放在 FunctionsTables模塊庫中,通過此模塊可以創(chuàng)建包含S函數(shù)的Simulink模塊。S函數(shù)文件名區(qū)域要填寫S函數(shù)的文件名。S函數(shù)參數(shù)區(qū)填入S函數(shù)所需要的參數(shù)。
本系統(tǒng)假定輸入的模擬信號周期為2,編寫了4個(gè)S函數(shù),分別為sf_ad4、sf_ad8、sf_ad16、sf_ad32,對應(yīng)的采樣時(shí)間分別為 0.5、0.25、0.125、0.0625,即采樣頻率分別是信號最高頻率的四倍、八倍、十六倍和三十二倍。下面以sf_ad32函數(shù)為例,說明其算法及實(shí)現(xiàn)程序。
首先,設(shè)模擬信號是周期為2的Sine波,且用連續(xù)的時(shí)間函數(shù)f(t)表示,采樣就是周期地取f(t)的瞬時(shí)值。根據(jù)采樣定理,對每個(gè)周期的模擬信號采樣32次,則采樣的時(shí)間就為0.0625(2/32)的倍數(shù)。完成一個(gè)周期的采樣時(shí)間為0.0625*n(0=32,n 為整數(shù)),延時(shí)為0。采樣后將相應(yīng)值輸出,但信號在量值上仍然是連續(xù)的,需將f(nT)的所有值映射到數(shù)字量所表示的狀態(tài)上,這種過程為量化。在量化過程中是將樣本的幅值范圍分為若干個(gè)量化層,每一個(gè)量化層對應(yīng)一個(gè)量化輸出,所有落在該量化層內(nèi)的樣本都統(tǒng)一取該量化輸出值。本實(shí)例中,采用4位編碼,則有 24=16個(gè)量化層。在編碼過程中采用從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;
評論