АНАЛОГОВО-ЦИФРОВЫЕ И ЦИФРО-АНАЛОГОВЫЕ ПРЕОБРАЗОВАТЕЛИ НА МИКРОКОНТРОЛЛЕРАХ АТМЕГА

 

🔍 АЦП и ЦАП на ATmega — просто о сложном

Аналого-цифровой преобразователь (ADC) — это встроенный модуль в микроконтроллере, который позволяет "читать" аналоговый сигнал (например, с фоторезистора или термистора) и преобразовывать его в число. А вот цифро-аналоговый преобразователь (DAC) — это обратная операция: выдать «псевдоаналог» наружу.


📊 Что делает АЦП?

Представь потенциометр на входе микроконтроллера. Его выходное напряжение может быть от 0 В до 5 В (или до Vref). Микроконтроллер не умеет "понимать" напряжение напрямую, ему нужно число.

АЦП переводит напряжение в число — от 0 до 1023 (в 10-битном режиме).

ADC = (V_in / V_ref) × 1023

Примеры:

  • V_in = 0 ВADC = 0
  • V_in = 2.5 В (при Vref = 5 В) → ADC = 512
  • V_in = 5 ВADC = 1023

📌 Основные характеристики АЦП в ATmega

  • 🔢 Разрешение: 10 бит (1024 уровня)
  • Диапазон напряжений: 0 до Vref (обычно 5 В или 1.1 В)
  • 📈 Мультиплексор: можно выбирать входной пин (ADC0…ADC7)
  • ⏱️ Скорость: зависит от частоты, оптимально 50–200 кГц

🔌 Какие пины используются?

На ATmega328P — аналоговые входы ADC0…ADC5:

Пин ArduinoВнутреннее имя
A0 ADC0
A1 ADC1
A2 ADC2
A3 ADC3
A4 ADC4
A5 ADC5

⚙️ Пример настройки АЦП вручную

void ADC_Init() {
  ADMUX  = (1 << REFS0); // опорное напряжение AVcc = 5В
  ADCSRA = (1 << ADEN)  // включить АЦП
         | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // делитель 128
}

uint16_t ADC_Read(uint8_t channel) {
  ADMUX = (ADMUX & 0xF0) | (channel & 0x0F); // выбрать канал 0-7
  ADCSRA |= (1 << ADSC); // начать преобразование
  while (ADCSRA & (1 << ADSC)); // ждать завершения
  return ADC;
}

Важно: для точных измерений лучше использовать внутреннюю опорную 1.1 В, если сигнал ≤ 1 В. Тогда в ADMUX ставим (1 << REFS1) | (1 << REFS0).


🧠 Немного про опорное напряжение (Vref)

Это напряжение, относительно которого измеряется входной сигнал. В ATmega доступны:

  • 🔸 AVcc (обычно 5 В)
  • 🔹 Внутренняя 1.1 В (REFS1:REFS0 = 1:1)
  • 🔧 Внешнее напряжение на пине AREF

Точное Vref = точное преобразование!


📉 Фильтрация сигнала

Аналоговые сигналы "шумные". Для стабильных значений:

  • 🧮 усредняйте 8–64 измерений
  • 📶 ставьте конденсатор 0.1–1 мкФ между аналоговым входом и землёй
  • ⚡ избегайте резких переключений рядом с измеряемыми пинами

🎚️ А что насчёт DAC (цифро-аналоговый преобразователь)?

ATmega328P НЕ имеет встроенного DAC, но можно его "симулировать":

  1. 🌀 ШИМ + RC-фильтр — самый распространённый способ. Пример:
[ШИМ сигнал] --+-----> [R] -----+-----> выход (псевдоаналог)
               |               |
              ---             ---
              GND             C (на землю)

Формула частоты среза фильтра:

f = 1 / (2πRC)

Например, R = 10 кОм, C = 0.1 мкФ → f ≈ 160 Гц — достаточно для плавного сигнала.

  1. 🎯 Внешний DAC-чип — например, MCP4725 (12 бит, I2C)

С ним вы можете выдавать точный аналоговый сигнал (0–5 В или меньше). Управляется через I2C.


🔚 Подытожим

  • 🧲 ATmega имеет встроенный АЦП на 10 бит, но не имеет встроенного ЦАП
  • 📥 Сигналы в аналог — только через ШИМ или внешний DAC
  • 🔧 АЦП можно точно настроить под любые нужды — делители, опорники, автотриггеры

Всё остальное — дело практики. Измеряй, фильтруй, и будь доволен 🙂


Статья подготовлена для madmentat.ru • Автор: Андрей