ADS1230的问题
用ADS1230采集3吨称重传感器的数据。
调试的时候用电阻和电位器搭了一个模拟传感器输出差分信号的电路,此时测量出来的差分电压准确。不过都是在静态下测的,也就是输出的差分信号是一个固定电压值,每次都只是测量这个固定的电压。
实际测量时,称重传感器输出的是渐变的信号,随着压力的增大,实时采集压力值。但是此时ADS1230就不能正常工作了,采集回来的值不准确,甚至直接是7FFFF。电路采用的datasheet上的推荐电路,后来甚至按照TI的ADS1230评估板搭了一个电路,也是如此。
什么原因会导致采集静态的差分信号正常,而当差分信号动态变化时就不正常呢?
下面是数据采集程序。每次采集都会等待ADS1230输出转换结果。
设置的芯片AD转换速率是80SPS。
我的ADS1230是在单独的一块小板上,通过接线和主控板相连。
最最无法理解的是:最开始的一块小板可以正常工作,但是其后几块小板都是我说的问题。我的程序就是在最开始的那块能工作的小板上用的。
//读取ADS1230的转换结果
unsigned long ADconvert( void )
{
unsigned long ulResult = 0;
unsigned int uiTemp = 0;
unsigned char ucTemp = 0;
unsigned char i = 0;
unsigned char j = 0;
ADsclk = 0;
for( j = 0 ; j < 30 ; j++ );
while( 1 )
{
PCA0CPH4 = 0;
if( ADdout == 0 ) //确认AD转换是否完成
{
for( j = 0 ; j < 180 ; j++ );
for( i = 0 ; i < 12 ; i++ ) //读高12位数据
{
ADsclk = 1;
for( j = 0 ; j < 30 ; j++ );
if( ADdout == 1 )
{
uiTemp = ( uiTemp << 1) | 0x0001;
}
else
{
uiTemp = uiTemp << 1;
}
ADsclk = 0;
for( j = 0 ; j < 30 ; j++ );
}
for( i = 0 ; i < 8 ; i++ ) //读低8位数据
{
ADsclk = 1;
for( j = 0 ; j < 30 ; j++ );
if( ADdout == 1 )
{
ucTemp = ( ucTemp << 1) | 0x01;
}
else
{
ucTemp = ucTemp << 1;
}
ADsclk = 0;
for( j = 0 ; j < 30 ; j++ );
}
ADsclk = 1; //发送第21个时钟脉冲,使ADS1230芯片的DOUT输出拉高
for( j = 0 ; j < 30 ; j++ );
ADsclk = 0;
for( j = 0 ; j < 30 ; j++ );
// ADdout = 1;
// for( j = 0 ; j < 30 ; j++ );
PCA0CPH4 = 0;
break;
}
}
ulResult = uiTemp;
ulResult = ulResult << 8;
ulResult = ulResult | ucTemp;
return ulResult;
}
我有鼓捣了一下。
利用断点调试,可以读到转换的AD值,反复读取,值会变小。同一电压,一般最先读取的二进制数大,以后读取的都逐渐变小,当然最大和最小也就差不到16,可能差10左右。
后来为了直观一点,接了液晶屏,把采集到的值按照对应压力值显示出来。
奇怪的是,第一次上电后,我调节电位器,还能够显示力值从小变大,当压力值达到90公斤时,单片机会发送脉冲给步进电机驱动器,这里没有接驱动器,并且显示界面会变一下,就是把显示的压力值数字形状变大而已。但是这以后采集数据就出错了,显示力值不准。并且断电后,再上电,调节电位器,当压力值小于90公斤时,也无**确显示,采集的值不准。
后来我又使用断电调试,采集固定差分电压还是没有问题的。
完全不知如何应对啊。
我已经改为直接读取20位了。
我的硬件是本来有一块主控板,然后单独做了一个ADS1230的小板,中间接线来采集数据。
最开始有一块ADS1230小板是正常工作的,但是后面焊的同样的小板就不行,主控板还是同一块。
至于程序的采集和显示控制逻辑,换成HX710的小板是可以正常工作的。
由于后面焊的小板都不行,我后来照着TI的评估板电路做了一个小板,也是同样的现象。
电路图就是照着评估板来的。
20bit的ADC,能够敏感地读出电压的波动。排除纹波噪声等因素,所以即使你用其他仪器测不变的电压值,ADS1230测出来的值也是有可能是有变化的。