Внешний АЦП
- Войдите на сайт для отправки комментариев
Привет!
Появилась необходимость более точнее считывать напряжение на аналоговом входе. Купил 2 внешних АЦП:
1) AD7705 (16 bit / http://www.analog.com/static/imported-files/data_sheets/AD7705_7706.pdf)
Пытался подключить по SPI:
Более наглядно:
т.к. максимальный уровень 65535 соответствует 2.5В, подключая на аналог #1 1.2В я должен получить что-то похожее на 65535/2, однако на монитор выводятся только нули.
Скетчи я испробовал разные, например:
http://playground.arduino.cc/Code/MCP3208 | http://forum.arduino.cc/index.php/topic,14450.0.html | http://www.edaboard.com/thread251037-2.html | http://forum.arduino.cc/index.php/topic,18893.0.html
Пробовал использовать готовую библиотеку для данного ацп — http://www.kerrywong.com/2012/04/18/ad7705ad7706-library-revisited/ .
Ничего не помогло.
2) AD7714 (24 bit / http://www.analog.com/static/imported-files/data_sheets/AD7714.pdf)
Более наглядно:
Аналогичено предыдущему примеру, на мониторе одни нули.
Скетчи пробывал изменять как и для 16 бит, так и пытался использовать:
http://forum.arduino.cc/index.php?topic=193723.0 | http://forum.arduino.cc/index.php?topic=57873.0;wap2 | http://forum.arduino.cc/index.php?topic=57873.0 | http://interface.khm.de/index.php/lab/experiments/connect-a-ltc2400-high... | http://dangerousprototypes.com/forum/viewtopic.php?t=4247&p=42053 | http://forums.netduino.com/index.php?/topic/1831-netduino-with-24bit-adc...
Подключения стандартные:
DATAOUT 11 // MOSI
DATAIN 12 // MISO
Если DATAOUT это выход АЦП (и вроде-бы АЦП у нас слейвом работает, а Ардуина мастером)
то MOSI это MacterOUT - SlaveIN для Ардуины.
Может я ошибаюсь, но мне кажется что MOSI MISO перепутаны...
Может я ошибаюсь, но мне кажется что MOSI MISO перепутаны...
Да, Вы правы.
Подсоеденил по следующей схеме:
Для конкретного разбора взял ad7705.
Скетч:
Используемая библиотека — http://www.kerrywong.com/2012/04/18/ad7705ad7706-library-revisited/ .
Иногда работает правильно, но потом появляются не понятные мне цифры, например, опорное 4.8V, на аналог (1) идет 2.5, кварц - 2MHz
Жму кнопку reset на плате, затем в пор идут первые 2-е адекватные цифры, потом пауза в секунды 2 и снова 2048:
Поставьте кондёрчики на входы для проверки.
Хотя-бы 0.1 мкф, если сигнал не слишком быстро меняется.
Или подайте на входы 3.3 Вольта прямо с платы. И тогда смотрите что будет.
И ещё возможно вы читаете когда этого нельзя делать, там есть интересный выход DRDY (Data Ready).
Он выставляется в "0" при готовности данных.
Вешайте на прерывание (я бы поставил на FALLING) и читайте правильные данные.
Или в цикле через digitalRead...
Наверное железка не успевает отдавать данные. Кроме того, в даташите что-то говорится про Master clock frequency = 400 KHz... Вобщем, я бы, для начала, сделал паузу между считыванием в секунду-две, а потом уменьшал бы ее.
Вот эти ссылки, надеюсь, уже изучили?
http://www.gaw.ru/html.cgi/txt/ic/Analog_Devices/adc/delta/ad7705-06.htm
http://forum.qrz.ru/inzhenernyy-forum-radiolyubitelskie-tehnologii/18813...
Автор, разобраться таки получилось?
Заглохло?..
Не так давно пытался запустить эту микросхему... Нужна была высокая скорость обработки АЦП. Не взлетело на 2 микросхемах... т.е. иногда данные шли, но непонятно какие. Грешу на кварц (ставил 4 МГц), так как частота не соответсвует даташиту.
В итоге заказал китайский аналаг распаенный на платке. Если кому интересно, когда придет отпишусь как заработало. Тока напомните...
Если кому интересно, заработало со следующим кодом. ВАЖНО используется пин dataReadyPin, который DRDY
Сколько реально получилось выборок в сек. ? Там по даташиту вроде не менее 19,2кГц (38кГц. на усилении =1)
Для одного канала, сколько укажете в UPDATE_RATE столько и будет. Чем выше частота, тем больше плавает значение
на 500 кГц у меня сложилось впечатление что 3 - 4 разряда плавают
Если переключать каналы, то частота опроса падает в 3 раза на 1 канал (т.е. при переключении канала он автоматически берет первые 3 значения на фильтр и только потом выдает результат). Т.е. если при частоте 50 кГц один канал опрашивается за 20 мС, то 2 канала опрашиваютя за (20 * 3) * 2 = 120 мС
Автор, разобраться таки получилось?
Заглохло?..
5 лет прошло :).
Да, мне удалось запустить его (AD7705), уже и не помню как и что делал. Если надо, могу покапаться на диске и поискать скетчи.
Здравствуйте, товарищи!
Я тоже сейчас заморочился с внешним ацп AD7707. Сразу повылезали проблемы: 1. Длительная смена канала. 2. При смене канала - почему-то данные были устаревшие. Решил я эту проблему вот таким скетчем:
Добавил функцию
И ура - все заработало без всяких millis и delay. Правда на одно измерение мне надо реально 300-450мс. Измерения очень стабильные.
Вопрос - можно ли как нибудь оптимизировать время чтения по SPI при выборе канала? Я сделал так, что в момент когда DRDY == LOW происходит считывание. В остальное время система просто ждет в цикле while. Правда если у меня в программе прилетит прерывание вероятно может это все испортить. Это я проверю чуть позже. Может есть какой нибудь более оптимальный вариант кода ?
По-моему тут не время чтения по SPI нужно оптимизировать, а процедуру ожидания готовности.
Вопрос только в том - есть ли куда тратить сэкономленные такты?
Конечно есть. У меня же не только эта программа исполняется на МК. Мне кажется очень глупо тратить по 500мс на одно измерение. Схема то используется в промышленности - я не думаю, что там по пол секунды тратят
Кто ж знает, где она у вас используется. В том случае, если хотите получить свои 500мс в рабочий цикл - запускайте конверсию, выставляйте флаг "работют датчики" и проверяйте каждый луп (или по таймеру) состояние INT-входа. Как только он упал - инициируйте процедуру считывания результата.
В целом так. Применимо к приведенному коду - я бы его переделал на какой-нить конечный автомат.
спасибо конечно, с таймерам я само собой сделал. опрос датчиков мне пока нужен раз в 8 секунд, и как под конечный автомат сделать я знаю. я интересуюсь как можно оптимизировать время выбора канала. Вот это интересно - неужели она такая медленная ?
Как я вижу - после команды инита канала еще определенное время мотается while(). Т.е. опять же - инит пустили, мигаете светодиодом, щелкаете релюшками, проверяете не выставился ли INT. Выставился - начинаете читать инициализированный канал. Вот и вся оптимизация.
На даташит глянул - там написано, что DRDY появляется, если есть новые данные. Скорее всего сразу после вместе с инитом запускается долгая конверсия/калибровка. Решение то же - пуск -> свои дела, проверка INT -> работа с каналом по обнаружению INT.
Призадумаешься, использовалить ли этот аналог девайс.
Интересный опыт https://digibird1.wordpress.com/arduino-as-a-5m-sample-osciloscope/
На базе внешнего AЦП на базе микрочипа CA3306.
5.000.000 выборок в секунду (5Mhz)!