在调试ADS1258中遇到的问题:
通过SPI读写ADS1258内部的寄存器均是正确的,
但是设置auto scan模式,读Vref的值时和预期的差别非常大(读到的值在1E0A16H左右跳动,跳动在最低二位,或其他范围内跳动),
在断电后再次上电时,用上述方法去读VREF,其值与前一次加电时读到的值偏差非常多,和上一次相比有可能倒数第四位都变化了,希望能够有技术支持,是ADS1258没有初始化好吗,还是别的愿意?
电路设计中,ADC的参考电压VREFP=2.5V,VREFN接地,AVDD是5V,DVDD是3.3V,ADC的输入全部设为单端输入,
初始化过程是按照手册上的说明进行设置的,手册P42的CONFIGURATION GUIDE
MAN SUPER:
没有人来支持吗!这个问题我折腾好久了,还是没有搞定!
John11513:
VREF读出值1E0A16H表示外部参考电压是2.503V,和您实际所用的基准电压相符,因此可以认为此功能是正常的。此项功能仅用于粗略监视外部参考是否正常,因此,精度不会很高。据手册,此ADC的最高有效位数是21.6位,因此,您观察到的最低两位跳动可能是正常的噪声表现。
断电后再次上电VREF读数值偏差较大,我怀疑是基准电压尚未稳定造成的。外部VREF是用一个内部基准进行测量的。外部VREF也好,内部基准也好,在断电-上电循环后,不会立即稳定到一个精确值,需要一定的稳定时间。若在VREF或内部基准尚未稳定的情况下就去测量VREF,就会出现您观察到的现象。
MAN SUPER:
回复 John11513:
请问如何通过1E0A16H这个值计算出来2.503V?手册里没有相关说明啊!请指教,谢谢!
另一种情况:
我们在同样的模式下,读出vcc的电压值,在不理解VREF读出的数据情况下,单纯的按照比例计算(假设VREF的转换后的数据1E0A16H是正确的),得出VCC的电压确实是在5V左右,上述没有问题;同样模式下,在外部模拟输入引脚上接入一个3.0V的电压,但是读出的该通道的数据是错误的(即使按照比例计算,其电压也只有2.3V左右),不明白为什么??希望能够解答?
稍后会将内部寄存器的设置补上!
John11513:
回复 MAN SUPER:
DATA SHEET第26页给出了这个公式(EQUATION 9):
External Reference (V) =Code/786432
Vcc和VREF都可按这个公式计算,因为它们都是用内部基准测量的。但外部模拟电压不能用此公式计算,因为,测量外部模拟输入时,ADC所用的参考是外部参考VREF。测量外部模拟输入时,电压值按下式计算:
VIN=VREF*Code/780000h
Thanks,
MAN SUPER:
回复 John11513:
上面是图纸,寄存器设置如下,在AIN0上接一个2.5V的电压时,读出该通道的数据为0x130C67H(后二位数据在跳动),计算出的值约0.397V左右(依据公式:VIN=VREF*Code/780000h)。不知道是什么原因造成的,望能够支持,谢谢!
void init_ads1258(){// ads1258_readid(); spi_xmit(RESET_COMMAND); delay_loop(); spi_xmit(WRITE_REG|0x02); spi_xmit(WRITE_REG|0x100|0x70); spi_xmit(WRITE_REG|0x200|0x00); spi_xmit(WRITE_REG|0x300|0x00); #if 1 spi_xmit(WRITE_REG|0x400|0x01); spi_xmit(WRITE_REG|0x500|0x00); #endif spi_xmit(WRITE_REG|0x600|0x00); spi_xmit(WRITE_REG|0x700|0x00); spi_xmit(WRITE_REG|0x800|0x88); ads1258_readid(); #if 1 SpiaRegs.SPITXBUF = READ_REG | 0x000; while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { } ads1258_reg00 = SpiaRegs.SPIRXBUF; SpiaRegs.SPITXBUF = READ_REG | 0x100; while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { } ads1258_reg01 = SpiaRegs.SPIRXBUF; #endif}