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; }