微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ADS7841测量电压范围的问题

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位的值,来禁用某几个不用的通道,这样多路选择器就不会选择那一路了。然后你再测量一下该通道的电压值看看?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top