Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
12.02.2017, 17:58
|
|
Частый гость
Регистрация: 19.11.2010
Сообщений: 35
Сказал спасибо: 5
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Кто работал с 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;
}
|
|
|
|
16.02.2017, 20:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Кто работал с AD7731? Голову сломал...
Для некоторых устройств от AD последовательная запись 0xFF в определённом количестве приводит к сбросу устройства.
|
|
|
|
17.02.2017, 06:12
|
|
Частый гость
Регистрация: 19.11.2010
Сообщений: 35
Сказал спасибо: 5
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
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:
Просто шпионы какие-то, лучше бы пример рабочего кода прислали...
|
|
|
|
17.02.2017, 11:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
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=0; k‹len; k++ ) // чтение ответа из устройства { rx ‹‹= 8; // это зависит от порядка передаваемых байтов устройством rx |= spi( 0xFF ); // записать очередные 8 бит от slave в переменную } return rx; }
|
|
|
|
|
17.02.2017, 13:23
|
|
Частый гость
Регистрация: 19.11.2010
Сообщений: 35
Сказал спасибо: 5
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: Кто работал с AD7731? Голову сломал...
Сообщение от Godzilla82
|
при чтении данных с АЦП вы в нее как раз и пишите 4 этих самых 0xFF
|
Интересное предположение. Однако перед чтением из регистра данных в регистр связи заносится соответствующий байт - 0х11, который определяет, что следующим будет чтение по SPI регистра данных в соответствии с выбранным размером: 16 или 24 бита. А для SPI все равно, какими битами будет "вытолкнуто" содержимое регистра данных. В найденном примере сброса через 4 штуки подряд 0xFF они записываются в регистр связи. Ну и трех 0xFF, как у меня, маловато будет - регистр данных всего 3 байта. Реально сброса также не происходит: сохраняются установленные мной значения регистров фильтра и режима, калибровочные к-ты. Так что ошибка в чем-то другом. Но попробовать "толкать" ноликами стоит. Проверю - отпишусь. Заодно посмотрю, работает ли сброс через запись в регистр связи четырех 0xFF (в даташите такого не нашел).
Спасибо вам за проявленный интерес.
|
|
|
|
17.02.2017, 13:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
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
|
|
|
|
|
17.02.2017, 21:35
|
|
Частый гость
Регистрация: 19.11.2010
Сообщений: 35
Сказал спасибо: 5
Сказали Спасибо 8 раз(а) в 7 сообщении(ях)
|
Re: Кто работал с AD7731? Голову сломал...
Сообщение от AR_Favorit
|
Плохо искали...
|
Спасибо за подсказку. Я особо и не искал, так как нужды в таком сбросе не вижу: начальный сброс аппаратный, а последовательность интерфейса, для восстановления которой и нужны "32 serial clock cycles with DIN high" как будто и не нарушается, т.к. остальные регистры безотказно читаются-пишутся в любой момент. Опять же схемы работы с АЦП, приведенные в ДШ, не предусматривают постоянные reset`ы после каждой операции чтения, да и странно это было бы по меньшей мере.
Но чем AD не шутит... А ведь где-то я уже встречал частное мнение, что 7731 требует постоянного сброса... но это ж дикость какая-то! А как определить , что последовательность интерфейса нарушена и нужен сброс?
|
|
|
|
18.02.2017, 00:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Кто работал с AD7731? Голову сломал...
Тут речь идёт не о том, что АЦП требует постоянного сброса, а о том, что сброс (возможно) происходит во время чтения данных (из-за того, что вы постоянно пишите туда 1).
Например, в режиме непрерывного чтения, нахождение вывода DIN в логической единице при 32 импульсах CLK приведёт к сбросу.
Для исбежания сбоя SPI нужно после каждого чтения данных поднимать CS.
P.S. Пробовали нули писать для чтения данных? Помогло?
|
|
|
|
18.02.2017, 00:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Кто работал с AD7731? Голову сломал...
Сообщение от ilya abakumov
|
А ведь где-то я уже встречал частное мнение, что 7731 требует постоянного сброса... но это ж дикость какая-то!
|
У меня давно уже было одно устройство с кучей AD-шных АЦП (каких, уже не упомню, давно дело было, 16 штук по SPI), так вот, были случаи "зависания" АЦПшек. С причинами так и не разобрался, оказалось проще постоянно их инитить... Даже и не знал тогда, что у кого-то такая проблема тоже есть, был уверен, что сам где-то накосячил, а времени и особого желания разбираться не было (одноразовое устройство типа демонстрационного стенда)...
Но там я именно сам резетил их, а не "само получалось")
|
|
|
|
18.02.2017, 00:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Кто работал с AD7731? Голову сломал...
Сообщение от AR_Favorit
|
были случаи "зависания" АЦПшек. С причинами так и не разобрался, оказалось проще постоянно их инитить...
|
Виснут, сволочи, причём очень часто. Правда, от электромагнитных помех.
Тоже вылечилось переинициализацией перед считыванием данных.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:58.
|
|