PMODAD1 实现模拟数据的采集 硬件篇

59 篇文章 4 订阅
46 篇文章 8 订阅



PMODAD1是一个简单PMOD接口的双路ADC采集模块,可以点此到淘宝网店购买,描述如下

产品描述

Digilent Pmod AD1是一个12位双信道模拟数字转换器,搭载Analog Devices AD7476A。凭借每秒高达100万个样本的采样率,该Pmod即使面对最苛刻的音频应用都能发挥杰出表现。

产品特点:

  • 双信道,12位模拟数字转换器

  • 可在每通道高达100万个样本的采样率下实现同时A/D转换

  • 两个2极点Sallen-KEY抗混叠滤波器

  • 适用于各种设计的小型PCB(2.4cm x 2.0cm)

  • 有GPIO接口的6引脚Pmod连接器

  • 资料库可提供代码库和示例代码


我们简单提取一下:

 1,使用 AD7476A编程的时候就可以参考AD7476A这个芯片的时序进行控制。

 2,每秒100万次就是1M SAMPLES PER SECOND ,每秒能采集1M个样本点,每个点是12位。

 3,采样进度是12位。

我们简单看一下原理如图:


 我们看到每路都有两个运放,构成所谓的2极点Sallen-KEY抗混叠滤波器,这里把握是滤波器,没有进行线性的放大或者减小。

每一个ADC 都是要参考电压的,这个参考电压就是当采集位数满额的时候(12位都是1)代表的多少伏。我们查看数据手册可以发先这个AD7476DE 参考电压是他的供电电压VDD,这电压的范围可以从2.35V到5.25V,这个电压范围够宽的。


这里PMOD的电压是从ZEDBOARD板子输出的3.3V,这个电压是不很精确的,我们要降低误差提高精度可以按照数据手册所提供的方法,用有一定输出能力的基准电压芯片给AD7674供电,如下:


这里用到的REF193稳压的数值是准确的3.0V,还可以用其他稳压数值的REF19X,注意要满足电压输出范围是2.35V到5.25V这一AD7674工作条件。其他数值的REF19X稳压数值如下:


查看REF193的数据手册可知,其最大负载电流可以到30MA,远超过AD7476的消耗,如果采用其他的基准电压一定要注意产生的基准电压是否有足够负载能力。AD7476数据手册看到5V时芯片损耗最大是15mw,这个数值再除以电压得到电流是很小的。但是也要考虑基准源有足够的余量。


这里说一下电压计算公式,我们基准电压是VREF,ADC的数值是DV,那么输入的电压是Vi,对于这个12位的ADC他们之间的比例对应关系是:

VREF/(1<<12) = Vi/DV

所以也就得到了  Vi = VREF * DV / 1<<12  

这里1<<12是4096 ,也就是说12BIT能表达 4096个数值。   





  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这两个Verilog代码可以放在一个.v文件中吗:1.`timescale 1ns / 1ps module Top(clk,sw,led,flag, ADC_sdata, ADC_sclk,ADC_csn,slec_wei,slec_duan); input clk; input [3:0]sw; output reg [7:0] led; input flag; input ADC_sdata; output ADC_sclk,ADC_csn; output [7:0] slec_wei; output [7:0] slec_duan; wire [11:0] adc_res; wire adc_valid; wire [19:0]cout; always@(posedge clk)if(adc_valid) led<=adc_res[11:4]; PmodAD1 U0( .clk(clk), .rst(1’b0), .ADC_sdata(ADC_sdata), .ADC_sclk(ADC_sclk), .ADC_csn(ADC_csn), .adc_res(adc_res), .adc_valid(adc_valid) ); data_ad_pro U1( .sys_clk(clk), .rst_n(1’b1), .pre_data(adc_res[11:4]), .cout(cout) ); display U2( .sys_clk(clk), .rst_n(1’b1), .cout(cout), .sw(sw), .flag(flag), .slec_wei(slec_wei), .slec_duan(slec_duan) ); endmodule ———————2.module PmodAD1( clk,rst, ADC_sdata,ADC_sclk,ADC_csn,adc_res,adc_valid); input clk,rst, ADC_sdata; output reg ADC_sclk,ADC_csn; output reg [11:0] adc_res; output reg adc_valid; reg [7:0] cntr; always@(posedge clk) if(rst)cntr<=0;else if(cntr==34)cntr<=0;else cntr<=cntr+1; always@(posedge clk) case (cntr) 0: ADC_csn<=0; 33: ADC_csn<=1; endcase always@(posedge clk) case(cntr) 34,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,33:ADC_sclk<=1; default ADC_sclk<=0; endcase always@(posedge clk) case(cntr) 8: adc_res[11]<= ADC_sdata; 10:adc_res[10]<= ADC_sdata; 12:adc_res[9]<= ADC_sdata; 14:adc_res[8]<= ADC_sdata; 16:adc_res[7]<= ADC_sdata; 18:adc_res[6]<= ADC_sdata; 20:adc_res[5]<= ADC_sdata; 22:adc_res[4]<= ADC_sdata; 24:adc_res[3]<= ADC_sdata; 26:adc_res[2]<= ADC_sdata; 28:adc_res[1]<= ADC_sdata; 30:adc_res[0]<= ADC_sdata; endcase always@(posedge clk)adc_valid<=cntr==32; endmodule
最新发布
06-01
可以将两个模块放在同一个文件中,但需要注意的是,需要在两个模块之间添加一个模块分割符`//----`,否则会报错。同时,建议将两个模块中的端口名进行修改,以免出现冲突。下面是修改后的代码示例: ``` //----Top module---- `timescale 1ns / 1ps module Top( input clk, input [3:0] sw, output reg [7:0] led, input flag, input ADC_sdata, output ADC_sclk, output ADC_csn, output [7:0] slec_wei, output [7:0] slec_duan ); wire [11:0] adc_res; wire adc_valid; wire [19:0] cout; always@(posedge clk) if(adc_valid) led <= adc_res[11:4]; PmodAD1 U0( .clk(clk), .rst(1'b0), .ADC_sdata(ADC_sdata), .ADC_sclk(ADC_sclk), .ADC_csn(ADC_csn), .adc_res(adc_res), .adc_valid(adc_valid) ); data_ad_pro U1( .sys_clk(clk), .rst_n(1'b1), .pre_data(adc_res[11:4]), .cout(cout) ); display U2( .sys_clk(clk), .rst_n(1'b1), .cout(cout), .sw(sw), .flag(flag), .slec_wei(slec_wei), .slec_duan(slec_duan) ); endmodule //----PmodAD1 module---- module PmodAD1( input clk, input rst, input ADC_sdata, output reg ADC_sclk, output reg ADC_csn, output reg [11:0] adc_res, output reg adc_valid ); reg [7:0] cntr; always@(posedge clk) if(rst) cntr <= 0; else if(cntr == 34) cntr <= 0; else cntr <= cntr + 1; always@(posedge clk) case(cntr) 0: ADC_csn <= 0; 33: ADC_csn <= 1; endcase always@(posedge clk) case(cntr) 34, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 33: ADC_sclk <= 1; default ADC_sclk <= 0; endcase always@(posedge clk) case(cntr) 8: adc_res[11] <= ADC_sdata; 10: adc_res[10] <= ADC_sdata; 12: adc_res[9] <= ADC_sdata; 14: adc_res[8] <= ADC_sdata; 16: adc_res[7] <= ADC_sdata; 18: adc_res[6] <= ADC_sdata; 20: adc_res[5] <= ADC_sdata; 22: adc_res[4] <= ADC_sdata; 24: adc_res[3] <= ADC_sdata; 26: adc_res[2] <= ADC_sdata; 28: adc_res[1] <= ADC_sdata; 30: adc_res[0] <= ADC_sdata; endcase always@(posedge clk) adc_valid <= cntr == 32; endmodule ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值