|
使用12位的ADC TLV2544时读出的AD值总是和实际采集的电压值对应不上,有哪位用过请指点一二,不胜感谢!
#define TLV_SDO_BIT BIT0//PORTB INPUT 0
#define TLV_SDI_BIT BIT1//PORTB 1
#define TLV_SCLK_BIT BIT2//PORTB 1
#define TLV_EOC_BIT BIT3//PORTB EOC INPUT 0
#define TLV_CS_BIT BIT4//PORTB 1
//0xf6
#define PORT_TLV2544 PORTB
#define PIN_TLV2544 PINB
#define DDR_TLV2544 DDRB
#define TLV_CSTART_BIT BIT4//PORTA 1
void TLV2544_SCK(BYTE d)
{
if(d){
PORT_TLV2544 |= TLV_SCLK_BIT;
}
else{
PORT_TLV2544 &= ~TLV_SCLK_BIT;
}
}
void TLV2544_CS(BYTE d)
{
if(d){
PORT_TLV2544 |= TLV_CS_BIT;
}
else{
PORT_TLV2544 &= ~TLV_CS_BIT;
}
}
void TLV2544_CSTART(BYTE d)
{
if(d){
PORTA |= TLV_CSTART_BIT;
}
else{
PORTA &= ~TLV_CSTART_BIT;
}
}
//Write TLV2544
void TLV2544_SDI(BYTE d)
{
if(d){
PORT_TLV2544 |= TLV_SDI_BIT;
}
else{
PORT_TLV2544 &= ~TLV_SDI_BIT;
}
}
//======================================================================================
//======================================================================================
//写SDI的同时读取SDO数据
//上升沿发送、下降沿接收、高位先发送。
WORD WriteCmdToTLV2544(WORD d)
{
BYTE i, k;
WORD val=0;
TLV2544_SCK(0); /* 清SCK*/
TLV2544_CS(0); /* 清CS*/
for(i = 0; i < 16; i++) {
val<<=1;
k=PINB;
if(k &0x01 ){val |= 0x0001;}//读数据
if((d & (0x8000 >> i)) == 0){TLV2544_SDI(0);} /*写0*/
else {TLV2544_SDI(1);} /*写1*/
TLV2544_SCK(1); /*置SCK*/
TLV2544_SCK(0); /*清SCK*/
}
TLV2544_CS(1); /* 置 CS */
return(val);
}
void Init_TLV2544(void)
{
WORD wData;
DDRA =0xff;
DDRB = 0x0f6;
TLV2544_SCK(0); // 清SCK
TLV2544_CS(1); // 置 CS
wData = WriteCmdToTLV2544(0x0a000); /// 配置CFG,基准源为外部4V,单次模式,扫描=N/A,引脚为INT,
TLV2544_CS(1);
}
void Start_TLV2544_Adc(void)
{
WORD wData,k;
TLV2544_CSTART(1);
TLV2544_SCK(0); /* 清SCK */
TLV2544_CS(0); /* 清 CS */
TLV2544_CS(1); // 置 CS
wData = WriteCmdToTLV2544(0x0000); // 启动通道0转换
PT100AdcBuf[0]=(wData>>4);
TLV2544_CSTART(0); //用CSTART启动转换
Dly60us();
TLV2544_CSTART(1);
k=PINB;
while( k&(1<BIT3) ){k=PINB;} //等待ADC转换完成
wData = WriteCmdToTLV2544(0x0000); // 读取通道0上次的AD转换值
PT100AdcBuf[1]=(wData>>4);
TLV2544_CS(1); /* 置 CS */
}
WORD ReadCFR(void)
{
WORD wData;
TLV2544_CSTART(1);
TLV2544_SCK(0); /* 清SCK */
TLV2544_CS(0); /* 清 CS */
wData = WriteCmdToTLV2544(0x9000);
wData &= 0x0FFF;
TLV2544_CS(1); /* 置 CS */
return(wData);
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|