咨询一下关于ADS8345的问题;
问题1:
switch(temp)
{
case 0: tempk = 0x87; break;
case 1: tempk = 0x97; break;
case 2: tempk = 0xA7; break;
case 3: tempk = 0xB7; break;
case 4: tempk = 0xC7; break;
case 5: tempk = 0xD7; break;
case 6: tempk = 0xE7; break;
case 7: tempk = 0xF7; break;
default: break;
}
正常的通道选择如上面的代码,但是在做八路循环检测的时候,却成了。硬件通道1输入,显示数据出现在4通道,硬件通道2输入,显示数据出现在1通道。。。等等,只有0通道和7号通道是显示与通道正确对应的。
问题2:
输入0.560V,循环测试显示集中在0.553V,并且循环数据不稳定,上下波动能到达10mV左右。
附上ADS8345读写函数和电路图:
unsigned int Read_ADS8345(unsigned char byte)
{
unsigned char temp,tempk;
unsigned int tempdata = 0;
DDRF = 0XFD;
PORTF = 0XF0;
temp = byte;
switch(temp)
{
case 0: tempk = 0x87; break;
case 1: tempk = 0x97; break;
case 2: tempk = 0xA7; break;
case 3: tempk = 0xB7; break;
case 4: tempk = 0xC7; break;
case 5: tempk = 0xD7; break;
case 6: tempk = 0xE7; break;
case 7: tempk = 0xF7; break;
default: break;
}
AD8345_clock_clr;
AD8345_datain_clr;
AD8345_cs_set;
delay_nus(1);
AD8345_cs_clr;
delay_nus(1);
for(temp = 0;temp < 8;temp++) //发控制字,收转换数据
{
if(tempk & 0x80) AD8345_datain_set; //输出控制字
else AD8345_datain_clr;
tempk <<= 1;
AD8345_clock_set; //产生一个时钟,上升沿
delay_nus(1); //上升沿写入数据
AD8345_clock_clr;
delay_nus(1);
}
AD8345_datain_clr;
AD8345_clock_clr;
delay_nus(50);
for(temp = 0;temp < 24;temp++) //发控制字,收转换数据
{
AD8345_clock_set;
delay_nus(5);
AD8345_clock_clr;
delay_nus(5);
if(AD8345_read_data)
tempdata |= 0x01; //读数据端口,获取转换值
else
tempdata &= 0xfffe;//CLR_BIT(tempdata,0);
if(temp<16)tempdata <<= 1;
delay_nus(1);
}
delay_nus(1);
AD8345_cs_set;
return tempdata;
}
自己补充一下:
下面是我在4号口接0.560V电压的采样值:
A0-A7是8个通道
1. 建议检查串行输入以及输出管脚与对应的时钟信号关系;
2. 检查电压基准是否稳定干净,最好在REF管脚就近处放置4.7uF独石电容