ADS7841测量电压范围的问题
时间:10-02
整理:3721RD
点击:
ADS7841,4通道,12bit,VCC与Vref都是+5v,按说0-5v对应输出为0-4095,但是我测得的是0-2.5v对应的0-4095?2.5v以上又重新开始对应新一轮0-4095?(0-2.5v对应0-4095;2.5v-5v对应0-4095)
并且如果我只用通道0,其他通道悬置,其他通道上也会测得2v左右的电压,弄了好久没解决? 解决方案:俺来对照时序抓波形,才发现时钟移位的时候,少移了移位,导致测量的错误。
程序如下:
#include<reg52.h>
#include<intrins.h>
#define VALID 0
#define INVALID 1
sbit CS=P0^01;
sbit DCLK=P0^0;
sbit BUSY=P0^3;
sbit DIN=P0^2;
sbit DOUT=P0^4;
unsigned int ADS7841_Read_Data(unsigned char Channel) //Channel=0:CH0;1:CH1;2:CH2;3:CH3;
{
unsigned int ADCResult=0;
unsigned char DataInput=0;
unsigned char i,ADS7841_CHANNEL;
switch (Channel)
{
case 0:ADS7841_CHANNEL=0x10;break;
case 1:ADS7841_CHANNEL=0x50;break;
case 2:ADS7841_CHANNEL=0x20;break;
case 3:ADS7841_CHANNEL=0x60;break;
default:ADS7841_CHANNEL=0x10;break;
}
DataInput=0x80 | ADS7841_CHANNEL | 0x00 | 0x04 | 0x03;
//ADS7841_S|ADS7841_CHANNEL|ADS7841_MODE|ADS7841_ SGL_DIF|ADS7841_POWER_DOWN
DCLK=0;
DIN=0;
CS=VALID;
for(i=0; i<8; i++)
{
DIN=DataInput&0x80;
DataInput=DataInput<<1;
DCLK=0;
_nop_();
DCLK=1; //模拟SPI串行接口 发送数据
}
_nop_();
DCLK=0;
while(BUSY)
{
_nop_();
DCLK=1;
_nop_();
DCLK=0;
} /*当BUSY脚由高变为低时,则开始数据输出*/
_nop_();
for(i=0;i<12;i++)
{
DCLK=1;
ADCResult=(ADCResult<<1)|DOUT; //模拟SPI串行接 口 接收数据
DCLK=0;
_nop_();
}
for(i=0;i<4;i++)
{
DCLK=1;
_nop_();
DCLK=0;
_nop_();
}
CS=INVALID;
return ADCResult;
}
使用串行总线的通信设备, 时序验证很重要. 这里也看到, 吸取楼主的教训
最近都是用并口的了,在高速芯片上,这个耽误事的
楼主我也遇到这个问题了,当ads7841没有输入电压的时候,竟然有输出,您是怎么解决的?
输入端口的电压输出是不是内部的多路选择器在切换通道时引入的?
如果是这样,这个电压几乎没有驱动能力,只要确保ADC的前级具有足够的驱动能力即可。
但是这个电压竟然被ad采样后输出了,这个怎么办
那你通过改变ADS7841寄存器的第6~4位的值,来禁用某几个不用的通道,这样多路选择器就不会选择那一路了。然后你再测量一下该通道的电压值看看?
