Перейти к основному содержимому

АЦП

Мобильный робот читает аналоговый датчик через АЦП

АЦП — аналого-цифровой преобразователь. Он нужен, когда датчик выдаёт не готовое число по I²C, SPI или 1-Wire, а напряжение. Контроллер не «понимает» напряжение напрямую: он сравнивает его с опорным уровнем и возвращает целый код.

Коротко

АЦП превращает напряжение в код. Чтобы получить температуру, освещённость, расстояние или влажность почвы, программе всё равно нужна формула датчика, калибровка и проверка диапазона. Больше бит полезно, но не заменяет точное опорное напряжение, правильное подключение и чистое питание.

Зачем это нужно

В робототехнике аналоговый сигнал встречается постоянно: LDR-модуль меняет напряжение при изменении света, Sharp GP2Y0A21 выдаёт нелинейное напряжение от расстояния, датчик влажности почвы даёт условный код, а токовый выход драйвера мотора часто читается через аналоговый вход.

Во всех этих случаях программа сначала получает не «люксы» и не «сантиметры», а число вроде 0...1023 или 0...4095. Это только промежуточный код. Его нужно связать с физической величиной.

Примеры внешних АЦП и аналоговых входов

Главная идея

АЦП делит диапазон от 0 В до опорного напряжения Vref на ступеньки:

напряжение датчика -> сравнение с Vref -> код АЦП -> пересчёт в нужную шкалу

Если у АЦП 10 бит, возможны 1024 кода: от 0 до 1023. Если 12 бит — 4096 кодов от 0 до 4095. Если 16 бит — 65536 кодов. Ширина одного идеального уровня квантования примерно равна:

шаг квантования = Vref / 2^N

Например, при Vref = 5 В и 10-битном АЦП шаг квантования равен примерно 4,88 мВ. При Vref = 3,3 В и 12 битах — около 0,806 мВ.

При приближённом пересчёте готового кода в напряжение иногда используют масштаб Vref / (2^N - 1), чтобы сопоставить максимальный код с Vref. Это масштаб пересчёта, а не ширина уровня квантования.

Квантование напряжения в код АЦП

Что важно в паспорте

ПараметрЧто означаетПочему важно
Разрядностьсколько кодов выдаёт АЦПопределяет шаг, но не всю точность
Опорное напряжениес чем сравнивается входошибка Vref превращается в ошибку всех измерений
Диапазон входакакие напряжения допустимывыход датчика нельзя подавать выше питания входа
Частота выборкикак часто можно измерятьслишком медленный опрос старит данные робота
Входное сопротивлениекак АЦП нагружает цепьслабый делитель может давать неверный код
Интерфейсвстроенный вход, I²C или SPIвлияет на скорость, число проводов и библиотеки

Встроенный и внешний АЦП

У Arduino Uno встроенный АЦП удобен для учебных датчиков: один провод сигнала, GND, питание и функция analogRead(). Этого достаточно для LDR, потенциометра, датчика линии или влажности почвы.

Внешний АЦП нужен, когда встроенных входов мало, требуется больше разрядов, другая опора, дифференциальное измерение или подключение к одноплатному компьютеру без аналоговых входов. Например, Raspberry Pi не имеет встроенного АЦП, поэтому для аналоговых датчиков часто берут MCP3008 по SPI или ADS1115 по I²C.

Частые ошибки

ОшибкаЧто происходит
Считать код физической величинойanalogRead() вернул не проценты и не градусы
Не соединить общий GNDкод скачет или стоит в невозможном уровне
Подать 5 В на вход 3,3 Вможно повредить контроллер
Игнорировать Vrefпересчёт напряжения получается смещённым
Сильно сгладить сигналграфик красивый, но робот реагирует поздно
Не калибровать датчикразные экземпляры дают разные коды в одинаковой среде

Что запомнить про АЦП

  • АЦП измеряет напряжение относительно опоры, а не саму физическую величину.
  • Код АЦП нужно пересчитывать по схеме подключения, даташиту и калибровке.
  • Разрядность задаёт шаг кода, но точность зависит ещё от шума, опоры, питания и монтажа.
  • Аналоговый датчик может быть простым, но требует аккуратной проверки сырых значений.

Практика

  1. Рассчитайте идеальный шаг квантования 10-битного АЦП при опоре 5 В и 3,3 В.
  2. Для кода 512 найдите напряжение по формуле code × Vref / 1024 при обеих опорах.
  3. Объясните, почему расчёт остаётся оценкой, пока опорное напряжение не измерено.

Ориентиры: шаги равны примерно 4,88 мВ и 3,22 мВ, а код 512 соответствует примерно половине выбранной опоры — 2,5 В или 1,65 В.

Проверьте себя

  1. Почему код 512 на Arduino Uno не всегда означает ровно 2,5 В?
  2. Чем разрядность АЦП отличается от точности измерения?
  3. Зачем внешнему АЦП интерфейс I²C или SPI?
  4. Почему датчик влажности почвы нельзя считать «процентами» без калибровки?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

  • АЦП — устройство, которое превращает аналоговое напряжение в цифровой код.
  • Опорное напряжение — уровень, с которым АЦП сравнивает входной сигнал.
  • Разрядность — количество бит в результате преобразования.
  • Квантование — замена непрерывного значения ближайшей ступенькой.
  • LSB — вес младшего разряда, минимальный шаг кода.

Связанные темы

Источники