tag 标签: dac0832

相关博文
  • 热度 28
    2013-12-2 10:21
    5933 次阅读|
    7 个评论
    利用FPGA+DAC0832制作的信号源 制作信号源有多种方法,但是由于接口数量以及手头资源的因素,我选择了用FPGA来产生一个信号源,算是自己正式开始了FPGA逻辑设计吧。本文介绍的就是我自己利用cyclone系列的FPGA制作的信号源,信号源的设计包括以下几个部分: 1、整个设计框架 2、各个小模块的实现(可调分频模块,三角波产生模块(含rom的定制,需先生成.mif文件),正弦波产生(同上)模块,方波产生模块,锯齿波产生模块,具体生成方法同上,4选1多路选择器模块,4路输入及输出均为8位,DAC0832控制器) 3、外围电路的设计(包括频率控制,加 减 设置功能,以及直接设置多少频率,显示模块(待设计),DAC0832模块) 4、仿真结果 在每一个设计开始的时候,首先要进行的是整体框架的划分,即系统有哪些部分组成,模块与模块之间应该怎样互联,明确这些之后才是具体的底层实现。 一、整体设计的框架图 系统时钟是FPGA正常工作所需的时钟(选取的是50MHz),时钟分频模块用于将系统时钟分频,它决定了信号波形的周期,通过控制它可以调整信号发生器产生的信号的周期(这里先介绍含有两个固定分频系数的分频器,如何产生可调周期的信号等下次详述)。接着是四个波形发生器,它们都需要先定制rom的初始化数据,然后再利用初始化的存储数据产生rom,利用QUARTUS Ⅱ产生各模块。4选1多路选择器,用于选择输出的波形,DAC0832控制器用于产生外部硬件的控制信号。接下来的是DAC0832的外部电路,用于产生最终输出的模拟信号。 在以上各模块中,难点是如何产生波形发生器,以及如何进行调频和调幅。(在本设计中只是用到了两个固定的周期,而且没有涉及到调幅,这些都将在下一篇中进行详述介绍)。 二、各小模块的具体实现 1、时钟分频模块 本部分设计的周期是6.25MHz和12.5MHz,对系统时钟进行8分频和4分频即可,分频系数分别为8和4。 具体实现电路原理图如下,rst信号用于复位,k4用于选择频率选择,当K4为高电平时输出频率为6.25MHz,为低电平时是12.5MHz。clkin是系统时钟为50MHz。   图1、分频模块 具体的FPGA实现代码如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all;   entity divide_8 is    port(        rst : in std_logic;        clkin: in std_logic;        k4: in std_logic;        clkout: out std_logic    ); end entity;   architecture divide of divide_8 is signal n :integer range 0 to 7; signal clk: std_logic; begin    devide:process(clkin,rst)    begin        if rst='0' then                         --reset configration           clkout='0';           n=0;           clk='0';        elsif rising_edge(clkin) then           if k4='1' then               if n=7 then                     --6.25MHz                  n=0;                  clk= not clk;               else                  n=n+1;               end if;           else               if n=3 then                     --12.5MHz                  n=0;                  clk=not clk;               else                  n=n+1;               end if;           end if;        end if;        clkout=clk;    end process; end architecture;     2、波形发生模块 本模块分为正弦波发生器模块,三角波发生器模块,方波发生器模块,锯齿波发生模块,分别用于产生对应的波形数据。 产生流程如下:1、建立存储器初始化数据表(用于存储波形数据)。2、利用新建立的初始化数据表.mif文件定制对应的rom,生成对应的波形发生器。 具体步骤如下: 2.1新建一个.mif文件。File→new→memory initialization file→ok 填入的字数为128,字节位数为8(字),这用于确定建立的数据表的大小。 图2、新建的.mif文件 在里面填入波形初始化数据即可,由于采用的是8位的数模转换器,转换精度为8位,最大值为255,对应的如果参考电压为5V的话,精度即为19.6mV。  定制rom过程如下: 利用megawizard plug-in manager定制正弦信号数据ROM宏功能块,并将上面的波形数据加载于此ROM中。 选择菜单tools—megawizard plug-in manager命令,在出现的对话框中选择create a new custom,单击next,产生图3所示对话框,如图设置                     图3. LPM宏功能模块设定 在左栏选择memory compiler项下的ROM:1-PORT,再选择器件和VHDL语言方式,输入ROM文件存放的路径和文件名。单击next出现图4对话框,按图中设置 图4. 选择控制线、地址线和数据线 注意需要将上面设置框中的64改选为128,产生7位地址线,单击next,按图5所示设置                    图5. 选择地址锁存信号inclock 单击next,按图6所示设置           图6. 调入ROM初始化数据文件并选择在系统读写功能 在上面的窗口中,点击browse选择工程下面的之前建立的sinwave.mif初始化数据文件,单击finish按钮完成ROM定制。将生成的sinwave.vhd文件加入工程中。 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;   entity rom_out is port(clk:in std_logic;     dout:out std_logic_vector(7 downto 0)); end rom_out;   architecture dacc of rom_out is component sinwave                                    port(address:in std_logic_vector(6 downto 0);     clock:in std_logic;     q:out std_logic_vector(7 downto 0)); end component; signal q1:std_logic_vector(6 downto 0);                 --generate --address signal,address rise by 1 along with clk's rising_edge begin process(clk) begin if clk'event and clk='1' then q1=q1+1; end if; end process; u1:sinwave port map(address=q1,q=dout,clock=clk);    --call --sinwave.mif file end dacc; 生成原理图文件:file- Create/Update-create symbol files for current file即可生成。如图7所示: 图7、正弦波发生器 其余三种波形发生器的生成方法与正弦波类似,这里就不再赘述,下面只将三角波、方波、锯齿波的初始化数据表和波形发生器顶层设计列出。 2.2三角波生成器 数据表如图8所示(这些数据都是可以自己计算的,方法是在对应的函数图形上取点,只取纵坐标上的点,并将其存入数据表即可),   图8、三角波数据 三角波发生器顶层设计 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;   entity tri_angle_out is    port(        clk: in std_logic;        dout: out std_logic_vector(7 downto 0)    ); end entity;   architecture transmit of tri_angle_out is    component tri_angle                                                                                           --tri_angle rom claim        port(           address: in std_logic_vector(6 downto 0);           clock: in std_logic;           q: out std_logic_vector(7 downto 0)        );    end component; signal q1 : std_logic_vector(6 downto 0);   begin    process(clk)    begin        if(rising_edge(clk)) then           q1=q1+1;        end if;    end process;    u1: tri_angle port map(clock=clk,address=q1,q=dout);            --call tri_angle.vhd file end architecture; 生成原理图文件,如图9所示 图9、三角波发生器原理图 2.3锯齿波发生器 波形数据如图10所示:此处只选取了64个数据,(这在数据rom定制中可以修改) 图10、锯齿波发生器数据 锯齿波发生器的顶层设计 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;   entity sawtooth_out is    port(        clk: in std_logic;        dout: out std_logic_vector(7 downto 0)    ); end entity;   architecture transmit of sawtooth_out is    component sawtooth        port(           address: in std_logic_vector(5 downto 0);           clock: in std_logic;           q: out std_logic_vector(7 downto 0)        );    end component; signal q1 : std_logic_vector(5 downto 0);--由于是64个数据,所以此--处只有5位地址线     begin    process(clk)    begin        if(rising_edge(clk)) then           q1=q1+1;        end if;    end process;    u1: sawtooth port map(clock=clk,address=q1,q=dout); end architecture; 原理图符号生成如图11所示: 图11锯齿波发生器原理图符号 2.4方波发生器模块 数据表如图12所示: 图12、方波发生器数据 方波发生器顶层设计: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;   entity fangbo_out is    port(        clk: in std_logic;        dout: out std_logic_vector(7 downto 0)    ); end entity;   architecture transmit of fangbo_out is    component fangbo        port(           address: in std_logic_vector(6 downto 0);           clock: in std_logic;            q: out std_logic_vector(7 downto 0)        );    end component; signal q1 : std_logic_vector(6 downto 0);   begin    process(clk)    begin        if(rising_edge(clk)) then           q1=q1+1;        end if;    end process;    u1: fangbo port map(clock=clk,address=q1,q=dout); end architecture; 方波发生器的原理图13所示: 图13、方波发生器原理图 注:在以上的顶层设计中,只是相对于定制的rom模块来说是顶层设计,并不是整个设计的顶层设计,每一个发生器的顶层设计中均需要调用已生成的IP核,即rom模块,这就需要先进行被调用模块的声明,然后还需要对其进行例化才能正确调用。 三、4选1多路选择器的设计 4选1多路选择器由4路8输入端及两条选择线控制,输出为1路8输出信号。当选择输入信号sel与输出的对应关系见具体设计。 具体实现如下所示: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;   entity mux4_1 is    port(        rst: in std_logic;        din4,din3,din2,din1: in std_logic_vector(7 downto 0);        sel: in std_logic_vector(1 downto 0);        q: out std_logic_vector(7 downto 0)    ); end entity; architecture sel of mux4_1 is begin    process(sel,din4,din3,din2,din1,rst)    begin        if rst='0' then           q="00000000";                     --复位        else           case sel is                        --输入选择控制               when "00"= q=din1;               when "01"= q=din2;               when "10"= q=din3;               when "11"= q=din4;               when others= q=din1;           end case;        end if;    end process; end architecture; 生成的原理图文件如图14所示: 图14、 4选1多路选择器 四、DAC0832外部电路的设计:如图15所示:DAC0832的具体使用介绍网上已有很多资料介绍,本设计不再单独列出,可参照网上。本设计的DAC0832的引脚图如下所示: 图15、DAC0832的引脚图 DI0~DI7:数据输入线,TLL电平。 ILE:数据锁存允许控制信号输入线,高电平有效。 CS:片选信号输入线,低电平有效。 WR1:为输入寄存器的写选通信号。 XFER:数据传送控制信号输入线,低电平有效。 WR2:为DAC寄存器写选通输入线。 Iout1:电流输出线。当输入全为1时Iout1最大。 Iout2: 电流输出线。其值与Iout1之和为一常数。 Rfb:反馈信号输入线,芯片内部有反馈电阻. Vcc:电源输入线  (+5v~+15v) 。 Vref:基准电压输入线  (-10v~+10v) 。 AGND:模拟地,摸拟信号和基准电源的参考地.。 DGND:数字地,两种地线在基准电源处共地比较好。 D/A转换结果采用电流形式输出。若需要相应的模拟电压信号,可通过一个高输入阻抗的线性运算放大器实现。运放的反馈电阻可通过RFB端引用片内固有电阻,也可外接。 控制时序如图16所示: 图16、DAC0832的控制时序图 具体设计如下所示: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all;   entity DAC0832 is    port(din     :in std_logic_vector(7 downto 0);        --data input        rst     :in std_logic;        cs      :out std_logic;                          --控制信号cs        wr1     :out std_logic;                          --控制信号wr1        dout:out std_logic_vector(7 downto 0)        --波形数据输出        );         end DAC0832;  architecture behav of DAC0832 is begin     process(rst)     begin        if rst='0' then            cs='1';            wr1='1';            dout="00000000";        else            cs='0';            wr1='0';            dout=din;                   --cs、wr1赋值;波形数据输出;        end if;     end process; end behav; 注:以上设计中没有涉及到的控制引脚信号,已利用外部硬件对应的连到地或电源线上了。 具体生成的原理图符号如图16所示: 图16、DAC0832控制模块原理图文件 将以上所生成的各部分按对应关系连接在顶层文件中,即构成了整个设计,具体如下(图17)可放大     六、仿真结果如下所示: 6.25MHz的正弦波 12.5 MHz的正弦波   6.25 MHz的方波   12.5 MHz的方波 6.25 MHz的三角波   12.5 MHz的三角波        6.25 MHz的锯齿波 12.5 MHz的锯齿波    
相关资源
  • 所需E币: 2
    时间: 2023-5-4 14:00
    大小: 906.02KB
    上传者: 木头1233
    基于AT89C51单片机用DAC0832生成锯齿波Proteus仿真及程序
  • 所需E币: 1
    时间: 2020-12-18 17:35
    大小: 1008KB
    上传者: zendy_731593397
    DAC0832规格说明书
  • 所需E币: 1
    时间: 2020-12-20 21:35
    大小: 666KB
    上传者: zendy_731593397
    典型DA转换DAC0832芯片
  • 所需E币: 0
    时间: 2020-9-18 18:03
    大小: 33.95KB
    上传者: LGWU1995
    用DAC0832产生锯齿波电压
  • 所需E币: 1
    时间: 2020-5-9 11:09
    大小: 21KB
    上传者: 指的是在下
    DAC0832接口电路程序
  • 所需E币: 3
    时间: 2019-12-25 20:53
    大小: 28.8KB
    上传者: wsu_w_hotmail.com
    DAC0832与8031的单缓冲器方式接口……
  • 所需E币: 4
    时间: 2019-12-28 21:58
    大小: 224.08KB
    上传者: quw431979_163.com
    数字式电源资料个人博客:http://blog.ednchina.com/wang1jin/51控制的数字式电源最近突然对数字控制电源感兴趣了.就找到了这个资料…HEHE…给大家共享下…其实我还是比较喜欢有反馈的.这样的话电压会稳定很多…如果想加上反馈需要加一个AD转换.Wang1jin收藏…个人博客:http://blog.ednchina.com/wang1jin/本文介绍了以51系列单片机为控制单元,以数模转换器DAC0832输出参考电压,以该参考电压控制电压转换模块LM350的输出电压大小。该电路设计简单,应用广泛,精度较高等特点。关键词:单片机(MCU),数模转换器(DA),掉电存储器(EEPROM)。引言目前所使用的直流可调电源中,几乎都为旋纽开关调节电压,调节精度不高,而且经常跳变,使用麻烦。利用数控电源,可以达到每步0.1V的精度,输出电压范围0~15V,电流可以达到2A。系统结构图1:硬件系统结构图对选用芯片说明DAC0832是一款常用的数摸转换器,它有两种连接模式,一种是电压输出模式,另外一种是电流输出模式,为了设计的方便,选用电压输出模式,如电路图所示,Iout1和Iout2之间接一参考电压,VREF输出可控制电压信号。它有三种工作方式:不带缓冲工作方式,单缓冲工作方式,双缓冲工作方式。该电路采用单缓冲模式,由电路图可知,由于/WR2=/XFER=0,DAC寄存处于直通状态。又由于ILE=1,故只要在选中该片(/CS=0)个人博客……
  • 所需E币: 4
    时间: 2019-12-28 22:09
    大小: 48.57KB
    上传者: quw431979_163.com
    高精度数控直流稳压电源(DAC0832+89S51).rar……
  • 所需E币: 3
    时间: 2019-12-28 23:27
    大小: 58.53KB
    上传者: rdg1993
    DAC0832与8031的双缓冲器同步方式接口……
  • 所需E币: 5
    时间: 2019-12-30 10:23
    大小: 666KB
    上传者: 二不过三
    DAC0832的应用……
  • 所需E币: 5
    时间: 2019-12-25 12:32
    大小: 21KB
    上传者: 238112554_qq
    DAC0832接口电路程序8.6DAC0832接口电路程序见随书所附光盘中文件:DAC0832VHDL程序与仿真。--文件名:DAC0832.VHD--功能:产生频率为762.9Hz的锯齿波。--最后修改日期:2004.3.18。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityDAC0832isport(clk:instd_logic;--系统时钟rst:instd_logic;--复位信号ile:outstd_logic;--数据锁存允许信号cont:outstd_logic;--控制信号(WR1、WR2、CS、Xfer)data_out:outstd_logic_vector(7downto0));--波形数据输出endDAC0832;architecturebehavofDAC0832issignalq:integerrange0to63;--计数器signaldata:std_logic_vector(7downto0);--波形数据beginprocess(clk)beginifrst='1'thenq
  • 所需E币: 5
    时间: 2019-12-25 10:27
    大小: 1.08MB
    上传者: wsu_w_hotmail.com
    数模转换与模数转换接口第11章数/模转换与模/数转换接口计算机用于过程控制和数据采集时,需要将连续变化的模拟量转换为数字量,以及反向的转换。A/D转换技术的D/A转换技术就成为其中的关键。A/D和D/A转换技术主要用于计算机控制系统和测量仪表中。11.1概述在实际生产过程中,需要测量和控制的通常是一些连续变化的模拟量,如电流、电压、温度、压力、流量、位移、速度、光亮度等。如果要用计算机来自动监测和控制生产过程中的物理量,因为计算机本身只能识别和处理数字量(即由0和1构成的二进制数),所以,实际生产过程中的模拟量必须经过模/数转换器(AnalogtoDigitalConverter,即ADC或A/D转换器),才能输入到计算机,由计算机以二进制形式对该模拟量进行分析、计算、存储、显示等。同理,如果计算机要把数字量转换为模拟量输出,以便控制模拟电流或电压电量作为输入的执行机构,就必须经过数/模转换器(DigitaltoAnalogConverter,DAC或D/A转换器)才能实现。所以,A/D转换器、D/A转换器已成为计算机接口技术中最常用的芯片之一,应用非常广泛。计算机控制系统组成框图如图11.1所示。数字量模拟量物理量D/A转换器执行机构生计……
  • 所需E币: 5
    时间: 2019-12-30 09:42
    大小: 222.27KB
    上传者: 238112554_qq
    D/A转换DAC0832芯片……