mongfe@sina.com

AD7606 C51程序分享来一波~

mongfe@sina.com 在 2016-11-18 建立的討論區
最後回覆由丽金标於2016-12-3提供

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

 

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[4],DoutB[4];

        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[n]=MakeWord(TempAL,TempAH); //MakeWord(L,H);

                        DoutB[n]=MakeWord(TempBL,TempBH);

                }

                //..............................................

                ADC_CS1=1;        

        }

 

}

結果