Несколько вызовов AnalogRead() через определенные промежутки времени

Я хочу добавить возможность захвата волновых форм в продукт на базе ATmega 328, и мне не удалось найти подробностей о том, насколько ATmega 328 реагирует на аналого-цифровые преобразования. Код прототипируется на Arduino, но когда будет готово, он будет перенесен на специальную плату.

Мой план состоит в том, чтобы иметь общий период (обычно от 16 до 20 миллисекунд, в зависимости от частоты локальной сети переменного тока) и производить выборку одного вывода порядка 50-100 раз в течение этого интервала. Может ли ATmega 328 надежно выполнять такое количество преобразований подряд? Минимальный интервал на преобразование составляет 16 мс / 100 = 160 мкс.

Я могу добавить пример кода, если кому-то нужно увидеть код, но сейчас меня больше беспокоит минимальный период между несколькими последовательными аналого-цифровыми преобразованиями.


person Julie in Austin    schedule 01.05.2012    source источник


Ответы (1)


Самый простой способ — написать скрипт для Arduino и самостоятельно выполнить некоторые временные тесты.

Другой способ — выполнение этого по спецификации — требует дополнительных входных данных для каждого задействованного уровня.

На самом нижнем уровне находится чип ATmega328. Документы по части ADC говорят:

По умолчанию схема последовательного приближения требует входной тактовой частоты от 50 кГц до 200 кГц для получения максимального разрешения. Если требуется разрешение ниже 10 бит, входная тактовая частота АЦП может быть выше 200 кГц, чтобы получить более высокую частоту дискретизации.

Предполагая тактовую частоту 16 МГц для ATMega, единственное доступное значение предварительного делителя для тактовой частоты АЦП равно 128, что составляет 125 кГц для 10-битного разрешения. Вы можете использовать значение предварительного делителя 64 (250 кГц), если можете обойтись 8-битным разрешением.

Далее: В документе говорится:

Обычное преобразование занимает 13 тактов АЦП. Первое преобразование после включения АЦП (установлен ADEN в ADCSRA) занимает 25 тактовых циклов АЦП для инициализации аналоговой схемы.

Таким образом, при тактовой частоте АЦП 125 кГц это будет означать частоту дискретизации ~ 9600 Гц в режиме «одиночного преобразования». Это 104 мкс на выборку. Это настройки Ардуино по умолчанию.

По сравнению с вашим требованием 160 мкс это кажется хорошим.

НО: до сих пор рассматривалась только конверсия. Вы должны передать данные куда-то. ТАКЖЕ функция Arduino analogRead() имеет некоторые накладные расходы, как вы можете видеть в файле wiring_analog.c в дистрибутиве Arduino.

Эти накладные расходы могут быть слишком большими — вы должны проверить это сами.

С другой стороны: никто не заставляет вас использовать функцию Arduino analogRead. Некоторые доступные варианты:

  • вы можете отказаться от накладных расходов на analogRead и/или
  • вы можете перенастроить АЦП в соответствии с вашими потребностями (только 8 бит, более высокая тактовая частота АЦП) и/или
  • вы можете использовать «расширенные» режимы, такие как непрерывная выборка («автономный режим»9 АЦП или
  • вы можете использовать даже прерывания для запуска преобразований.

Конечно, все эти варианты сильно зависят от ваших знаний и бюджета времени. :-)

person A.H.    schedule 01.05.2012
comment
Спасибо! Это ответ, который я искал. Данные будут скопированы с чипа после того, как все образцы будут собраны. Я могу ответить на ваш вопрос. Эти накладные расходы могут быть слишком большими, я могу получить 30kS/s с остальными накладными расходами, которые у меня уже есть. Это намного меньше (‹= 6kS/s), но должно быть более точно рассчитано по времени и представляет собой один контакт. - person Julie in Austin; 01.05.2012