FPGA AD7606数据采集心得

在最近项目里,需要使用AD7606与FPGA来进行四通道AD数据的采集,配置好AD7606后,开始进行数据采集。测试得出的数据与datasheet中的转换算法得出的数据存在一定的误差,于是慢慢开始排除问题。

首先AD7606的datasheet中算法如图
在这里插入图片描述
因为AD7606的数据线为DB[0:15],所以ADC CODE相当于有16位,所以实际得出来的值的范围位0~32767,再根据你的RANGE 脚来选择输入电压的范围,根据图中转换算法得出AD实际测量电压值。

在测试中,发现当输入电压从0~2.5V变化时,AD7606采集到的值经过转换还是挺准的,但是超过2.5V后,比如说实际电压2.6V,但是AD7606采集到的值转换后只有0.1V,实际电压2.7V,测量值为0.2V,以此类推。

以RANGE=±5V为例,按照datasheet的转换算法,转换应该如下图

电压值AD7606理论值
2.5V16384
2.6V17039
2.7V17695

但是实际测量如下图所示

电压值AD7606测量值
2.5V16384
2.6V655
2.7V1311

根据上面两幅图的结果,判断出测量电压超过2.5V以后AD7606测量值与理论值存在较大误差,发现误差为16384,二进制为0100 0000 0000 0000,初步判断为DB14存在问题,于是用示波器首先抓了一下AD7606的DB14,发现会有高低电平跳变,说明AD7606输出DB14没问题。于是怀疑FPGA引脚虚焊,于是用风枪重新吹了下FPGA,然后测试,发现所测数据与理论值相同,问题解决。

第一次发博客,做个纪念,有不足的地方欢迎大家留言指教。

  • 14
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面给出一个AD7606模块的FPGA采集代码,具体实现可能需要根据实际情况进行调整。 ``` module ad7606 ( input clk, // 时钟信号 input rst, // 复位信号 input start, // 启动采样信号 output reg [15:0] dout // 数据输出信号 ); reg [3:0] sclk_div; // 时钟分频计数器 reg [3:0] adc_ch; // 通道计数器 reg [15:0] adc_val; // ADC值计数器 reg [15:0] dout_reg; // 输出寄存器 wire [15:0] adc_data; // ADC数据输入信号 wire adc_busy; // ADC忙信号 // 时钟分频计数器 always @(posedge clk or posedge rst) begin if (rst) begin sclk_div <= 4'b0000; end else begin if (sclk_div == 4'b1111) begin sclk_div <= 4'b0000; end else begin sclk_div <= sclk_div + 1'b1; end end end // 通道计数器 always @(posedge clk or posedge rst) begin if (rst) begin adc_ch <= 4'b0000; end else begin if (start && adc_ch == 4'b0000) begin adc_ch <= 4'b0001; end else if (sclk_div == 4'b1111) begin adc_ch <= adc_ch + 1'b1; end end end // ADC值计数器 always @(posedge clk or posedge rst) begin if (rst) begin adc_val <= 16'b0000000000000000; end else begin if (start) begin adc_val <= 16'b0000000000000000; end else if (sclk_div == 4'b1111) begin adc_val <= {adc_data[15:0], adc_val[15:1]}; end end end // 输出寄存器 always @(posedge clk or posedge rst) begin if (rst) begin dout_reg <= 16'b0000000000000000; end else begin if (start && adc_ch == 4'b0001) begin dout_reg <= adc_val; end end end // 输出信号 assign dout = dout_reg; // ADC控制 assign adc_busy = adc_ch != 4'b0000; assign {start, adc_ch} = adc_busy ? {1'b0, adc_ch} : {1'b1, adc_ch}; // ADC数据输入 adc adc_inst ( .sclk(clk), .csn(1'b1), .din(16'b0000000000000000), .busy(adc_busy), .dout(adc_data) ); endmodule ``` 该代码中,使用了一个ADC模块实现了AD7606数据采集功能。具体实现过程中,需要根据实际硬件电路进行相应的调整,比如时钟分频的值、采样的通道等。同时,也需要根据实际情况进行数据处理,比如根据数据手册进行数据格式的转换、去除校验位等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值