新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > 接口電路仿真的算法分析及實現

        接口電路仿真的算法分析及實現

        作者: 時間:2009-03-10 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/192139.htm

          1 引言

          系統是近30年才發展起來的一門新興學科,它通過對所研究系統的認識和了解,抽取其中的基本要素,建立與現實系統相對應的模型,并通過系統模型實驗去研究一個已經存在的或者正在設計的系統的過程。Matlab是一種功能強大的的工具,它包括眾多的功能各異的工具箱、以矩陣和數組為基本單位的編程語言,為數學計算和試驗數據分析提供了極大的便利。Siumlink是MATLAB的一個共生產品,包括豐富的模塊資源和工具箱資源,具有相對獨立的功能和使用方法,提供了建模、分析和仿真各種動態系統的交互環境,建立仿真模型后可以很容易地通過改變仿真參數,得到不同參數的仿真結果。結合MATLAB 和Simulin的特點,可以實現各種電路的仿真。

          在構建仿真電路時,有些可以直接調用Simulink模塊,有些用Simulink模塊難以實現的,可以通過編寫Simulink 支持的S函數來完成。對于比較復雜的仿真電路,可以采用Simulink模塊調用和編程混合的方式實現。本文所實現的A/D轉換電路的仿真就是采用 Simulink模塊調用和MATLAB編程混合的方式。

          2 A/D轉換電路的仿真

          2.1 A/D轉換電路的的仿真

          模/數(A/D)轉換電路的任務是將連續變換的模擬信號轉換為離散的數字信號,以便于數字系統進行處理,模/數轉換一般要完成采樣、量化和編碼等幾個過程。

          采樣是在連續變化的模擬量上按一定的規律(周期地)取出其中的某一些瞬時值來代表這個連續的模擬量。為了保證采樣信號不丟失的信息,即采樣后的離散信號能代替或能恢復原來的連續信號,采樣必須遵循采樣定理,即對信號采樣時,采樣頻率必須大于或等于信號最高頻率的兩倍。

          量化就是將f(nT)的所有值映射到數字量所表示的狀態上。實際上,在量化過程中是將樣本的幅值范圍分為若干個量化層,每一個量化層對應一個量化輸出,所有落于該量化層內的樣本都統一取該量化輸出值。量化層的數目與量化后編碼的位數有關。

          2.1.1 采樣功能的實現

          A/D轉換就是一個量化的過程,它把采樣后的模擬信號轉換成數字量。在實際工作中,A/D轉換首先要選定一個合適的編碼方案,然后根據編碼的位數確定量化層,從而確定采樣頻率。實現仿真電路的關鍵是采樣模塊的構建,由于Simulink的模塊難以構建采樣功能,采樣模塊主要是通過編寫Simulink支持的S函數實現的。S函數有固定的程序格式,S函數的實現包括初始化、連續狀態微分、計算輸出和仿真終止。可以用MATLAB語言可以編寫S函數,也可以使用C 語言、C++和Fortran 等語言編寫。S函數使用一種特殊調用規則來實現用戶與Simulink的內部解法器進行交互,并且這種交互可以適用于不同性質的系統。S函數模塊存放在 FunctionsTables模塊庫中,通過此模塊可以創建包含S函數的Simulink模塊。S函數文件名區域要填寫S函數的文件名。S函數參數區填入S函數所需要的參數。

          本系統假定輸入的模擬信號周期為2,編寫了4個S函數,分別為sf_ad4、sf_ad8、sf_ad16、sf_ad32,對應的采樣時間分別為 0.5、0.25、0.125、0.0625,即采樣頻率分別是信號最高頻率的四倍、八倍、十六倍和三十二倍。下面以sf_ad32函數為例,說明其算法及實現程序。

          首先,設模擬信號是周期為2的Sine波,且用連續的時間函數f(t)表示,采樣就是周期地取f(t)的瞬時值。根據采樣定理,對每個周期的模擬信號采樣32次,則采樣的時間就為0.0625(2/32)的倍數。完成一個周期的采樣時間為0.0625*n(0=32,n 為整數),延時為0。采樣后將相應值輸出,但信號在量值上仍然是連續的,需將f(nT)的所有值映射到數字量所表示的狀態上,這種過程為量化。在量化過程中是將樣本的幅值范圍分為若干個量化層,每一個量化層對應一個量化輸出,所有落在該量化層內的樣本都統一取該量化輸出值。本實例中,采用4位編碼,則有 24=16個量化層。在編碼過程中采用從1000到0111的編碼,來輸出相應的量化值。其源代碼如下:

        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;


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 临泽县| 阜新市| 杭锦后旗| 巴南区| 贡觉县| 天全县| 闽侯县| 介休市| 罗甸县| 南丰县| 楚雄市| 巴彦淖尔市| 娄烦县| 昌乐县| 安乡县| 巧家县| 楚雄市| 白朗县| 都兰县| 商洛市| 凤冈县| 平凉市| 若尔盖县| 桐柏县| 舟山市| 阳曲县| 榆中县| 汉寿县| 河曲县| 六盘水市| 沂南县| 沈阳市| 贞丰县| 牟定县| 开鲁县| 浦县| 通河县| 麻城市| 泽普县| 东辽县| 巩义市|