• Главная
  • Блог
  • [Перевод] Оверклоккинг АЦП и семплирование высокоимпедансных источников

[Перевод] Оверклоккинг АЦП и семплирование высокоимпедансных источников

Это продвинутый материал для тех, кто хочет выжать из АЦП атмеги всё. Мы поговорим о внутренней работе АЦП Atmega328p (просто на случай, если вы используете Arduino) и покажем, на какие компромиссы приходится идти для оверклокинга или семплирования высокоимпедансных источников.

 

Для начала нам бы хотелось сказать "Не забудьте про DIDR!". DIDR (Data Input Disable Register) - тот самый регистр, о котором все обычно забывают. Он отключает цифровые входы от каналов АЦП, которые вы используете, и это важно по двум причинам. Во-первых, аналоговый вход все время плавает, что заставляет цифровой вход постоянно переключаться вверх и вниз. Это создает лишний шум для АЦП и сжигает лишнюю энергию. Во-вторых, цифровой вход и связанный с ним переключатель DIDR имеют емкость, которая замедляет входной сигнал, если вы семплируете высокорезистивную нагрузку.

К сожалению, Arduino не делает отключение за вас самостоятельно. Но не так-то и сложно добавить строчку DIDR0 = 0x01; в вашу функцию setup(), чтобы использовать канал ADC0. Если вы используете ADC1, выставьте бит 1, если канал ADC2, то бит 2, и так далее.

ОК, теперь, когда эта проблема устранена, давате определим, как быстро может работать АЦП? Даташит говорит, что нельзя выходить за лимиты 50...200 КГц при максимальном разрешении. А как быстро разрешение будет падать на бОльших скоростях? Чтобы это проверить, мы заставили Arduino семплировать чистый синусоидальный тон с помощью своего АЦП и подключили Codec Shield для проигрывания семплов для разных частот тактирования АЦП. Результаты показаны ниже, объяснение дается здесь.

adc freq test1

Рис.1. Зависимость разрешения АЦП от частоты тактирования

Arduino тактировалось частотой 16 МГц, поэтому эта частота является максимальной в нашем исследовании. На высокой частоте CK/2 [8 МГц] ничего не работало. На следующих частотах CK/4 [4 МГц] и CK/8 [2 МГц] АЦП работал, но выдавал случайные слышимые щелчки во время проигрывания. С остальными настройками все работало без проблем, при этом снижение скорости уменьшало величину шума и искажений.

Важно заметить, что если вы хотите получить мало шума и хорошее разрешение от вашего АЦП, нужно выполнять семплирование на исключительно постоянной частоте. Чтобы это сделать, можно использовать режим first conversion, free running или начинать семплирование по прерыванию, которое случается реже, чем такт АЦП. Все другие режимы дают джиттер часов в половину такта АЦП. Это приводит к тому, что семплы не упорядочиваются по времени и отклоняются вперед и назад, накладывая частотную модуляцию на ваш сигнал. Чтобы узнать об этом больше, прочитайте этот материал.

Кроме частоты тактирования, даташит на Atmega накладывает ограничения на использование источников с импедансом, большим 10 КОм. Почему это имеет значение? Оказывается, для зарядки конденсатора удержания на входе АЦП требуется время. Согласно даташиту, это выглядит так:

adc input1 sm

Рис.2. Схема входа АЦП Atmega

Здесь показывается ток утечки, некоторое входное сопротивление и емкость 14 пФ. По нашим тестам с резистором номиналом 10 МОм ток утечки ничтожно мал (хотя он меняется от температуры). Мы также обнаружили, что емкость 14 пФ на самом деле распределяется между мультиплексорным конденсатором, емкость которого 4 пФ, и конденсатором удержания, емкость которого 10 пФ. Таким образом, лучшее приближение входной схемы выглядит так:

adc guts sm1

Рис.3. Внутреннее устройство входов АЦП Atmega

Почему это имеет значение? Некоторые сенсоры, такие как фоторезисторы или емкостные тачпады, имеют огромный импеданс, и их показания нужно буферизировать прежде, чем семплировать с помощью АЦП. Это можно делать и без дополнительных компонентов, если убедиться, что оба конденсатора - мультиплексорный и удержания - подключены к вашей схеме достаточно долго, чтобы передать свой заряд и стабилизироваться. На порядок включения этих конденсаторов и длительность их включения сильно влияет режим, в котором используется АЦП. Три режима, которые мы рассматриваем - это first conversion, repeated conversion и free running.

В режиме first conversion канал АЦП выбирается мультиплексором, работа АЦП разрешается, начинается семплирование. Поскольку это первый семпл, на измерение требуется 25 тактов АЦП. Мультиплексорный конденсатор включается сразу после изменения значения ADMUX, а конденсатор удержания включается, как только разрешается работа АЦП. Если работа АЦП разрешается ровно в тот же момент, когда запускается семплирование, конденсатор удержания включается только после задержки в половину такта. Затем он удерживается в течение полутора такта и затем еще на один такт после периода инициализации. Как только семплирование закончено, конденсатор удержания включается снова и остается в таком положении до момента выключения АЦП. Полная временная диаграмма приведена ниже.

adc first sm

Рис.4. Временная диаграмма для режима first conversion

Для режима single conversion мультиплексорный конденсатор включается снова при смене ADMUX, но конденсатор удержания всегда остается подключенным, кроме периода непосредственного преобразования. Как показано на временной диаграмме ниже, это дает большее время для передачи заряда, что делает этот режим более предпочтительным для высокоимпедансных истоников.

adc retrig sm

Рис.5. Временная диаграмма для режима single conversion

В режиме free running АЦП ведет себя так же, как и в режиме single conversion, за исключением того, что мультиплексорный конденсатор включается прямо перед семплированием, поэтому времени на передачу заряда очень мало. Временная диаграмма этого режима приведена ниже.

adc auto sm

Рис.6. Временная диаграмма для режима free running

Для каждого из этих режимов вы должны убедиться, что конденсатор удержания включен достаточно долго для того, чтобы сигнал распространился. Обычно это время равно 4RC, где R - импеданс источника, C - сумма всех емкостей (мультиплексорной, удержания, дорожек и т.д.). Например, если вы используете 10-мегаомный фоторезистор, при этом емкость дорожек равна 6 пФ, а емкость на входе АЦП равна 16 пФ, нужно подождать 4*10*20 = 800 микросекунд. Первый способ сделать это - выставить ADMUX для своего канала, разрешить работу АЦП, подождать 800 мкс, а затем дать команду на семплирование. Второй способ - поместить большой (1 нФ) конденсатор на вход АЦП, чтобы заряд снимался с конденсатора, а не с резистора, давая минимальное падение напряжения. Это дает более медленный отклик, однако не требует ожидания. В любом случае, вы можете семплировать какой угодно импеданс, стоит только подождать.

Использование в аудио

Особенно больших потерь при увеличении частоты АЦП до 500 КГц не обнаружилось. При использовании режима free running это дает частоту семплирования 38 кГц, что достаточно хорошо для многих low-fi применений. Но, учитывая сложность реализации хороших анти-алиасинговых фильтров, стоит поднять частоту до 76 КГц. Частот выше этой следует избегать, поскольку АЦП начнет выдавать случайных щелчки.

Если вы хотите обрабатывать данные на плате и использовать ШИМ для вывода, важно, чтобы частоты семплирования АЦП и ШИМ совпадали. Лучший способ сделать это - генерировать прерывания по переполнению ШИМ и начинать новый семпл в этот момент. Поскольку АЦП и ШИМ тактируются от одного генератора, вам не стоит беспокоиться о джиттере часов, поскольку частота ШИМ меньше, чем частота АЦП, деленная на 14.

 

Оригинал статьи: http://www.openmusiclabs.com/learning/digital/atmega-adc/

Метки: хардкор, АЦП

Добавить комментарий


Защитный код
Обновить