zoukankan      html  css  js  c++  java
  • ad8582

    DIP封装:

     

    内部结构:

     

    引脚描述:

    Vout1,Vout2:数模转换输出管脚,固定的电压输出范围是0V~4.095V1mV/LSB.

    AGND:模拟地

    DGND:数字地

    LDADAC A寄存器装载选通端,把输入寄存器中的数据转移到DAC 寄存器中,输入低电平有效,电平敏感锁存。

    LDBDAC B 寄存器装载选通端,把输入寄存器中的数据转移到DAC 寄存器中,输入低电平有效,电平敏感锁存。脉冲宽度为30ns.

    MSB:数字电平输入,为1时把DAC寄存器预设为1/2满刻度(800H),为0时把DAC寄存器清零。依赖RST断言。

    RST:复位端,低电平有效,复位脉冲宽度为30ns

    DB0~DB11:二进制数据输入端。

    CS:片选端,低电平有效,片选脉冲宽度为30ns

    A/B:选择DAC A=0,选择DAC B=1

    VDD:电源,5V

    VREF2.5V的参考电压输出,

    特点:

    1、输出建立时间为16us

    2、单电源,5V电源供电;

    3、低功耗,5mW.

    4、双12位数模转换器,内设运放,无需外扩;

    51mV/Bit,满刻度为4.095V

     
       

    控制逻辑真值表

     

     
       

    (表示上升沿触发)

     

     

    芯片调试心得:LDALDB在拉低一段时间后,必须再拉高,锁存一下;AD8582的速率不是很高,所以速率过快的话正弦波就会变成三角波;在一开始的时候我一直明白为什么我把芯片手册看的很清楚了就是输出的波形有问题,如下图,直到我找够了杜邦线,把该连接的管脚全连接上以后才出现很稳定的波形,其实我早有体会的,再这里再写一次算做为对自己的提醒,一定要把芯片手册看懂,英文的也要一个单词一个单词的去阅读,搞清楚了再搭硬件电路,既然要搭电路就要把电路搭好,不然心里没有底,也出不来想要的结果,很会浪费很多的时间;

     

    相差可调的信号发生器

    本程序用来产生一个频率可调,相位可调的正弦信号,通过两个按键来控制

    分频模块

    module fenpin(clock,key2,rst,r_clk);

    input clock;

    input rst;

    output r_clk;

    input key2;

    reg clk_r;

    reg key2_r1,key2_r2;

    always@(posedge clock or negedge rst)

    begin

    if(!rst)

    begin

    key2_r1<=1'b1;

    key2_r2<=1'b1;

    end

    else

    begin

    key2_r2<=key2_r1;

    key2_r1<=key2;

    end

    end

    wire neg_key2=(~key2_r1)&(key2_r2);/*检测下降沿*/

    /*产生不tong频率的时钟*/

    reg[3:0] i;

    reg[7:0] cnt;

    always@(posedge clock or negedge rst)

    begin

    if(!rst)

    begin

    i<=4;

    end

    else if(neg_key2)

    i<=i+1'b1;

    end

    always@(posedge clock or negedge rst)

    begin

    if(!rst)

    begin

    clk_r <=1'b0;

    cnt <= 8'd0;

    end

    else

    begin

    cnt<=cnt+1'b1;

    if(cnt[i])

    clk_r<=1'b1;

    else

    clk_r<=1'b0;

    end

    end

    assign r_clk=clk_r;/*产生了可变是时钟*/

    endmodule

    核心模块

    `define   phase   8'd15 /*pi/8*/

    module siganl_test(rst,address,clk,addr_select,key1,key3,);

    input key1;/*用来调节相位*/

    input key3;/*相位改变的确定键*/

    input clk;

    input rst;

    output addr_select;/*地址选择,标志要输入正常波,还是调频波*/

    reg    addr_select;

    output[7:0] address;

    reg[7:0]  address_r;

    /*检测两个按键的下降沿*/

    reg[7:0] phase_cnt;/*用来调制相差,记录初相*/

    reg[7:0] address_r1;/*用来存储正常的地址*/

    reg[7:0] address_r2;/*用来存储可变相的地址*/

    reg key1_r1,key1_r2;/**/

    reg key3_r1,key3_r2;

    /*key1,key2只所以要分开写,是因为两者用到了不同的时钟,不能写到一块去*/

    always@(posedge clk or negedge rst)

    begin

    if(!rst)

    begin

    key1_r1<=1;

    key1_r2<=1;

    key3_r1<=1;

    key3_r2<=1;

    end

    else

    begin

    key1_r2<=key1_r1;

    key1_r1<=key1;

    key3_r2<=key3_r1;

    key3_r1<=key3;

    end

    end

     wire neg_key1=key1_r2&(~key1_r1);/*检测下降沿*/

     wire neg_key3=key3_r2&(~key3_r1);

    always@(posedge clk or negedge rst)

    begin

    if(!rst)

    begin

    phase_cnt<=8'd0;

    address_r1<=0;

    address_r2<=0;

    end

    else 

    begin

    addr_select<=addr_select+1'b1;

    /*在按下确定键时,同时对一两个地址复位*/

    if(neg_key3)

    begin/*这里是在原来的基础上改变相位*/

    address_r1<=address_r1+phase_cnt;

    phase_cnt<=0;

    end

    else if(neg_key1)

    begin

    if(phase_cnt>8'd127)

    begin

    phase_cnt<=0;

    end

    else

    begin

    phase_cnt<=phase_cnt+`phase;

    end

    end

    else

    begin

     

    if(addr_select)

    begin

    address_r2=address_r2+1'b1;

    address_r<=address_r2;

    end

    else

    begin

    address_r1=address_r1+1'b1;

    address_r<=address_r1;

    end

    end

    end

    end

    assign address=address_r;

    endmodule

    AD8582的控制模块

    module AD8582_control(clk,rst,cs,a_r_b,lda_r,ldb_r);

    input clk;

    input rst;

    output cs,a_r_b,lda_r,ldb_r;

    reg cs,a_r_b,lda_r,ldb_r;

    reg cnt;

    always@(posedge clk or negedge rst)

    begin

    if(!rst)

    begin

    cnt<=1'b0;

    cs<=1'b1;

    a_r_b<=1'bz;

    lda_r<=1'bz;

    ldb_r<=1'bz;

    end

    else

    begin

    cs<=1'b0;

    cnt<=cnt+1'b1;

     

    if(cnt==1'b1)

    begin

    a_r_b<=1'b1;

    lda_r<=1'b1;

    ldb_r<=1'b0;

    end

    else

    begin

    a_r_b<=1'b0;

    lda_r<=1'b0;

    ldb_r<=1'b1;

    end

    end

    end

    endmodule

     

     

     

     

     

     

  • 相关阅读:
    面向对象的设计模式2
    数据结构
    算法题目1
    5.7(1) 反射
    hashMap原理(java8)
    6.1 接口
    18.1 线程
    13.2 具体的集合
    scrapy(2)——scrapy爬取新浪微博(单机版)
    5.1 类、超类和子类
  • 原文地址:https://www.cnblogs.com/zhongguo135/p/2752434.html
Copyright © 2011-2022 走看看