新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于FPGA與單片機的波形發生器設計

        基于FPGA與單片機的波形發生器設計

        作者: 時間:2012-01-07 來源:網絡 收藏

        1 引言

        可編程邏輯器件(PLD)及EDA技術的應用成為電子系統設計的潮流。是一種新興的可編程邏輯器件(PLD),與其它PLD相比,具有更高的密度、更快的工作速度和更大的編程靈活性。以其體積小、功能齊全、價格低廉、可靠性高等方面所具有的獨特優點,長期以來被廣泛的應用在各領域。

        基于的高密度、高速度、現場可編程的能力和強大的數據處理功能,制作了波形發生系統,用于產生頻率為10Hz~20kHz的正弦波,鋸齒波,三角波和四路分別占空比0~100%可調的PWM波。

        2 系統設計

        整體設計由四個部分組成:上位機部分,部分,部分,模擬電路部分。

        波形發生器以單片機(MCS8031)為中心控制單元,由上位機控制界面,波形發生模塊和D/A轉換模塊組成,采用(直接數字頻率合成)技術,將要求的波形數據存儲于FPGA內構建的ROM當中,單片機跟據上位機的命令輸出查表地址等信息至FPGA,FPGA產生相應得波形數據經D/A轉換器輸出。其系統原理框圖如下:

        圖1 系統原理框圖

        2.1 單片機部分

        在設計中采用MCS8031為處理器,選擇P1.0,P1.1作為波形選擇信號,P1.2作為FPGA的復位信號,P2.5作為DACO832的片選端,P0口作為低8位地址和數據線。單片機接收來自上位機的命令信息后將相應的波形設置信息輸出到FPGA,并控制DAC0832的使能。

        單片機接收并處理來自上位機的數據信息流程圖如圖2所示:

        圖2 單片機接收并處理上位機數據流程圖

        2.2 FPGA部分及模擬電路部分

        波形發生采用技術可以很方便地產生各種高質量的波形。技術是從相位概念出發之結合成所需要波形的一種頻率合成技術。以正弦波為例,首先要按照一定的采樣點數將正弦波形一個周期的數據信息存于ROM表中,表中包含著一個周期正弦波的數字幅度信息,每個地址對應正弦波中0到360度范圍內的一個相位點的幅度值,查找表時即是把輸入的地址相位信息映射成正弦波幅度的數字量信號,以驅動D/A轉換電路。DDS方法通過查找表輸出信號的頻率可由下式給出:

        Fout=(x*[Fclk])/Y; Y為2的N次冪;

        其中頻率控制字與輸出信號的頻率成正比,因此可以通過改變尋址的步長來改變輸出信號的頻率,因為在確定了累加器的位寬N和尋址位寬M,以及系統時鐘Fclk后,隨著步長X的增加,在每次累加器循環的一個周期中,輸出的M為查找表的地址個數就會減少,相應輸出一個中期波形的時間也就會減少,輸出信號的頻率相應增加,這就是DDS的方法。

        需要注意的是,隨著步長和輸出頻率的增加,輸出信號的采樣點數會減少,會降低產生波形的精度和平滑度,因此也限制了輸出信號的最高頻率,而且由采樣定理可知,所產生的信號頻率不能超過時鐘頻率的一半,在實際應用中,為了保證信號的輸出質量,輸出的頻率不要高于時鐘頻率的33%,以避免混疊或諧波落入有用輸出頻帶內。

        為了提高所產生的波形頻率,采用高頻率特性的FPGA(ALTERA EPF10K10LC84-4)。后級電路采用有較高的轉換速度的DAC0832作為D/A轉換。

        在FPGA內實現ROM表的資源是有限的,并且ROM表的大小隨著地址位數和數據位數的增加成指數遞增關系,因此在滿足采樣信號性能的前提條件下,如何減少資源的開銷就是一個重要的問題。在實際設計時,充分利用了正弦波信號周期內的對稱性和算術關系來減少ROM表資源的開銷,因此通過一個正弦表的前1/4周期就可以通過相位變換得到其整個波形周期的采樣值,這樣就節省了將近3/4的資源。

        對于PWM波部分,采用分頻器,累加器與比較器結合的方式實現,對于各個部分采用模塊化設計分別實現,并在頂層文件中連接在一起可以方便進行修改,擴展和移植。

        正弦波,三角波,鋸齒波的部分源程序如下:

        p_rom:process(clk,reset)

        begin

        if clk'event and clk='1' then

        clk_rom=clk_rom + frq_data;

        case p1 is

        when "00"=>rom_address=clk_rom( 19 downto 13)+"000000000";

        when "01"=>rom_address=clk_rom( 19 downto 13)+"010000000";

        when "10"=>rom_address=clk_rom( 19 downto 13)+"011111111";

        when others=>null;

        end case;

        end if;

        end process p_rom;

        2.3 上位機部分

        利用Windows系統中提供的串行通訊功能完備的ActiveX控件即MSComm控件實現與單片機的通信。MSComm控件具有編程容易實現,簡捷方便等優點,但僅在對話框中使用。根據波形發生器的特點和要求,MSComm控件可以完全實現要求。

        像其他控件一樣,通信空間也是用一系列的屬性和用戶接口,控件提供了許多屬性,大部分屬性僅和Modem有關,下面將常用的屬性做一下簡要說明:

        CommPort:設置并返回通信口號,缺省值為COM1。

        Settings:設置并返回波特率、奇偶校驗、數據位、停止位的字符串。其中波特率的范圍為300b/s到19200b/s。

        PortOpcn:設置并返回通信口的狀態,同時用來打開和關閉通信口。

        InputLen:決定每次Input讀入的字符個數,缺省為0,表示讀取接收緩沖區的全部內容。

        Input:讀入并清除接收緩沖區的字符。

        InBuferCount:返回接收緩沖區已接收的字符數,通過置0可清除接收緩沖區。

        -!wuyou dianzi kaifawang-->

        Output:將發送的字符串或數組寫到發送緩沖區。

        InputMode:定義Inpput屬性獲得數據的方式。

        Rthreshold:設置、返回在通信控件置ComEvRecieve并激發OnComm事件前要接收的字符數。

        SThreshold:設置、返回通信控件置ComEvSend并激發OnComm事件前發送緩沖區中的最少字符數。

        另外,由于在VC界面中出現的是10到20k的整型數據,因此需要將此頻率數據轉換成16位的頻率控制字送給單片機,轉換程序如下:

        void CWaveDlg::CalculateFreq(unsigned int unFreq)

        {

        double m;

        m=unFreq*0.0001024;

        m=m*1024;

        CommandMCU.uchLowData= (unsigned char) m%256;

        CommandMCU.uchHighData=m/256;

        return;

        }

        3 結束語

        本文作者創新點:采用了直接數字頻率合成(DDS)技術,經過仿真,電路測試,輸出波形上完全達到了設計的要求。與以往的采取波形存儲和波形復現方式的波形發生器相比,基于DDS的波形發生器可以很方便的實現頻率的調制功能,產生的波形可以達到很高的頻率分辨率,輸出頻率的轉換速度快,而且在頻率轉換時,DDS輸出波形的相位是連續的。

        參考文獻:

        1.王鳳臣,李慶瑞等.基于DDS的波形發生器在HIRFL-CSR電源控制系統中的應用[J].微計算機信息,2006,22:3-5

        2.段傳華.直接數字頻率合成器的原理及應用[J].電訊技術,1995年10月,35(5).

        3.侯博亨等.硬件描述語言與數字邏輯電路設計.成都電子科技大學出版社.1997.

        4.徐志軍等.CPLD/FPGA的開發與應用.北京:電子工業出版社.2002

        分頻器相關文章:分頻器原理


        關鍵詞: FPGA 單片機 VHDL DDS

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 潮安县| 泗水县| 伊金霍洛旗| 鄂伦春自治旗| 驻马店市| 林周县| 织金县| 甘南县| 重庆市| 繁峙县| 闵行区| 杨浦区| 五莲县| 福建省| 黄梅县| 襄樊市| 许昌县| 海阳市| 铜鼓县| 三门县| 保德县| 平顺县| 噶尔县| 沐川县| 广州市| 永丰县| 定襄县| 镇康县| 广饶县| 庄浪县| 中牟县| 台中市| 南漳县| 银川市| 托克托县| 永顺县| 潞西市| 藁城市| 淮安市| 博兴县| 舞钢市|