4.04. Аналоговый сигнал и ЦАП.md


В предыдущих главах мы научились «слушать» аналоговый мир с помощью АЦП и «имитировать» аналоговый сигнал на выходе с помощью ШИМ. ШИМ — это отличный и эффективный трюк, но это всё же имитация. Он создаёт иллюзию плавного напряжения за счёт очень быстрого переключения. Но что, если нам нужен настоящий, «честный» аналоговый сигнал? Например, для генерации качественного звука или для управления сложным научным оборудованием?

Для таких задач в микроконтроллере Рудирон есть специальный узел — цифро-аналоговый преобразователь, или ЦАП (DAC, Digital-to-Analog Converter).

ЦАП — обратное преобразование

ЦАП — это, по сути, «антипод» АЦП. Если АЦП переводил плавное напряжение в дискретное число, то ЦАП выполняет обратную задачу: он берёт дискретное число из микроконтроллера и превращает его в реальное, физическое аналоговое напряжение на выводе платы.

Представьте, что вы даёте микроконтроллеру команду: «Установи на выходе напряжение 1.5 В». ЦАП — это именно тот инструмент, который позволяет это сделать, причём с высокой точностью.

ЦАП на плате Рудирон

Как и АЦП, ЦАП на Рудироне имеет свои ключевые характеристики:

  • Разрядность: 12 бит. Это значит, что мы можем задать 4096 различных уровней напряжения (от 0 до 4095).
  • Опорное напряжение: 3.3 В. Это максимальное напряжение, которое может выдать ЦАП.
  • Вывод (пин): На плате Рудирон функция ЦАП выведена на один конкретный пин — пин 27, который также маркируется как E0.

Сопоставив эти параметры, мы получаем простую зависимость:

  • Значение 0 на входе ЦАП создаст на выходе напряжение 0 В.
  • Значение 4095 создаст напряжение 3.3 В.
  • Промежуточное значение, например 2048 (примерно половина от 4095), создаст напряжение около 1.65 В.

Важно! analogWrite() и ЦАП — это разные вещи. Стандартная функция analogWrite() генерирует ШИМ-сигнал, который является лишь имитацией аналогового напряжения. Для работы с ЦАП на Рудироне используется специальная, более прямая команда.

Управление ЦАП в Рудироне

Для управления ЦАП используется прямой вызов функции из ядра Рудирон. Это может показаться сложным, но на самом деле всё логично:

Rudiron::DAC::getDAC2().write_pin_single(Rudiron::PORT_PIN_E0, значение);

Давайте разберём эту команду:

  • Rudiron::DAC — мы обращаемся к классу для работы с ЦАП из пространства имён Rudiron.
  • getDAC2() — получаем доступ ко второму модулю ЦАП (именно он подключён к выводу на плате).
  • write_pin_single(...) — команда для установки одного значения на выводе.
  • Rudiron::PORT_PIN_E0 — указываем конкретный пин E0 (он же пин 27).
  • значение — целое число от 0 до 4095.

Пример (генерация «пилообразного» напряжения): Этот код заставит напряжение на пине 27 плавно расти от 0 до 3.3 В, а затем резко падать обратно до 0, создавая сигнал, похожий на зубья пилы. Если подключить к этому пину осциллограф, вы увидите эту форму волны.

#include "rudiron/dac.h" // Подключаем библиотеку для работы с ЦАП

const int dacPin = 27; // Пин ЦАП на плате Рудирон

void setup() {
  // Для ЦАП не требуется вызывать pinMode()
  Serial.begin(9600);
}

void loop() {
  // Плавно увеличиваем значение от 0 до 4095
  for (int value = 0; value < 4096; value++) {
    // Устанавливаем напряжение на выходе ЦАП
    Rudiron::DAC::getDAC2().write_pin_single(Rudiron::PORT_PIN_E0, value);
    // Для наглядности можно добавить небольшую задержку
    // delayMicroseconds(10); 
  }
  Serial.println("Цикл завершен!");
}

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

Настоящий аналоговый сигнал от ЦАП открывает возможности, недоступные для ШИМ:

  • Генерация аудио. Создание сложных звуковых волн и воспроизведение музыки без искажений, характерных для ШИМ.
  • Научные приборы. Точное управление напряжением для калибровки датчиков или проведения экспериментов.
  • Управление устройствами. Некоторые компоненты, такие как лазерные диоды или специализированные драйверы, требуют для управления именно плавного аналогового напряжения.

Теперь вы знаете, как Рудирон может не только «слышать», но и по-настоящему «говорить» на языке аналогового мира. Если хотите закрепить знания на практике, переходите к лабораторным работам. А если готовы немного отдохнуть от сложных тем и заняться творчеством, отправляйтесь в следующий параграф, где мы научим Рудирон «петь», используя функции tone и noTone.