1. Введение: зачем нужен АЦП в МК
Аналого‑цифровой преобразователь (АЦП, ADC) — ключевой модуль микроконтроллера для взаимодействия с аналоговым миром. Он переводит непрерывный входной сигнал (напряжение) в дискретное цифровое значение, с которым может работать процессор.
Типичные применения:
- измерение температуры (термопары, терморезисторы);
- считывание показаний датчиков давления, освещённости, влажности;
- анализ аудиосигналов;
- мониторинг напряжения питания;
- обработка сигналов с потенциометров и джойстиков.
2. Основные характеристики АЦП
2.1. Разрешение (разрядность)
Определение: количество бит в выходном цифровом коде. Определяет точность преобразования.
Формула:
Vшаг=2NVREF,
где:
- Vшаг — шаг квантования (минимальное различаемое изменение напряжения);
- VREF — опорное напряжение (обычно 3,3 В или 5 В);
- N — разрядность АЦП (бит).
Примеры:
- 8 бит: 28=256 уровней, шаг ≈ 12,9 мВ при VREF=3,3 В;
- 10 бит: 210=1024 уровня, шаг ≈ 3,2 мВ;
- 12 бит: 212=4096 уровней, шаг ≈ 0,8 мВ.
Влияние на точность:
- выше разрядность → меньше ошибка квантования;
- но: шум и дрейф МК могут нивелировать преимущества высокого разрешения.
2.2. Скорость преобразования (частота дискретизации)
Определение: максимальное число измерений в секунду (выборок/с, SPS — Samples Per Second).
Ограничивающие факторы:
- время заряда входного конденсатора АЦП;
- тактовая частота модуля АЦП;
- длительность цикла преобразования (зависит от разрядности).
Типичные значения для МК:
- 8‑бит, 100 kSPS (ATmega328P);
- 12‑бит, 1 MSPS (STM32F1);
- 16‑бит, 100 kSPS (высокоточные МК с сигма‑дельта АЦП).
Критерий Найквиста: частота дискретизации должна быть не менее чем в 2 раза выше максимальной частоты полезного сигнала.
2.3. Каналы АЦП
Определение: входы, которые могут подключаться к АЦП.
Типы каналов:
- Однополярные — измеряют напряжение от 0 до VREF;
- Дифференциальные — измеряют разность напряжений между двумя входами (повышает помехозащищённость).
Мультиплексирование:
- МК обычно имеют один АЦП и несколько каналов, коммутируемых мультиплексором;
- переключение каналов добавляет задержку.
Примеры конфигураций:
- ATmega328P: 8 каналов, 10 бит;
- STM32F4: 16 каналов, 12 бит, с буферизацией;
- ESP32: 18 каналов, 12 бит (с возможностью усреднения).
3. Архитектура АЦП в МК
3.1. Последовательного приближения (SAR, Successive Approximation Register)
- Принцип: двоичный поиск значения за N шагов (по числу бит);
- Плюсы: баланс скорости и разрешения (до 16 бит, 1–5 MSPS);
- Минусы: чувствительность к шуму на входе;
- Применение: большинство современных МК (STM32, PIC32).
3.2. Сигма‑дельта (ΔΣ)
- Принцип: передискретизация и цифровая фильтрация;
- Плюсы: высокое разрешение (16–24 бит), подавление шума;
- Минусы: низкая скорость (до 10 kSPS);
- Применение: прецизионные измерения (весы, датчики газа).
3.3. Флэш‑АЦП (прямого преобразования)
- Принцип: параллельное сравнение с эталонами;
- Плюсы: очень высокая скорость (десятки MSPS);
- Минусы: высокая стоимость, низкое разрешение (8–10 бит);
- Применение: осциллографы на МК (редко).
4. Опорное напряжение (VREF)
Роль: определяет диапазон входных напряжений и точность.
Источники:
- внутренний ИОН (обычно 1,2–3 В);
- внешний источник (через вывод VREF+);
- напряжение питания МК (VDD).
Выбор:
- для максимальной точности — внешний прецизионный ИОН;
- для простоты — внутренний ИОН или VDD.
5. Режимы работы АЦП
5.1. Однократное преобразование
- АЦП запускается по команде, делает одно измерение;
- подходит для редких измерений (раз в секунду).
5.2. Непрерывный режим
- АЦП автоматически запускает следующее преобразование после завершения текущего;
- используется для обработки сигналов в реальном времени.
5.3. Сканирование каналов
- последовательное измерение нескольких каналов по расписанию;
- экономит время процессора.
5.4. Преобразование по триггеру
- запуск от таймера, внешнего сигнала или периферии;
- важно для синхронной выборки (например, трёхфазных систем).
6. Факторы, влияющие на точность
6.1. Шум и помехи
- Источники: цифровые цепи, питание, внешние наводки;
- Меры борьбы:
- раздельная аналоговая и цифровая земля (AGND, DGND);
- фильтры на входах (RC‑цепочки);
- экранирование.
6.2. Температурный дрейф
- изменение характеристик АЦП при нагреве;
- решение: калибровка при старте или периодическая коррекция.
6.3. Ошибка смещения (Offset Error)
- ненулевое выходное значение при нулевом входе;
- компенсируется программно (измерение «нуля»).
6.4. Ошибка усиления (Gain Error)
- отклонение шкалы преобразования;
- калибровка по эталонному напряжению.
7. Программирование АЦП: примеры
7.1. AVR (ATmega328P)
// Инициализация
ADMUX = (1 << REFS0); // Опорное — VCC
ADCSRA = (1 << ADEN) | // Включить АЦП
(1 << ADSC) | // Начать преобразование
(1 << ADPS2) | // Предделитель 128 → ~125 kSPS
(1 << ADPS1) |
(1 << ADPS0);
// Чтение канала 0
ADMUX &= 0xF8; // Выбрать канал 0
ADCSRA |= (1 << ADSC); // Запустить преобразование
while (ADCSRA & (1 << ADSC)); // Ждать завершения
uint16_t result = ADC; // Получить результат (10 бит)
7.2. STM32 (HAL)
ADC_HandleTypeDef hadc1;
ADC_ChannelConfTypeDef sConfig;
__HAL_RCC_ADC1_CLK_ENABLE();
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ContinuousConvMode = ENABLE;
if (HAL_ADC_Init(&hadc1) != HAL_OK) { /* Ошибка */ }
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_CYCLES_15;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
uint32_t value = HAL_ADC_GetValue(&hadc1);
7.3. ESP32
#include "driver/adc.h"
adc1_config



