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