已回答假定已回答

AD7175-2采集精度和速度都和手册对应不上,有图和代码

yeqiqi 在 2017-8-12 詢問的問題

AD7175测试的结果不太理想,最慢速5hz的时候波动达到5uV,按照手册说的应该1uV以下,AD和电源电路图power.pngAD.png

另外,高速的时候也不知道驱动程序问题还是电路问题!而且手册里的驱动时序感觉说的乱七八糟!(下面图里看下)驱动程序里不能每个字节都CS使能,而是完整一次操作使能一次才可以,那给第一张时序图有啥用??高速情况下速度达不到手册里说的建立时间(5Hz的时候建立时间对着呢),程序如下用的连续转换模式,ADOUT配置浮空输入,其他引脚推挽输出。

实验现象是:高速情况下数据偶尔会出错,电压波动都1-2mV了,而且0x28寄存器配置为50k的时候速度最高也就到10k

时序.png时序2.pngdatasheet.png

程序代码

#include "ad7172.h"

#include "delay.h"

//uint8_t DataRead[4];

void AD_Delay(void)

{

    uint8_t i = 1,j;

    for(j=0; j<i; j++);

}

 

long ReadAD7172()

{

     long d = 0;

     uint8_t i = 0;

    for(i = 0; i < 24; i++)

    {

        d <<= 1;

        SCLK_L;

        AD_Delay();

        if(DOUT_HorL)

            d |= 0x00000001;

        else

            d &= 0xFFFFFFFE;

        SCLK_H;

        AD_Delay();

    }

//    if(a == BIPOLAR)

//    {

        if(d < 0x800000)

            d = -(0x800000 - d); // 是负数,变成补码

        else

            d &= 0x007FFFFF;

 

//    }

//    result = d;

    return d;

}

uint8_t ReadAD7172_8B()

{

     uint8_t d = 0;

     uint8_t i = 0;

//    while(DOUT_HorL);

//    CS_L;

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

    {

        d <<= 1;

        SCLK_L;

        AD_Delay();

        if(DOUT_HorL)

            d |= 0x01;

        else

            d &= 0xFE;

        SCLK_H;

        AD_Delay();

    }

    return d;

}

/******************************************************************

*函数描述:写AD7714

*局部变量:

*返回变量:

******************************************************************/

void WriteAD7172_8Bit(uint8_t d)

{

    uint8_t i = 0;

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

    {

        SCLK_L;

        AD_Delay();

        if(d & 0x80)

            DIN_H;

        else

            DIN_L;

        SCLK_H;

        AD_Delay();

        d <<= 1;

    }

    DIN_H;

}

void AD7172_Reset(void)

{

    unsigned char i=0;

    SCLK_H;

    CS_L;

    DIN_H;

    for(i=0; i < 12; i++)

    {

        WriteAD7172_8Bit(0xFF);

    }

 

}

/******************************************************************

*函数描述:初始化AD7714电压测量,AIN2通道

*局部变量:

*返回变量:

******************************************************************/

void InitAD7172_V()

{

 

    AD7172_Reset();

    CS_H;

//7175 可用

    CS_L;

    WriteAD7172_8Bit(0x01);

    WriteAD7172_8Bit(0x00);

    WriteAD7172_8Bit(0x00);   

    CS_H;

    CS_L;

    WriteAD7172_8Bit(0x02);

    WriteAD7172_8Bit(0x08);

    WriteAD7172_8Bit(0x00);       

    CS_H;

    CS_L;

    WriteAD7172_8Bit(0x10); //选择通道0的 AN0 AN1

    WriteAD7172_8Bit(0x80);

    WriteAD7172_8Bit(0x01);   

    CS_H;

    CS_L;

    WriteAD7172_8Bit(0x20);

    WriteAD7172_8Bit(0x13);

    WriteAD7172_8Bit(0x00);   

    CS_H;

    CS_L;

    WriteAD7172_8Bit(0x28); //选择滤波频率

    WriteAD7172_8Bit(0x00);

    WriteAD7172_8Bit(0x05);    //?为07的时候可以40k  00的时候反而不行 原因未知

    CS_H;

}

 

最后采集程序

   CS_L;
   while(DOUT_HorL);
   WriteAD7172_8Bit(0x44);
   Acq_value=ReadAD7172();
   CS_H;

 

这样循环操作采集然后不断上传Acq_value

请各位论坛好友解答下!一起讨论讨论,不胜感激~

 

手册地址

http://www.analog.com/media/en/technical-documentation/data-sheets/AD7175-8.pdf

結果