AD7708 молчит

Привет всем

Пытаюсь AD7708 "запустить". Схема измерителя температуры на ТСП. Вместо ТСП установлен резистор 120 Ом. Ток 200 мкА. Так вот, вне зависимости от сопротивления этого резистора, хоть 120 Ом, хоть

0 Ом, АЦП передает нули. Это если усиление 32, если 128, то переполнение(FFFF), что, в общем, похоже на правду.

Облазил все АЦП, все напряжения в норме. Опорное примерно 1.05 В. Питание

4.9В. Связь по SPI проверил чтением ID регистра. Работает. Калибровка по усилению проходит, проверил соответствующее значение в регистре кал. усиления. Оно имеет значение отличное от умолчания. Калибровка по смещению трудно сказать, значение в регистре кал. смещение не изменилось(8000Н).

Буду очень признателен за исходники инициализации и работы с этим АЦП. День уже бьюсь не могу понять где грабли, софт или железо.

Инициализация у меня такая

#define MODE_2 0x52 //0101.0010 /chop-0 negbuf-0 refsel-0 chcon-1 oscpd-0 md02-010(single mode) #define MODE_INT_ZS_CALIBR1 0x54 //0101.0100 /chop-0 negbuf-0 refsel-0 chcon-1 oscpd-0 md02-100 //(internal zero scale calibration) #define MODE_INT_FS_CALIBR1 0x55 //0101.0101 /chop-0 negbuf-0 refsel-0 chcon-1 oscpd-0 md02-101 //(internal full scale calibration) #define CONTROL_1 0x0A //0000.1010 /CH03-0000 U/B-1 RN02-010 #define FILTER_1 0xFF // 5.35 Hz

#define ReadTest1Reg 0x47 //0100.1100 read test register #define ReadTest2Reg 0x4D //0100.1101 read test register #define ReadIDReg 0x4F //0100.1111 read ID register #define ReadStatusReg 0x40 //0100.0000 read status register #define ReadModeReg 0x41 //0100.0001 read mode register #define WriteModeReg 0x01 //0000.0001 write mode register #define ReadControlReg 0x42 //0100.0010 read control register #define WriteControlReg 0x02 //0000.0010 write control register #define WriteFilterReg 0x03 //0000.0011 write filter register

#define ReadIOReg 0x47 //0100.0111 read IO register #define WriteIOReg 0x07 //0000.0111 write IO register

#define ReadDataReg 0x44 //0100.0100 read data register 16 bit

#define ReadOffsetReg 0x45 //0100.0101 read offset register 16 bit #define WriteOffsetReg 0x05 //0000.0101 write offset register 16 bit #define ReadGainReg 0x46 //0100.0110 read gain register 16 bit #define WriteGainReg 0x06 //0000.0110 write gain register 16 bit

#define RESET0 PORTD &= 0xF7; #define RESET1 PORTD |= 0x08;

................................................... RESET0; for (Data=6500; Data!=0;Data--); for (Data=6500; Data!=0;Data--); for (Data=6500; Data!=0;Data--); RESET1; for (Data=6500; Data!=0;Data--);

SPDR = WriteIOReg; while((SPSR & 0x80)==0);

SPDR = 0; while((SPSR & 0x80)==0);

SPDR = WriteFilterReg; while((SPSR & 0x80)==0);

SPDR = FILTER_1; while((SPSR & 0x80)==0);

SPDR = WriteControlReg; while((SPSR & 0x80)==0);

SPDR = CONTROL_1; while((SPSR & 0x80)==0);

// установка режима калибровка нуля SPDR = WriteModeReg; while((SPSR & 0x80)==0);

SPDR = MODE_INT_ZS_CALIBR1; while((SPSR & 0x80)==0);

for(t=100; t!=0;t--); while(DRDY==0);

// установка режима калибровка полной шкалы SPDR = WriteModeReg; while((SPSR & 0x80)==0);

SPDR = MODE_INT_FS_CALIBR1; while((SPSR & 0x80)==0);

for(t=100; t!=0;t--); while(DRDY==0);

............................................................

Далее в обработчике прерывания таймера, раз в секунду делаю:

SPDR = WriteModeReg; // запуск преобразования while((SPSR & 0x80)==0);

SPDR = MODE_2; while((SPSR & 0x80)==0);

for(t=100; t!=0;t--); while(DRDY==0);

SPDR=ReadDataReg; // запрос на чтение данных из регистра while((SPSR & 0x80)==0); //ожидание окончания передачи байта

SPDR=0; //читаем старший байт данных while((SPSR & 0x80)==0); msb=SPDR;

SPDR=0; //читаем младший байт данных while((SPSR & 0x80)==0); lsb=SPDR;

............................................................

Reply to
Oleg Tkachenko
Loading thread data ...

Привет всем

Разобрался. Спутал REF- с REF+. :)

Ткаченко Олег

Reply to
Oleg Tkachenko

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.