如何用ad7767实现多路信号转换

如何用ad7767实现多路信号转换,第1张

1、芯片功能介绍

它是一个高精度的24bit采样SAR模数转换芯片 。

它有一个大的输入动态范围。能检测到小的电压变化

它的输出数据可以通过PCI或USB系统获得,读取数据的协议类似于SPI。

(1)引脚

通过示波器观看,可以知道当MSCK为30KHz时,SYNC/PD为高时,就能进行AD转化,有数据时DRDY为低,此时在SCLK的时序下把数据

移位到SDO中。当采用模拟的SPI(即不采用硬件的SPI模块时,请参考: )读取SDO时,SDO的频率为40KHz。而SCLK才900Hz.

从代码上讲SCLK拉高拉低的次数比SDO来得多,应该SCLK比SDO才对。会不会示波器有问题?

(2)读取时序图

上面讲到读取它的是SPI协议,只是类似,大家看它的时序就知道它不是真正的SPI,因为有DRDY脚.

读取方式有两种:CS为常低和读时CS才为低.

从上图可以看到,24bit数据是高位在前,注意的部分用红色圈起来了.

在编程中关键的是t6、t7、t8、t10、t11及最高位得做异或。

2、读数据程序实现

我采用的是读时再让CS下降.

由于是用GPIO口模拟SPI协议,下面的宏先定义各IO口,及读取它们的接口。

[cpp] view plain copy

#define CLK_BANK        2       // SCLK脚

#define CLK_BIT         9

#define DAT_BANK        1       // SDO脚

#define DAT_BIT         25

#define CS_BANK         1       // CS脚

#define CS_BIT          23

#define RDY_BANK        0       // DRDY脚

#define RDY_BIT         12

#define SDA_GPIO        (DAT_BANK   * 32) + DAT_BIT

#define SET_CLK_HIGH()  \

{   \

pin_val[CLK_BANK] = (1<<CLK_BIT) \

}

//if(TRUE == g_bAddDelay)  \

//OALStallExecution(g_delayUS) \

//}

#define SET_CLK_LOW()   \

{   \

pin_valclr[CLK_BANK] = (1<<CLK_BIT)  \

}

//if(TRUE == g_bAddDelay)  \

//  OALStallExecution(g_delayClkLowUs) \

//}

#define SET_CS_HIGH()   \

{   \

pin_val[CS_BANK] = (1<<CS_BIT)   \

}

//if(TRUE == g_bAddDelay)  \

//OALStallExecution(g_delayUS) \

//}

#define SET_CS_LOW()    \

{   \

pin_valclr[CS_BANK] = (1<<CS_BIT)    \

}

//if(TRUE == g_bAddDelay)  \

//OALStallExecution(g_delayUS) \

//}

#define GET_SDA_DATA ((pin_val[DAT_BANK] & (1<<DAT_BIT)) ? 1 : 0)

#define GET_RDY_DATA ((pin_val[RDY_BANK] & (1<<RDY_BIT)) ? 1 : 0)

把CS拉低后有一个t6才能CLK下降,t6是0ns.(其实可以把for(i = 0i <g_delayCSLowi++)去掉的

[cpp] view plain copy

static BOOL PCIPortRead(DEVICE_HANDLE *devHandlePtr, PULONG outBuffPtr)

{

int i = 0

BOOL retval = TRUE

// 当RDY为低时才去读数据

if(0 == GET_RDY_DATA)

{

#include <AT89X51.H>   

#include<math.h>   

#include<INTRINS.h>   

#define uchar unsigned char   

#define uint unsigned int   

   

sbit AD7707_DRDY=P3^3   

sbit AD7707_DIN=P1^5   

sbit AD7707_DOUT=P1^6   

sbit AD7707_SCLK=P1^7   

   

bdata uchar WtrByte   

sbit WtrBit=WtrByte^7   

   

   

void Init_AD7707(void) /*初始化AD7707*/   

{   

    uchar i   

    AD7707_SCLK=1   

    AD7707_DIN=1   

    for(i=0i<100i++) /*防止接口迷失*/   

    {   

        AD7707_SCLK=0   

        AD7707_SCLK=1   

    }   

}   

   

void WriteToReg_AD7707(uchar RegByte) /*写AD7707寄存器*/   

{   

    uchar i   

    WtrByte=RegByte   

   

    for(i=0i<8i++)   

    {   

        AD7707_SCLK=0   

        AD7707_DIN=WtrBit   

                AD7707_SCLK=1   

        WtrByte=WtrByte<<1   

   

    }   

}   

void AD_AINT1(void)  //通道1初始化   

{   

   

    WriteToReg_AD7707(0x20) /*激活通道 AIN1/LOCOM, 下一步 *** 作为写 Clock Register*/   

    WriteToReg_AD7707(0x18) /*启用 Master Clock, 2.4576MHz Clock, 设置 Output Rate 为 50Hz*/   

    WriteToReg_AD7707(0x10) /*激活通道 AIN1/LOCOM, 下一步 *** 作为写 Setup Register*/   

    WriteToReg_AD7707(0x44) /*Gain = 1, Unipolar 模式, Buffer 关闭, 清 FSYNC 并执行 Self Calibration*/   

   

}   

   

   

void AD_AINT2(void)     //通道2初始化   

{   

    WriteToReg_AD7707(0x21) //*激活通道 AIN2/LOCOM, 下一步 *** 作为写 Clock Register*/   

    WriteToReg_AD7707(0x18) /*启用 Master Clock, 2.4576MHz Clock, 设置 Output Rate 为 50Hz*/   

    WriteToReg_AD7707(0x11) /*激活通道 AIN2/LOCOM, 下一步 *** 作为写 Setup Register*/   

    WriteToReg_AD7707(0x44) /*Gain = 1, Unipolar 模式, Buffer 关闭, 清 FSYNC 并执行 Self Calibration*/   

}   

void AD_AINT3(void)   //通道3初始化   

{       WriteToReg_AD7707(0x23) /*激活通道 AIN3/HICOM, 下一步 *** 作为写 Clock Register*/   

    WriteToReg_AD7707(0x18) /*启用 Master Clock, 2.4576MHz Clock, 设置 Output Rate 为 50Hz*/   

    WriteToReg_AD7707(0x13) /*激活通道 AIN3/HICOM, 下一步 *** 作为写 Setup Register*/   

    WriteToReg_AD7707(0x44) /*Gain = 1, Unipolar 模式, Buffer 关闭, 清 FSYNC 并执行 Self Calibration*/   

   

 }   

uint Read_AD7707(void) /*读取AD7707数据*/   

{   

    uchar i   

    uint Data=0   

   

       while(AD7707_DRDY==1)   

   

    for(i=0i<16i++)   

    {   

        Data=Data<<1   

        AD7707_SCLK=0   

        Data=Data|AD7707_DOUT   

        AD7707_SCLK=1   

   

         }   

    return Data   

}

供供参考:http://www.zhixinrui.com/forum.php?gid=1

DAC_WRTA是对D/A写数据的,DAC_clk是D/A的工作时钟,应该不能直接连接一起的。

选择双通道模式,可以使用一个通道,但好像有点画蛇添足的感觉。

开发板不重要,重要的是这个开发板上用什么FPGA芯片?


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11949802.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存