Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AD7738 как ее правильно сконфигурировать
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Метрология, датчики, измерительная техника
Pat
Уважаемые, что то совсем впал в уныние с AD7738.
Подключил ее к SSC интерфейсу AT91SAM7S256.
Конфигурирую ее.
Устанавливаю частоту выборки 8500 Гц
Устанавливаю режим преобразования “Continuous Conversion Mode”
Включаю первый канал
Устанавливаю режим непрерывного чтения. Continuous Read mode
Даю команду чтения первого канала.

После этого на выходе готовности данных RDY появляются импульсы.
Так и должно быть, ну а дальше совсем все плохо.
По отрицательному импульсу RDY читаю данные.
По описанию (да и по опыту с AD7705) во время чтения данных на входе RDY должен установится высокий уровень. НО этого не происходит, высокий уровень устанавливается только при очередном внутреннем преобразовании.
На последовательном выходе данных постоянно висит 0.

Все сигналы уже проверил сотню раз вроде все нормально.
Уж и не знаю, на что грешить, может у кого есть пример инициализации данной микросхемы.
Буду очень благодарен.
DS
DI должен быть в 0 во время операции чтения. В DUMP еще добавляется впереди байт состояния канала. Если читаете по байтно и CS дергается во время чтоения - смотрите внимательно га временные диаграммы. Если CLK в момент переключения CS не соответствует диаграмме, команда сбрасывается.

И еще - RDY в DUMP mode сбрасывается после чтения регистра статуса, а не сразу.

Подробнее напишите, что Вы пишите в АЦП.
Pat
Цитата(DS @ Nov 23 2006, 19:37) *
DI должен быть в 0 во время операции чтения. В DUMP еще добавляется впереди байт состояния канала.

DI во время чтения постоянно равен 0
Режим DUMP не включен (да и включал его результат тот же)

Цитата(DS @ Nov 23 2006, 19:37) *
Если читаете по байтно и CS дергается во время чтения - смотрите внимательно га временные диаграммы. Если CLK в момент переключения CS не соответствует диаграмме, команда сбрасывается.


Вначале дергал CS при доступе. Сейчас для чистоты эксперимента он всегда равен 0

Цитата(DS @ Nov 23 2006, 19:37) *
Подробнее напишите, что Вы пишите в АЦП.


// Сбрасываем АЦП
reset_AD7738();

// Устанавливаем на входе CS = 0 (AD7738 )
pa_pin_clear(TF);

// Задержка
Sleep(50);

// Устанавливаем входное напряжение от 0 до 2.5 В
// Включаем первый канал
write_reg((COMM_REG | (CH_SETUP_REG | CH0)),(P_25V | ENABLE_CH));

// Задержка
Sleep(50);

// Устанавливаем частоту преобразования с Chop Enable Bit.
write_reg((COMM_REG | (CH_TIME_REG | CH0)),0x84);

// Задержка
Sleep(50);

// Устанавливаем MODE регистр
// Continuous Conversion Mode
// Continuous Read mode
write_reg(0x38,0x24);

// Производим первоначальное чтение канала 1
write_reg(0x48,0x00);

От всех этих манипуляций впечатление такое что на запись все работатет
По крайней мере на выходе RDY появляются импулься.
Причем если записать другое значение в TIME регистр то частота этих импульсов меняется
и она равна расчетной частоте.
Вот чтение никак не хочет работать
DS
А что подразумевается под write_reg(0x48,0x00) - Ведь надо записать 0х48, потом выдать еще 16/24 clkов при 0 на DI.
Pat
Цитата(DS @ Nov 23 2006, 20:23) *
А что подразумевается под write_reg(0x48,0x00) - Ведь надо записать 0х48, потом выдать еще 16/24 clkов при 0 на DI.


Может в этом и причина.
Дело в том что я записываю вначале 0х48 потом 0х00.
После чего жду следующего RDY и считываю 16 бит данных
Спасибо за наводку.
Завтра проверю на работе
Roma_te
Цитата(Pat @ Nov 23 2006, 22:55) *
Может в этом и причина.

Как успехи (У меня очень похожая проблема)? Напишите удалось запустить и в чем причина...
DS
Конкретно в чем проблема ?
Pat
Цитата(DS @ Dec 9 2006, 08:36) *
Конкретно в чем проблема ?


Я немного пожалуюсь. До чего дошол.
Короче все заработало как сделал правильную последовательность чтения, но
читает только служебные регистры а в регистрах данных нули.
Подаю на вход одного из каналов сигнал все по барабану читает только 0.
Пробовал разные каналы и варианты настроек регистров.
Убил опять кучу времени все впустую.
Потом оторвал 2 ноги выхода мультиплексора, и подал прямо на вход буфера и о чудо все заработало.
Правда сдвиг вылезает но по крайней мере есть зависимость от поданного напряжения.

Пришол к выводу что по какой то причине не работатет мультиплексор.


Пока прекратил дальнейшие исследования (чего то не могу купить второй AD7738 чтобы проверить).

По ходу вопрос не было ли у вас такой беды как не работающий мультиплексор?
Может конечно сам что не так делаю, но очень много беспокойства с этоим АЦП у меня вышло?
DS
Не наблюдал никаих глюков с коммутатором. Вряд ли один коммутатор сгорел, так что все остальное работает. Скорее все запрограммировано так, что имеется - переполнение.
Что у Вас запрограммировано - дифференциальные входы или нет. Если нет, то что с режимом AINCOM ?
Опишите напряжения на входах и режимы АЦП и коммутутора(регистры I/O и channel setup), что в channel status (бит переполнения случайно не 1 ?) , так не угадать, что не правильно.
Pat
Извиняюсь, уезжал на неделю.

Цитата(DS @ Dec 10 2006, 17:08) *
Не наблюдал никаих глюков с коммутатором. Вряд ли один коммутатор сгорел, так что все остальное работает. Скорее все запрограммировано так, что имеется - переполнение.
Что у Вас запрограммировано - дифференциальные входы или нет. Если нет, то что с режимом AINCOM ?
Опишите напряжения на входах и режимы АЦП и коммутутора(регистры I/O и channel setup), что в channel status (бит переполнения случайно не 1 ?) , так не угадать, что не правильно.


Попробую описать настройку АЦП по порядку
1) Подаю на вход RESET лог. 0 где то 200 мС задержки и снова 1
2) В в регистре Channel SETUP для канала 0 устанавливаю
биты RNG0 – RNG2 для входного напряжения от 0 до 2.5В
бит ENABLE = 1 (вроде для однократного преобразования его устанавливать не надо, но в любом случае пробовал и без него результат был тот же)
биты COM1 COM2 равны 0 то есть вход канала 0 относительно AINCOM
В цифрах получается, что в регистр по адресу 0х28 заносим 0х0D

Все остальные регистры по умолчанию после сброса.

Далее произвожу однократное измерение канала 0 в MODE регистр (0x38) записываю 0x40.
Жду низкого уровня на RDY после чего читаю регистр данных канала 0 (последовательность 0x48 0x00 0x00)

Теперь о входах
Вход AINCOM сидит на земле на вход канала 0 ( да на другие каналы тоже) подавал напряжения от 0 до +2В. В регистре данных был 0.

Регистр Channel Status читал не всегда но когда читал бит OVR был равен 0

Просьба если можно выложить, как вы производите настройку этого АЦП.

Что то я с ним совсем замучился.
Herz
Может, дело в том, что нужно установить бит 5 в регистре I/O (Adress 01h), чтобы вывод AINCOM сконфигурировать, как аналоговый вход?

Цитата
РЕГИСТР ПОРТА ВВОДА-ВЫВОДА (I/O Port Register)
8 бит, чтение/запись, Адрес 01h, начальное значение 30h + входное значение х 40h
Биты этого регистра используются для определения и конфигурирования вывода I/O.
Нажмите для просмотра прикрепленного файла
Pat
Цитата(Herz @ Dec 18 2006, 08:50) *
Может, дело в том, что нужно установить бит 5 в регистре I/O (Adress 01h), чтобы вывод AINCOM сконфигурировать, как аналоговый вход?


Так это понятно, но он же по сбросу дожен быть установлен в 1.
Herz
Цитата(Pat @ Dec 18 2006, 17:46) *
Цитата(Herz @ Dec 18 2006, 08:50) *

Может, дело в том, что нужно установить бит 5 в регистре I/O (Adress 01h), чтобы вывод AINCOM сконфигурировать, как аналоговый вход?


Так это понятно, но он же по сбросу дожен быть установлен в 1.


Да, действительно, не на тот посмотрел.
DS
0 нельзя подавать, минимальное напряжение 0.2 вольта. Я пользую от 0.5 для верности, может в этом дело. На входы можно подавать от 0.2 до 4.7 вольта.
По логике Вы все верно делаете, если только с CS не производится неправильных манипуляций.
Если после записи режима RDY идет вверх, потом через положенное время обратно, то управление правильное.
Herz
Цитата(DS @ Dec 18 2006, 20:20) *
0 нельзя подавать, минимальное напряжение 0.2 вольта. Я пользую от 0.5 для верности, может в этом дело. На входы можно подавать от 0.2 до 4.7 вольта.

Почему нельзя? Где об этом сказано? Очень странно...
Спецификация приведена только для:
Цитата
(–40C to +105C, AVDD = 5 V  5%, DVDD = 2.7 V to 3.6 V or 5 V  5%,
REFIN(+) = 2.5 V, REFIN(–) = 0 V, AINCOM = 2.5 V, MUXOUT(+) = ADCIN(+), MUXOUT(–) = ADCIN(–), Internal Buffer ON, AIN Range = 1.25 V,
fMCLK = 6.144 MHz; unless otherwise noted.)
DS
В третьем предложении от начала datasheet и далее в таблице параметров.
Herz
Цитата(DS @ Dec 18 2006, 21:06) *
В третьем предложении от начала datasheet и далее в таблице параметров.

Это: accepts a common-mode
input voltage from 200 mV above AGND to AVDD – 300 mV. ?
Я это понимаю, как синфазное напряжение в биполярном режиме. Разве не так?
DS
Common mode - это напряжение на входе относительно земли.
Herz
О каких же 24-х разрядах тогда можно говорить, особенно в диапазоне 0-1.25В , если минимальное 0.2В?
То есть, все Voltage Ranges определяются относительно AINCOM, которое не может быть ниже 0.2В относительно земли? Тогда понятно.
DS
aincom должен быть смещен относительно земли. АЦП измеряет относительно него.
Если у Вас подано на него 0.2 вольта, то на вход надо подавать 0.2 - 1.45 вольта для режима 0 - 1.25

Посмотрите как в 7732 внутренний делитель устроен для привязки уровней к земле.

PS у меня все три (7732, 38, 39) работают в смысле точности, как обещано AD.
Herz
Вообще, жутко неудобно получается...
DS
А это расплата за однополярное питание. И у этих АЦП еще не самая громоздкая схема согласования - можно резисторами обойтись. А то бывает и 2 - 3 ОУ на каждый вход надо.
Pat
Цитата(DS @ Dec 18 2006, 20:20) *
0 нельзя подавать, минимальное напряжение 0.2 вольта. Я пользую от 0.5 для верности, может в этом дело. На входы можно подавать от 0.2 до 4.7 вольта.
По логике Вы все верно делаете, если только с CS не производится неправильных манипуляций.
Если после записи режима RDY идет вверх, потом через положенное время обратно, то управление правильное.


Дело в том что подавал на AINCOM половину опорного. Пытался диференциальный сигнал измерить между AIN0-AIN1 все без толку на выходе 0.
Да сам дурак , заказал 1 штуку AD7738 она шла месяца полтора.
А теперь все по новой ,вот сижу жду когда она приедет (но уже умный 2 штуки заказал).
Судя по вашим отзывам таки мултиплексор дохлый.
Вопрос только в том я ему помог или он такой приехал - загадка.


Цитата(DS @ Dec 18 2006, 21:28) *
aincom должен быть смещен относительно земли. АЦП измеряет относительно него.
Если у Вас подано на него 0.2 вольта, то на вход надо подавать 0.2 - 1.45 вольта для режима 0 - 1.25


Уважаемый DS, а нельзя ли вашу схему входных формирователей подсмотреть?
DS
Посмотрите вольтметром на выходе мультиплексора - должны быть напряжения, как на входах. Иначе действительно спалился мультиплексор.

Так я же отослал к ad7732 - если надо сделать двуполярный вход достаточно резисторов как у него внутри. А в остальных случаях по обстановке - каждая схема включения имеет какие-то недостатки, надо приноравливаться каждый раз, чтобы точность вытянуть. Если скажете, что измеряете, может смогу дать совет.
Pat
Цитата(DS @ Dec 18 2006, 22:12) *
Посмотрите вольтметром на выходе мультиплексора - должны быть напряжения, как на входах. Иначе действительно спалился мультиплексор.


Измерял ничего там нет 0. Значит мультиплексор.

Цитата(DS @ Dec 18 2006, 22:12) *
Так я же отослал к ad7732 - если надо сделать двуполярный вход достаточно резисторов как у него внутри. А в остальных случаях по обстановке - каждая схема включения имеет какие-то недостатки, надо приноравливаться каждый раз, чтобы точность вытянуть. Если скажете, что измеряете, может смогу дать совет.


Измеряю ток от 0 до 5 мА, шунт 400 Ом
DS
Нижний конец шунта обязательно на земле ? Если его сместить на 0.5 вольта и подсоединить диф. входы АЦП прямо к шунту (может через дополнительные RC), точность будет максимальной.
Если надо привязывать к земле, то делителями напряжения можно загнать в неполный диапазон 0 - 1.25.
Точность будет на разряд-два похуже.
Herz
А мне уже так просто не отделаться. smile.gif Придётся плату переразводить. Что ж, сам виноват. Как говорится, если уже ничего не помогает, прочтите, наконец, инструкцию!
Herz
Цитата(DS @ Dec 18 2006, 21:50) *
А это расплата за однополярное питание. И у этих АЦП еще не самая громоздкая схема согласования - можно резисторами обойтись. А то бывает и 2 - 3 ОУ на каждый вход надо.

Вот ADS1210 тоже однополярный, но, похоже, эта проблема в них не стоит так остро. Теперь начинаю понимать суть упоминавшихся траблов. Помните?
DS
Там по-видимому трабл все-таки в другом. Судя по тому, что входное сопротивление этого АЦП не очень велико и зависит от режима работы, на входе могут тоже стоять резистивные делители для смещения диапазона.

Чтобы не возится с 0, надо было ad7732 брать, но я так понимаю, поздно уже.
Herz
Я подумал: может организовать ей независимое питание и поставить опторазвязку на цифровой интерфейс?
Herz
Цитата(Pat @ Dec 17 2006, 12:37) *
Далее произвожу однократное измерение канала 0 в MODE регистр (0x38) записываю 0x40.

Просьба если можно выложить, как вы производите настройку этого АЦП.

Что то я с ним совсем замучился.


Что-то я с MODЕ-регистром разобраться не могу. Вот цитата из PDF:
Цитата
Mode Register
8 Bits Read/Write Register, Address 38h–3Fh, Default Value 00h
The Mode register configures the part and determines the part’s operating mode. Writing to the Mode register will clear the ADC
Status register, set the RDY pin to logic high level, exit all current operations, and start the mode specified by the Mode bits.
The AD7738 contains only one Mode register. The three LSBs of the address used for writing to the Mode register specify the channel
selected for operation determined by the MD2 to MD0 bits. The address 38h only must be used for reading from the Mode register.

Если MODE-регистр только один, то почему адресов восемь (0х38 - 0х3F)?
Если эти адреса соответствуют каналам, то почему только адрес 0х38 можно читать? И можно ли в него писать? И как это делать правильно? Как понимать фразу о трёх младших битах адреса? Являются ли они одновременно страшими битами самого MODE-регистра? Я понял так, что запись в MODE-регистр инициирует начало конверсии. Следует ли понимать, что режим конверсии будет зависеть от того, по какому адресу я записываю в MODE-регистр данные (пять младших бит)?
Где я должен указать о том, что только нулевой канал будет использоваться?
DS
Если Вы запускаете continuous conversion, то начинается с оцифровки канала, по которому записан режим.
Разрешение канала ставится в channel setup, если надо работать только с первым каналом, то ставите 1 в 3 разряд setupа и ьщву пишете по 38 адресу. Кроме этого, еще запуск калибровок на соответствующий канал определяется адресом записи.
Herz
Цитата(DS @ Dec 29 2006, 19:33) *
Если Вы запускаете continuous conversion, то начинается с оцифровки канала, по которому записан режим.
Разрешение канала ставится в channel setup, если надо работать только с первым каналом, то ставите 1 в 3 разряд setupа и ьщву пишете по 38 адресу. Кроме этого, еще запуск калибровок на соответствующий канал определяется адресом записи.

Не очень-то понял, если честно. Но ничего, разберусь. По крайней мере, однократный запуск и continius conversion включить получилось. Дело упрощается одним каналом. smile.gif Нет ли у Вас кусочка кода на С с подпрограммой обслуживания АЦП?
DS
Да, как то я витиевато выразился. Адрес регистра mode, по которому пишется команда, определяет канал, с которого начинается преобразование в continuous режиме. Во всех остальных случаях (однократное преобразование, калибровка канала) адрес определяет канал, к которому относится команда.

Для управления АЦП я ассемблером пользуюсь. Программа не откомментирована, так что толку от нее для Вас немного. Если опишите, в какой режим надо его загнать, я последовательностькоманд напишу. Тактируете от кварца или генератора ? AINCOMом пользуетесь ?
Herz
Спасибо, теперь понятнее. Я в общем-то, так и делаю:
- после сброса записываю по адресу 0х28 число 0х09 (AIN0 - AINCOM, range 0-1,25V, Continius conversion Enable)
- в регистры с адресами с 0х30 по 0х37 записываю число 0хAD (CHOP Enabled, FW=45) В принципе, наверное, достаточно было бы ограничиться лишь первым из адресов.
- запускаю конверсию записью в Mode Register по адресу 0х38 числа 0х20 (Continius conversion, channel 0, и т.д.)
Вроде работает, все остальные каналы у меня не задействованы, поэтому на этом пока остановился. Меня просто смутила фраза в DS:
Цитата
The AD7738 contains only one Mode register.

А также то, что существуют комбинации битов MD2-MD0, отвечающие за режимы АЦП в целом, например, 011 - Power Down. Такую комбинацию нет вроде смысла записывать по всем адресам 0х38 - 0x3F.
DS
Да, можно в Conversion time писать только для используемого канала. Также неплохо перед работой запустить Zero-scale calibration, и, если есть возможность обеспечить нулевой сигнал на входе, Zero scale channel calibration.

Если функция относится ко всему АЦП, а не к конкретному каналу, адрес в mode неважен. Обратите также внимание на p0/1 - если Вы ими не пользуетесь, программируйте их выходами. Если тактирование идет от внешнего генератора, в mode надо также ставить clkdis.
Herz
Ещё раз спасибо, кажется, разобрался. И ещё вопросик, если позволите: как Вы боретесь с сетевой наводкой? Усредняете замеры за 20 мс, "привязываетесь" ли к фазе сетевого? Подстраиваете ли частоту сэмплирования?
DS
Да у меня почему-то нет сетевой наводки. Я больше шишек набил с шумами активных элементов перед АЦП. Правда у меня нигде нет фотодиодов, которые смотрят "в комнату", где 100 Гц неизбежно.

С наступающим ! santa2.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.