_abk_

Кто работал с AD7731? Голову сломал...

2 сообщения в этой теме

_abk_    4

Всем привет.

Считываю данные с AD7731 после готовности RDY и получаю медленно "плавающие" 3 младших полубайта из 6. При этом результат раза в 2,5 меньше, чем должен быть (измеряемое напряжение-часть опорного). Конфигурация АЦП и калибровка проходят успешно (считывал регистры до и после). SPI аппаратный. А вот с чтением не выходит каменный цветок. (CS, ессно, не забыт). При этом нулевое напряжение (вход - на землю) показывает почти правильно - но есть выбросы. "Висячий" вход дает 0хFFFFFF, как и должен бы. Перед работой с АЦП делаю принудительно сброс. Земля разведена правильно, от экземпляра AD не зависит, от источника опорного тоже. Все как в даташите. Реально голову сломал...
Может, у кого найдется пример рабочего кода? Или совет дельный?
В инете все облазил, нашел только вопросы неотвеченные... Для тех, кто в теме, ниже привожу код инициализации.

Скрытый текст

/ ================== инициализация АЦП ==================
void Init_AD7731()
{
CS_AD7731 = 0;

// ********************************************************************************** filter
WR_AD7731(0x03); // след. запись в регистр фильтра (2 байта)
WR_AD7731(0x61); // запись старшего байта в регистр фильтра
WR_AD7731(0xA0); // запись младшего байта в регистр фильтра /Это как пример в даташите

// ********************************************************************************** mode
WR_AD7731(0x02); // след. запись в регистр режима (2 байта)
WR_AD7731(0xB1); // запись старшего байта в регистр режима (unipol, 24bits,Internal FULL-SCALE Calibration)
WR_AD7731(0x71); // запись младшего байта в регистр режима (Uref=2,5V, Uin=0...1,28V, AIN1-AIN6)
while(RDY_AD7731);

WR_AD7731(0x02); // след. запись в регистр режима (2 байта)
WR_AD7731(0x91); // запись старшего байта в регистр режима (unipol, 24bits,Internal ZERO Calibration)
WR_AD7731(0x71); // запись младшего байта в регистр режима (Uref=2,5V, Uin=0...1,28V, AIN1-AIN6)
while(RDY_AD7731);

WR_AD7731(0x02); // след. запись в регистр режима (2 байта)
WR_AD7731(0x31); // запись старшего байта в регистр режима (unipol, 24bits, непрерывное преобразование)
WR_AD7731(0x71); // запись младшего байта в регистр режима (Uref=2,5V, Uin=0...1,28V, AIN1-AIN6)
while(RDY_AD7731);

CS_AD7731 = 1;
}

// ================== запись байта в регистр ===================
void WR_AD7731(unsigned char byte)
{
spi(byte);
}


// ================== чтение len байтов из регистра данных ===================
unsigned long int RDn_AD7731(unsigned char len)
{
unsigned long int rx;
unsigned char k;

rx=0;
for( k=0; k<len; k++ ) // чтение ответа из устройства
{
rx <<= 8; // это зависит от порядка передаваемых байтов устройством
rx |= spi( 0xFF ); // записать очередные 8 бит от slave в переменную
}
return rx;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
_abk_    4

Ау-у-у... ADивайщики матерые, где вы?..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас