hongguan 发表于 2016-11-8 16:31:43

AD7606 C51程序

      最近在用AD7606来做项目,感觉这块IC不错,资料齐全,很好用,速度快。在调试过程中间也碰到很多问题,但都一一解决了,下面是C51程序。
分享给大家,高手的请绕过。手下留情。{:lol:}


sbit OS0=P5^2;
sbit OS1=P0^4;
sbit OS2=P0^3;

sbit RANGE=P0^2;
sbit CONVST=P0^1;
sbit ADC_RST=P0^0;

sbit RD_SCK=P4^6; //SPI=SCLK
sbit ADC_CS1=P7^5;         //U19                               
sbit ADC_CS2=P4^5;         //U15                               

sbit FRSTDAT=P7^6; //指示何时读通道1(V1)数据=1;
sbit HBEN=P4^3;   //DB14,选择输出:1=先输出高8位,后输出低8位
sbit BUSY=P7^7;   //在高电平时读取数据

sbit AD_DoutA=P2^0;//DB7,串行模式用到,输出数据Dout A
sbit AD_DoutB=P4^4;//DB8,串行模式用到,输出数据Dout B

/*
*****************************************************************************
*        函 数 名: ad7606_Reset
*        功能说明: 硬件复位AD7606
*        形    参:无
*        返 回 值: 无
*****************************************************************************
*/
void ad7606_Reset(void)
{
        /* AD7606是高电平复位,要求最小脉宽50ns */
       
        ADC_RST=0;
       
        ADC_RST=1;
        ADC_RST=1;
        ADC_RST=1;
        ADC_RST=1;
        Delay1ms();
        ADC_RST=0;
}
/*
*********************************************************************************************************
*        函 数 名: ad7606_StartConv
*        功能说明: 启动AD7606的ADC转换
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void ad7606_StartConv(void)
{
        /* 上升沿开始转换,低电平持续时间至少25ns*/
        CONVST=0;
        CONVST=0;
        CONVST=0;        /* 连续执行2次,低电平约50ns */
        Delay10us();
        CONVST=1;
        Delay100us();
        Delay100us();
//        Delay100us();
}
//******************************************************************************//
void AD7606_init()
{
        Delay1ms();

        ad7606_Reset();
        OS2=1;OS1=1;OS0=0;//设定过采样
        ADC_CS1=1;
        ADC_CS2=1;
        P2=0x80;
        RD_SCK=1;
        CONVST=1;
        RANGE=0; //选择+/- 5V 输入       
        HBEN=0;   //DB14,选择输出:1=先输出高8位,后输出低8位
}

//***************************************************************************
void AD7606C(uchar acch)//(unsigned int *adcdat)
{
        uint DoutA,DoutB;
        uint i,j,n;
        uchar TempAH,TempBH,TempAL,TempBL;

        OS2=1;OS1=1;OS0=0;//设定过采样
        RANGE=1; //选择+/- 10V 输入       
        select_CH(acch);
        P51=1; P35=0;
        delayms(50);

        for(j=0;j<100;j++)
        {
                  
                ad7606_StartConv();        //启动AD7606的ADC转换
                while(BUSY){;}
                ADC_CS1=0;
                ADC_CS2=1;
                TempAH=0;TempBH=0;
                TempAL=0;TempBL=0;

                for(n=0;n<4;n++)
                {
                        TempAH=TempAH<<1;
                        TempBH=TempBH<<1;
                        RD_SCK=0;
                        if(AD_DoutA)TempAH|=0x01;
                        if(AD_DoutB)TempBH|=0x01;                               
                        RD_SCK=1;

                        for(i=0;i<7;i++)
                        {               
                                RD_SCK=0;        
                                RD_SCK=1;        
                                TempAH=TempAH<<1;
                                TempBH=TempBH<<1;
                                if(AD_DoutA)TempAH|=0x01;                               
                                if(AD_DoutB)TempBH|=0x01;                                                                                      
                        }
                        for(i=0;i<8;i++)
                        {               
                                RD_SCK=0;        
                                RD_SCK=1;        
                                TempAL=TempAL<<1;
                                TempBL=TempBL<<1;
                                if(AD_DoutA)TempAL|=0x01;                               
                                if(AD_DoutB)TempBL|=0x01;                                                                                      
                        }
                        DoutA=MakeWord(TempAL,TempAH); //MakeWord(L,H);
                        DoutB=MakeWord(TempBL,TempBH);
                }
                //..............................................
                ADC_CS1=1;       
        }

}

bolizhicheng204 发表于 2016-11-8 16:49:00

这款运放采样率有多快? 能做到多少有效位啊,楼主

hongguan 发表于 2016-11-8 16:59:43

datasheet是200K,我只做一般的用途,最小我测量过50mV DC的。精度还可以,+/-0.1mV没问题,再小没试过。

hongguan 发表于 2016-11-8 17:01:36

这款IC的亮点我觉得是8路同时测量采集功能不错

忽忽 发表于 2016-11-15 14:46:04

C51程序收了~{:victory:}

dengfeng5357 发表于 2017-1-15 21:47:23

多谢分享,收下了。
页: [1]
查看完整版本: AD7606 C51程序