使用二片AD7683独立进行温度的测量,VDD供电由5V的LDO提供,参考电压由一片ADR02共同提供。IN-接地,IN+分别接测量电压。被测量电压理论上的范围是0到5V.
测试时使用的恒定的电阻代替实际的ntc电阻,一个通道的电压是0.454V左右,另一个通道的电压是2.5V左右。
测量的结果大小是没有问题的,可以读出大致准确的电压值。
输出的数据精度是有问题的,表现出数据的位宽随被测电压的大小而自动变化。
具体过程是这样:
用电阻0接ADC芯片0,电阻1接ADC芯片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.5V,ADC1去检测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);
}
您能否帮忙看下是否是驱动代码的时序做错了。如果驱动没有问题的话,那是不是这个芯片需要一些额外的配置或者辅助的器件?
