АНАЛОГОВО-ЦИФРОВЫЕ И ЦИФРО-АНАЛОГОВЫЕ ПРЕОБРАЗОВАТЕЛИ НА МИКРОКОНТРОЛЛЕРАХ АТМЕГА
🔍 АЦП и ЦАП на 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, но можно его "симулировать":
- 🌀 ШИМ + RC-фильтр — самый распространённый способ. Пример:
[ШИМ сигнал] --+-----> [R] -----+-----> выход (псевдоаналог)
| |
--- ---
GND C (на землю)
Формула частоты среза фильтра:
f = 1 / (2πRC)
Например, R = 10 кОм, C = 0.1 мкФ → f ≈ 160 Гц — достаточно для плавного сигнала.
- 🎯 Внешний DAC-чип — например, MCP4725 (12 бит, I2C)
С ним вы можете выдавать точный аналоговый сигнал (0–5 В или меньше). Управляется через I2C.
🔚 Подытожим
- 🧲 ATmega имеет встроенный АЦП на 10 бит, но не имеет встроенного ЦАП
- 📥 Сигналы в аналог — только через ШИМ или внешний DAC
- 🔧 АЦП можно точно настроить под любые нужды — делители, опорники, автотриггеры
Всё остальное — дело практики. Измеряй, фильтруй, и будь доволен 🙂
Статья подготовлена для madmentat.ru • Автор: Андрей