各位专家,使用ADS1256中的三个通道作定时采集,采样率30Ksps,单端输入,AINCOM接2.5V参考电压,其余输入端悬空。测试中,arm芯片开始能正常读到数据,但偶尔会三个通道的采样值相互串,第一个通道串得频些,数据正常(测试中,3个通道接了3个不同的电压)。但时间长了(40分钟)以后,三个通道采集的数据则都出现问题,得到的不再是接入的参考电压值了。请问专家,这是哪里出了问题?
- 附AD程序:
void AD1256Init()
{
//*************自校准****************
- while(DRDY);
- PCout(2)=0;
- SPI3_ReadWriteByte(adSELFCAL);
- while(DRDY);
- PCout(2)=1;
- //**********************************
- ADS1256WREG(REG_STATUS,0x04); // 高位在前、使用缓冲
- ADS1256WREG(REG_ADCON,PGA_2); // 放大倍数2
- ADS1256WREG(REG_DRATE,DATARATE_30K); // 数据30Ksps
- ADS1256WREG(REG_IO,0x0E);
- while(DRDY);
- PCout(2)=0;
- SPI3_ReadWriteByte(adSELFCAL);
- while(DRDY);
- PCout(2)=1;
}
signed int ReadADConvertData(unsigned char channel)
{
- unsigned int sum=0;
- while(DRDY);//当ADS1256_DRDY为低时才能写寄存器
- ADS1256WREG(REG_MUX,channel); //设置通道
- delay_us(2);
- PCout(2) = 0;
- SPI3_ReadWriteByte(adSYNC);
- delay_us(2);
- SPI3_ReadWriteByte(adWAKEUP);
- delay_us(2);
- SPI3_ReadWriteByte(adRDATA);
- delay_us(10);
- sum |= (SPI3_ReadWriteByte(0xff) << 16);
- sum |= (SPI3_ReadWriteByte(0xff) << 8);
- sum |= SPI3_ReadWriteByte(0xff);
- PCout(2) = 1;
- if (sum>0x7FFFFF) // if MSB=1,
- {
- sum -= 0x1000000; // do 2's complement
- }
- return sum;
}
void ADS_Results(float res[3])
{
- int Result,i;
- for(i = 0;i <= 2;i++)
- {
- Result = ReadADConvertData( (i << 4) | NEGTIVE_AINCOM);
- res[((i & 0x07)>0)?((i & 0x07) – 1):2] = Result*2.9802325940409414817025043609744e-7;
- }
}
另外,在AD之前运用opa4277作信号处理(滤波及加法电路),运放的供电正常,但发热很厉害,烫手。这是为什么?
user151383853:
我觉得你的测试, 最好不要采集悬空的通道.
运放发热厉害, 这一定有问题, 试试运放后串个小电阻再接采样
zhiqiang li1:
回复 user151383853:
测试时,没有采集悬空通道,对于采集的数据,时间长了就得不到正常数据,请问专家,有什么解决方案!或者说是什么问题呢?
Kailyn Chen:
回复 zhiqiang li1:
我想,一开始能正常采集数据,硬件软件应该都没问题。时间长了不准确,芯片是否有发烫现象?
采集之间相互串扰,那么layout方面有将模拟信号和数字信号分开?各自参考模拟地和数字地?
zhiqiang li1:
回复 Kailyn Chen:
数字地和模拟地没有分开,芯片也没有发烫,每次出问题后,复位系统就又正常了。