已回答假定已回答

AD7683数据位数的大小

zhouhaobaoming 在 2016-3-10 詢問的問題
最後回覆由StevenX於2016-4-7提供

A`8KRRI3({(@3JRD7I49R[2.png

使用二片AD7683独立进行温度的测量,VDD供电由5VLDO提供,参考电压由一片ADR02共同提供。IN-接地,IN+分别接测量电压。被测量电压理论上的范围是05V.

测试时使用的恒定的电阻代替实际的ntc电阻,一个通道的电压是0.454V左右,另一个通道的电压是2.5V左右。

 

测量的结果大小是没有问题的,可以读出大致准确的电压值。

输出的数据精度是有问题的,表现出数据的位宽随被测电压的大小而自动变化。

 

 

具体过程是这样:

用电阻0ADC芯片0,电阻1ADC芯片1。   0通道的电压是0.454左右,1通道的电压是2.5v左右

程序读出的数据0通道非常稳定,采样值在5956,5955,5954之间来回波动,分辨率可以达到1LSB,是有意义的16位数据。通道1的数据不够稳定,采样值在在32719,32655,32783之间来回波动,而且总是这几个数。这3个数相差正好是64==2^5,看起来就像ADC芯片变成了11位的AD

 

拔掉电阻,把电阻0接到ADC芯片1,电阻1接到ADC芯片0,交换了二个通道的电压, ADC0去检测2.5VADC1去检测0.45V. 

同样的程序读出的数据结果也反了过来,ADC0的数据以64LSB的间隔波动,而ADC1的数据以1LSB的间隔波动。

 

至于在什么电压下数据的分辨率开始变化,以及会出现多大程度的变化,还没有进一步测试。

 

 

总体说来就是测量低电压比测量高电压输出数据的分辨率更高。



下面是ADC读数的驱动代码。

 

u16 ADC_ReadWord(u8 ch)

{

u8 clk_cnt,bit_cnt;

u16 dout_word=0;

ADC_SpiRstAll();

 

ADC_CS(ch,CS_L);  //拉低对应的片选线,开始一次转换

ADC_SpiDly(ADC_SPI_DLY);

 

for(clk_cnt=0;clk_cnt<5;clk_cnt++)

{

ADC_CLK_H;

ADC_SpiDly(ADC_SPI_DLY);

ADC_CLK_L;

ADC_SpiDly(ADC_SPI_DLY);

}

 

for(bit_cnt=0;bit_cnt<16;bit_cnt++) //读取16bit的转换值

{

u8 lvl = 0;

ADC_CLK_H;

ADC_SpiDly(ADC_SPI_DLY);

ADC_CLK_L;

ADC_SpiDly(ADC_SPI_DLY);    //DOUT电平在下降沿读取

dout_word = dout_word << 1;   //MSB在前

 

lvl = ADC_ReadBit(ch);

if(1 == lvl)

{

dout_word |= 0x0001;

}

else if(0 == lvl)

{

dout_word &= 0xFFFE;

}

}

 

ADC_SpiDly(ADC_SPI_DLY);

ADC_CS(ch,CS_H);  //拉对应高片选线,停止本次转换

return(dout_word);

}

 

 

您能否帮忙看下是否是驱动代码的时序做错了。如果驱动没有问题的话,那是不是这个芯片需要一些额外的配置或者辅助的器件?

結果