zoukankan      html  css  js  c++  java
  • 电赛总结(四)——波形发生芯片总结之AD9834

    一、特性参数

    1、2.3V~5.5V供电

    2、输出频率高达37.5MHz

    3、正弦波、三角波输出

    4、提供相位调制和频率调制功能

    5、除非另有说明,VDD = 2.3 V至5.5 V,AGND = DGND = 0 V,TA = TMIN至TMAX,RSET = 6.8 k,RLOAD = 200 (对于IOUT和IOUTB)。

    二、芯片管脚图

    image

    三、管脚功能说明

    管脚名称 功能
    FS ADJUST

    此引脚和AGND之间连接一个电阻(RSET),从而决定满量程DAC电流的幅度。RSET与满量程电流之间的关系如下:

    IOUT FULL SCALE = 18 × FSADJUST/RSET
    FSADJUST = 1.15 V(标称值),RSET = 6.8 k(典型值)。

    REFOUT 基准电压输出。AD9834通过此引脚提供1.20 V内部基准电压源。
    COMP DAC偏置引脚。此引脚用于对DAC偏置电压进行去耦。
    VIN

    比较器输入。可利用比较器从正弦DAC输出产生方波。DAC输出应经过适当滤波,然后再施加于比较器,以改善抖动性能。当控制寄存器中的Bit OPBITEN和Bit SIGN/PIB置1时,比较器输入端连接到VIN。

    IOUT,
    IOUTB

    电流输出。这是高阻抗电流源。应在IOUT和AGND之间连接一个标称值为200 的负载电阻。IOUTB最好应通过一个大小为200 的外部负载电阻连接到AGND,但也可直接与AGND相连。此外还建议通过一个20 pF电容连接到AGND,以防止出现时钟馈通。

    AVDD 模拟部分的正电源。AVDD的值范围为2.3 V至5.5 V。应在AVDD和AGND之间连接一个0.1uF去耦电容。
    DVDD 数字部分的正电源。DVDD的值范围为2.3 V至5.5 V。应在DVDD和DGND之间连接一个0.1uF去耦电容。
    CAP/2.5V

    数字电路采用2.5 V电源供电。当DVDD超过2.7 V时,此2.5 V利用片内调节器从DVDD产生。该调节器需要在CAP/2.5 V至DGND之间连接一个典型值为100 nF的去耦电容。如果DVDD小于或等于2.7 V,则CAP/2.5 V应与DVDD直接相连。

    DGND 数字地。
    AGND 模拟地。
    MCLK

    数字时钟输入。DDS输出频率是MCLK频率的一个分数,分数的分子是二进制数。输出频率精度和相位噪声均由此时钟决定。

    FSELECT

    频率选择输入。FSELECT控制相位累加器中使用的具体频率寄存器(FREQ0或FREQ1)。可使用引脚FSELECT或BitFSEL来选择要使用的频率寄存器。使用Bit FSEL来选择频率寄存器时,FSELECT引脚应与CMOS高电平或低电平相连。

    PSELECT

    相位选择输入。PSELECT控制将增加到相位累加器输出的具体相位寄存器(PHASE0或PHASE1)。可使用引脚PSELECT或Bit PSEL来选择要使用的相位寄存器。当相位寄存器由Bit PSEL控制时,PSELECT引脚应与CMOS高电平或低电平相连

    RESET

    高电平有效数字输入。RESET可使相应的内部寄存器复位至0,以提供中间电平的模拟输出。RESET不影响任何可寻址寄存器。

    SLEEP 高电平有效数字输入。当此引脚处于高电平时,DAC关断。此引脚功能与控制位SLEEP12相同。
    SDATA 串行数据输入。16位串行数据字施加于此输入。
    SCLK 串行时钟输入。数据在每个SCLK下降沿逐个输入AD9834。
    FSYNC

    低电平有效控制输入。这是输入数据的帧同步信号。当FSYNC变为低电平时,即告知内部逻辑,正在向器件
    中载入新数据

    SIGN BIT
    OUT

    逻辑输出。比较器输出通过此引脚提供,或者可通过此引脚输出NCO的MSB。通过将控制寄存器中的Bit
    OPBITEN置1,可使能此输出引脚。Bit SIGN/PIB确定通过该引脚输出的是比较器输出还是NCO的MSB。

    四、寄存器image

           一个16位的控制寄存器。设置好之后即可产生对应的波形

    Bit

    名称

    功能

    DB13 B28

          B28 = 1可将一个完整字通过两次连续写入载入频率寄存器。第一次写入包含频率字的14个LSB,下次写入则包含14个MSB。每个16位字的前两位都是定义将载入该字的频率寄存器,因此对于两次连续写入是完全相同的。有关相应的地址,请参见表10。

    image

          在两个字均已载入后,即会写入频率寄存器。表11给出了一个完整28位写操作的示例。

    image

    不过,请注意,不允许向同一频率寄存器连续写入28位数据,而应在频率寄存器之间切换来执行此类功能。当B28 = 0时,28位频率寄存器用作两个14位寄存器,其中一个包含14个MSB,另一个则包含14个LSB。这意味着,可单独更新频率字的14个MSB而不影响14个LSB,反之亦然。要更新14个MSB或14个LSB,只需向相应的频率地址执行一次写入即可。控制位DB12 (HLB)告知AD9834要更新的位是14个MSB还是14个LSB。

    DB12 HLB

    此控制位使用户可以连续载入频率寄存器的MSB或LSB而忽略余下的14位。如果无需完整的28位分辨率,这点将很有用。HLB应与DB13 (B28)一起使用。此控制位指示载入的14位是传输至所寻址频率寄存器的14个MSB还是14个LSB。DB13 (B28)必须设为0,以便能够单独地更改频率字的MSB和LSB。当DB13 (B28) = 1时,此控制位会被忽略。

    HLB = 1允许写入所寻址频率寄存器的14个MSB。
    HLB = 0允许写入所寻址频率寄存器的14个LSB。

    DB11 FSEL FSEL bit定义相位累加器中使用的是FREQ0寄存器还是FREQ1寄存器。请参见表8来选择频率寄存器。
    image
    DB10 PSEL

    PSEL bit定义是将PHASE0寄存器还是PHASE1寄存器的数据增加到相位累加器的输出。请参见表9来选择相位寄存器。

    image

    DB9 PIN/SW

    可利用软件或硬件实现选择频率和相位寄存器、复位内部寄存器和关断DAC等功能。PIN/SW选择这些功能的控制源。

    PIN/SW = 1表示将使用相应的控制引脚来控制此类功能。
    PIN/SW = 0表示将使用相应的控制位来控制此类功能。

    DB8 RESET

    RESET = 1时可将内部寄存器复位至0,这对应于中间电平的模拟输出。
    RESET = 0时则禁用RESET。

    DB7 SLEEP1

    当SLEEP1 = 1时,内部MCLK被禁用。由于NCO不再执行累加,因此DAC输出仍保持其预设值。
    当SLEEP1 = 0时,MCLK使能。

    DB6 SLEEP12

    SLEEP12 = 1关断片内DAC。当AD9834用于输出DAC数据的MSB时,这点很有用。
    SLEEP12 = 0表示DAC处于活动状态。

    DB5 OPBITEN

    此bit的功能是控制是否通过SIGN BIT OUT引脚提供输出。如果用户不使用SIGN BIT OUT引脚,此bit应保持为0。
    OPBITEN = 1时使能SIGN BIT OUT引脚。
    OPBITEN = 0时,SIGN BIT OUT输出缓冲器置于高阻抗状态,因此SIGN BIT OUT引脚不提供任何输出。

    DB4 SIGN/PIB 此bit的功能是控制将通过SIGN BIT OUT引脚提供的具体输出。
    SIGN/PIB = 1时,片内比较器与SIGN BIT OUT相连。DAC的正弦波输出经过滤波后,便可将该波形施加于比较器来产生方波波形。见表17。
    imageSIGN/PIB = 0时,DAC数据的MSB(或MSB/2)与SIGN BIT OUT引脚相连。Bit DIV2控制输出的是MSB还是MSB/2。
    DB3 DIV2

    DIV2应与SIGN/PIB和OPBITEN一起使用。见表17。
    DIV2 = 1时,数字输出被直接送至SIGN BIT OUT引脚。
    DIV2 = 0时,数字输出2被直接送至SIGN BIT OUT引脚。

    DB2 保留 此位总是清0。
    DB1 MODE

    此bit的功能是控制将通过IOUT引脚/IOUTB引脚提供的具体输出。如果控制位OPBITEN = 1,此位应清0。
    当MODE = 1时,SIN ROM被旁路,因而得到来自DAC的三角波输出。
    当MODE = 0时,SIN ROM用于将相位信息转换成幅度信息,进而在输出端提供正弦信号。参见表18。

    image

    DB0 保留 此位总是清0。

    五、STM32F103驱动代码

    #ifndef __AD9834_H
    #define    __AD9834_H
    
    
    #include "stm32f10x.h"
    #include "pbdata.h"
    #include "gpio.h"
    
    #define FSYNC Pin9
    #define SDATA Pin10
    #define SCLK  Pin11
    #define RESET  Pin12
    
    
    
    #define FCLK 50
    
    enum Phase
    {
        Sine,
        Triangle,
        Square
    };
    
    void Ad9834_init(enum Phase ph,u32 freq);
    void Send_Phase(void);
    void Ad9834_Send_Freq(u16 Freq_word);
    void Ad9834_Send_Con(u16 Con_word);
    
    #endif /* __DAC_H */
    #include "ad9834.h"
    #include "math.h"
    
    void Ad9834_init(enum Phase ph,u32 freq)
    {
        u32 fre= (u32)freq / 20000.0 * pow(2,28) - 1;
        
        u16 fre_high = fre / 0x4000 + 0x4000;
        u16 fre_low = fre % 0x4000 + 0x4000;
        
        set_out(GPIOG, FSYNC | SDATA | SCLK |  RESET); 
      
        set_outH(GPIOG,FSYNC);
        set_outH(GPIOG,SCLK);
        
        set_outH(GPIOG,RESET);
        delay_us(10);
        set_outH(GPIOG,RESET);
        delay_us(10);
        set_outL(GPIOG,RESET);
        delay_ms(10);
        
        if(ph==Sine)
        {
            Ad9834_Send_Con(0x2038);    
        }
        else if(ph==Triangle)
        {
            Ad9834_Send_Con(0x2002);
        }
        else
        {
            Ad9834_Send_Con(0x2020);
        }
          delay_us(10);
          Ad9834_Send_Freq(fre_low);
            delay_us(10);
            Ad9834_Send_Freq(fre_high);
        
    //    Send_Phase();
    }
    
    void Ad9834_Send_Con(u16 Con_word)
    {
        u8 i;
    
        set_outL(GPIOG,FSYNC);
        set_outH(GPIOG,SCLK);
        
        for(i=0;i<16;i++)
        {
            if(Con_word & 0x8000)
            {
                set_outH(GPIOG,SDATA);
            }
            else
            {
                set_outL(GPIOG,SDATA);
            }
            Con_word<<=1;
    
            set_outL(GPIOG,SCLK);
            delay_us(10);
            set_outH(GPIOG,SCLK);
        }
        
        set_outH(GPIOG,FSYNC);
        
    }
    
    
    void Ad9834_Send_Freq(u16 Freq_word)
    {
        u8 i;
        set_outL(GPIOG,FSYNC);
        set_outH(GPIOG,SCLK);    
        
        for(i=0;i<16;i++)
        {
            if((Freq_word & 0x8000) == 0x8000)
            {
                set_outH(GPIOG,SDATA);
            }
            else
            {
                set_outL(GPIOG,SDATA);
            }
            
            Freq_word<<=1;
        
            set_outL(GPIOG,SCLK);
            delay_us(10);
            set_outH(GPIOG,SCLK);
        }
        
        set_outH(GPIOG,FSYNC);
        
    }
    
    void Send_Phase(void)
    {
        Ad9834_Send_Con(0xC000);
    }
  • 相关阅读:
    CentOS 6.5 编译安装Apache2.4
    Linux 服务器安全优化
    yum安装Apache2.4
    HDU 3308 线段树求区间最长连续上升子序列长度
    HDU 3607 线段树+DP+离散化
    POJ 3667 线段树区间合并裸题
    HDU 5726 线段树+dp
    牛客网多校训练第二场D Kth Minimum Clique
    HDU 4325 离散化+树状数组 或者 不使用树状数组
    HDU 2167 状压dp方格取数
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4748166.html
Copyright © 2011-2022 走看看