Аналоговые входы Arduino

Разберём, как работать с аналоговыми входами Arduino — и в Arduino IDE (на упрощённом C++/Wiring), и на «чистом» C.

Работа в Arduino IDE

Основные сведения

Аналоговые входы Arduino (обычно пины A0–A5 на Arduino Uno/Nano) подключены к 10‑битному аналого‑цифровому преобразователю (АЦП). Это значит, что:

  • диапазон входного напряжения: 0–5 В (для большинства плат);
  • разрешающая способность: 1024 уровня (от 0 до 1023);
  • точность измерения: ~0,005 В ().

Ключевые функции

  • analogRead(pin) — считывает аналоговое значение с указанного пина. Возвращает целое число от 0 до 1023.
  • map(value, fromLow, fromHigh, toLow, toHigh) — преобразует значение из одного диапазона в другой.
  • Serial.println(value) — выводит значение в монитор последовательного порта для отладки.

Пошаговый алгоритм работы

  1. Настройка пина (в функции setup()):
    • аналоговые пины по умолчанию настроены как входы, поэтому pinMode можно не указывать;
    • при необходимости явно указать: pinMode(A0, INPUT).
  2. Инициализация последовательного порта (для вывода данных): Serial.begin(9600).
  3. Считывание значения (в цикле loop()): int sensorValue = analogRead(A0).
  4. Обработка и использование данных — например, преобразование в вольты или другой диапазон.
  5. Вывод результата (при необходимости): Serial.println(sensorValue).

Пример кода: считывание с потенциометра и вывод в монитор порта

void setup() {
  Serial.begin(9600); // Инициализация последовательного порта
  pinMode(A0, INPUT); // Явное указание, что A0 — вход (необязательно)
}

void loop() {
  int sensorValue = analogRead(A0); // Считываем значение (0–1023)
  float voltage = sensorValue * (5.0 / 1024.0); // Преобразуем в вольты
  Serial.print("Значение: ");
  Serial.print(sensorValue);
  Serial.print(" | Напряжение: ");
  Serial.println(voltage);
  delay(1000); // Задержка 1 с
}

Преобразование значений

  • В вольты: voltage = value * (5.0 / 1024.0).
  • В другой диапазон (например, 0–255 для ШИМ): outputValue = map(sensorValue, 0, 1023, 0, 255).

Работа на «чистом» C через регистры ATmega

Этот способ даёт больше контроля и скорости, но требует знания архитектуры микроконтроллера (например, ATmega328P).

Основные регистры для работы с АЦП

  • ADMUX — выбор канала АЦП (аналогового пина).
  • ADCSRA — управление АЦП (включение, запуск, частота).
  • ADCL/ADCH — чтение результата преобразования (младший и старший байты).

Пошаговая настройка и чтение

  1. Включить АЦП (установка бита ADEN в ADCSRA).
  2. Выбрать канал (записать номер пина в ADMUX).
  3. Запустить преобразование (установить бит ADSC в ADCSRA).
  4. Дождаться завершения (проверка флага ADIF или ожидание бита ADSC).
  5. Прочитать результат из регистров ADCL/ADCH.

Пример кода на C: чтение с аналогового пина A0

#include <avr/io.h>
#include <util/delay.h>

void initADC() {
  ADMUX = (1 << REFS0); // Опорное напряжение — 5 В от VCC
  ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS0); // Включить АЦП, предделитель 32 (16 МГц / 32 = 500 кГц)
}

uint16_t readADC(uint8_t channel) {
  ADMUX = (ADMUX & 0xF0) | (channel & 0x0F); // Выбрать канал
  _delay_us(10); // Пауза для стабилизации
  ADCSRA |= (1 << ADSC); // Запустить преобразование
  while (ADCSRA & (1 << ADSC)); // Ждать завершения
  return (ADCL | (ADCH << 8)); // Прочитать результат (10 бит)
}

int main(void) {
  initADC();
  DDRB |= (1 << PB5); // Пин 13 как выход (для светодиода)

  while (1) {
    uint16_t adcValue = readADC(0); // Читать с A0
    if (adcValue > 512) { // Если значение > половины шкалы
      PORTB |= (1 << PB5); // Включить светодиод
    } else {
      PORTB &= ~(1 << PB5); // Выключить светодиод
    }
    _delay_ms(100);
  }
  return 0;
}

Сравнение подходов

Критерий Arduino IDE «Чистый» C
Простота Высокая, интуитивные функции Требует знания регистров и таймингов
Скорость Медленнее (функции с накладными расходами) Быстрее (прямая работа с регистрами)
Потребление памяти Больше (библиотеки и абстракции) Меньше (компактный код)
Гибкость Ограничена стандартными функциями Полная (можно настраивать АЦП вручную)
Совместимость Работает на всех платах Arduino Зависит от модели МК (ATmega328, ATmega2560 и т. д.)

Практические советы

  1. Опорное напряжение. По умолчанию — 5 В, но его можно изменить:
    • analogReference(INTERNAL) — 1,1 В (внутренний источник);
    • внешний опорный источник на пин AREF.
  2. Фильтрация. Для сглаживания показаний используйте:
    • усреднение нескольких измерений;
    • программные фильтры (скользящее среднее).
  3. Подключение датчиков. Аналоговые входы подходят для:
    • потенциометров (регулировка параметров);
    • фоторезисторов (измерение освещённости);
    • терморезисторов (измерение температуры);
    • тензодатчиков (измерение веса/давления).
  4. Ограничения. Не подключайте к аналоговым входам напряжение выше 5 В — это может повредить АЦП.

Добавить комментарий

Войти с помощью: