关于AD转换的问题
时间:10-02
整理:3721RD
点击:
用的转换芯片为ADS1230。
要采集的信号为7mV时,转换数据为0x114左右,采集信号为14mV时,转换数据为0x1183左右。
为了方便,参考电压和供电电压都是3.3V的,根据芯片资料,AD转换范围是正负3.3/2/64=25.87mV。
这个芯片是20bit的AD转换。0----25.87mV对应的数字量应该是0----0x7FFFF。这是怎么回事?
附上程序:
//初始化ADS1230
void ADinit( void )
{
ADpdwn = 1;
Device_Clk_Delay( 40 );
ADpdwn = 0;
Device_Clk_Delay( 1000 );
ADpdwn = 1;
Device_Clk_Delay( 400 );
ADsclk = 0;
}
//读取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;
}
要采集的信号为7mV时,转换数据为0x114左右,采集信号为14mV时,转换数据为0x1183左右。
为了方便,参考电压和供电电压都是3.3V的,根据芯片资料,AD转换范围是正负3.3/2/64=25.87mV。
这个芯片是20bit的AD转换。0----25.87mV对应的数字量应该是0----0x7FFFF。这是怎么回事?
附上程序:
//初始化ADS1230
void ADinit( void )
{
ADpdwn = 1;
Device_Clk_Delay( 40 );
ADpdwn = 0;
Device_Clk_Delay( 1000 );
ADpdwn = 1;
Device_Clk_Delay( 400 );
ADsclk = 0;
}
//读取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;
}
顶上去啊,来人啊
继续顶上去
有没有人给点建议?
周末人好少啊
看不懂
快被遗忘了
周一了,都应该上班了吧
7mV 对应0x114
14mV,对应0x1183
这种AD是线性的吧,你觉得能这么对应么?
就是因为觉得不能这么对应啊,不过又找不到问题。
AD是串行输出,对应了一下时序也没发现问题。
如果时序有问题,应该接收不到数据吧。
论坛有没有用过这个芯片的啊。