Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 12.02.2017, 17:58  
ilya abakumov
Частый гость
 
Регистрация: 19.11.2010
Сообщений: 35
Сказал спасибо: 5
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
ilya abakumov на пути к лучшему
По умолчанию Кто работал с AD7731? Голову сломал...

Всем привет.

Считываю данные с 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;
}
Реклама:
ilya abakumov вне форума  
Непрочитано 16.02.2017, 20:46  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,447
Сказал спасибо: 96
Сказали Спасибо 318 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Кто работал с AD7731? Голову сломал...

Для некоторых устройств от AD последовательная запись 0xFF в определённом количестве приводит к сбросу устройства.
Godzilla82 вне форума  
Непрочитано 17.02.2017, 06:12  
ilya abakumov
Частый гость
 
Регистрация: 19.11.2010
Сообщений: 35
Сказал спасибо: 5
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
ilya abakumov на пути к лучшему
По умолчанию Re: Кто работал с AD7731? Голову сломал...

Сообщение от Godzilla82 Посмотреть сообщение
...последовательная запись 0xFF в определённом количестве приводит к сбросу устройства.
Спасибо, что отозвались, а то начал уже думать, что я в пустыне
Да, видел такой способ сброса 7731 в скетче для 7731 и ардуино. К сожалению, в этом скетче было все, кроме функции чтения данных
Я же делал сброс аппаратно, запись в регистры фильтра и режима и калибровка происходят правильно. Наверное, стоит попробовать и через 0xFF(4 раза подряд надо прописать). О результате расскажу. Пока идей никаких. Пересобрал схемку на другой макетке, результат тот же. Похоже, без анализатора не обойтись. Писал в техподдержку AD, заполнив длинный опросник, чтоб задать свой вопрос.
Через пару дней они ответили, прислав еще кучу вопросов, относящихся скорее к промышленной разработке, чем к потугам любителя:

To allow us to process your inquiry, please also provide us the following information:
University Email:
Timetable:
End application:
Final product:
Project name:
End customer:
Sub manufacture:
System Volume/Year:
Preferred distributor:

Просто шпионы какие-то, лучше бы пример рабочего кода прислали...
ilya abakumov вне форума  
Непрочитано 17.02.2017, 11:09  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,447
Сказал спасибо: 96
Сказали Спасибо 318 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
По умолчанию Re: Кто работал с AD7731? Голову сломал...

Сообщение от ilya abakumov Посмотреть сообщение
Да, видел такой способ сброса 7731 в скетче для 7731 и ардуино. К сожалению, в этом скетче было все, кроме функции чтения данных
Это я всё к тому, что при чтении данных с АЦП вы в нее как раз и пишите 4 этих самых 0xFF.



PHP код:
unsigned long int RDn_AD7731(unsigned char len)
{
unsigned long int rx;
unsigned char k;

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

Godzilla82 вне форума  
Непрочитано 17.02.2017, 13:23  
ilya abakumov
Частый гость
 
Регистрация: 19.11.2010
Сообщений: 35
Сказал спасибо: 5
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
ilya abakumov на пути к лучшему
По умолчанию Re: Кто работал с AD7731? Голову сломал...

Сообщение от Godzilla82 Посмотреть сообщение
при чтении данных с АЦП вы в нее как раз и пишите 4 этих самых 0xFF
Интересное предположение. Однако перед чтением из регистра данных в регистр связи заносится соответствующий байт - 0х11, который определяет, что следующим будет чтение по SPI регистра данных в соответствии с выбранным размером: 16 или 24 бита. А для SPI все равно, какими битами будет "вытолкнуто" содержимое регистра данных. В найденном примере сброса через 4 штуки подряд 0xFF они записываются в регистр связи. Ну и трех 0xFF, как у меня, маловато будет - регистр данных всего 3 байта. Реально сброса также не происходит: сохраняются установленные мной значения регистров фильтра и режима, калибровочные к-ты. Так что ошибка в чем-то другом. Но попробовать "толкать" ноликами стоит. Проверю - отпишусь. Заодно посмотрю, работает ли сброс через запись в регистр связи четырех 0xFF (в даташите такого не нашел).
Спасибо вам за проявленный интерес.
ilya abakumov вне форума  
Непрочитано 17.02.2017, 13:49  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Кто работал с AD7731? Голову сломал...

Сообщение от ilya abakumov Посмотреть сообщение
в даташите такого не нашел
Плохо искали... Страница 13.

Цитата:
In situations where the interface sequence is lost, a write operation of at least 32 serial clock cycles with DIN high, returns the AD7731 to this default state by resetting the part
AR_Favorit вне форума  
Непрочитано 17.02.2017, 21:35  
ilya abakumov
Частый гость
 
Регистрация: 19.11.2010
Сообщений: 35
Сказал спасибо: 5
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
ilya abakumov на пути к лучшему
По умолчанию Re: Кто работал с AD7731? Голову сломал...

Сообщение от AR_Favorit Посмотреть сообщение
Плохо искали...
Спасибо за подсказку. Я особо и не искал, так как нужды в таком сбросе не вижу: начальный сброс аппаратный, а последовательность интерфейса, для восстановления которой и нужны "32 serial clock cycles with DIN high" как будто и не нарушается, т.к. остальные регистры безотказно читаются-пишутся в любой момент. Опять же схемы работы с АЦП, приведенные в ДШ, не предусматривают постоянные reset`ы после каждой операции чтения, да и странно это было бы по меньшей мере.
Но чем AD не шутит... А ведь где-то я уже встречал частное мнение, что 7731 требует постоянного сброса... но это ж дикость какая-то! А как определить , что последовательность интерфейса нарушена и нужен сброс?
ilya abakumov вне форума  
Непрочитано 18.02.2017, 00:22  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,447
Сказал спасибо: 96
Сказали Спасибо 318 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Кто работал с AD7731? Голову сломал...

Тут речь идёт не о том, что АЦП требует постоянного сброса, а о том, что сброс (возможно) происходит во время чтения данных (из-за того, что вы постоянно пишите туда 1).

Например, в режиме непрерывного чтения, нахождение вывода DIN в логической единице при 32 импульсах CLK приведёт к сбросу.

Для исбежания сбоя SPI нужно после каждого чтения данных поднимать CS.

P.S. Пробовали нули писать для чтения данных? Помогло?
Godzilla82 вне форума  
Непрочитано 18.02.2017, 00:22  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Кто работал с AD7731? Голову сломал...

Сообщение от ilya abakumov Посмотреть сообщение
А ведь где-то я уже встречал частное мнение, что 7731 требует постоянного сброса... но это ж дикость какая-то!
У меня давно уже было одно устройство с кучей AD-шных АЦП (каких, уже не упомню, давно дело было, 16 штук по SPI), так вот, были случаи "зависания" АЦПшек. С причинами так и не разобрался, оказалось проще постоянно их инитить... Даже и не знал тогда, что у кого-то такая проблема тоже есть, был уверен, что сам где-то накосячил, а времени и особого желания разбираться не было (одноразовое устройство типа демонстрационного стенда)...

Но там я именно сам резетил их, а не "само получалось")
AR_Favorit вне форума  
Непрочитано 18.02.2017, 00:31  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,447
Сказал спасибо: 96
Сказали Спасибо 318 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Кто работал с AD7731? Голову сломал...

Сообщение от AR_Favorit Посмотреть сообщение
были случаи "зависания" АЦПшек. С причинами так и не разобрался, оказалось проще постоянно их инитить...
Виснут, сволочи, причём очень часто. Правда, от электромагнитных помех.

Тоже вылечилось переинициализацией перед считыванием данных.
Godzilla82 вне форума  
 

Закладки

Метки
ad7731
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите опознать DIP8 по схеме включения (регистр, тригер всю голову сломал) remote2002 TTL и CMOS логика 1 02.11.2016 15:12


Часовой пояс GMT +4, время: 22:21.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot