Для электронщиков и радиолюбителей

Скрытые возможности ADC и DMA: быстрые измерения на Raspberry Pi Pico

Скрытые возможности ADC и DMA: быстрые измерения на Raspberry Pi Pico

Raspberry Pi Pico редко воспринимают как инструмент для серьёзных измерений.
Чаще всего его ADC используют «по-ардуиновски»: один analogRead() в основном цикле, иногда — в таймере. В таком режиме Pico действительно выглядит посредственно.

Но если подключить DMA, правильно настроить FIFO ADC и убрать ядра из критического пути, Pico неожиданно превращается в вполне серьёзный инструмент сбора данных — вплоть до сотен тысяч измерений в секунду.

Разберём, что на самом деле скрывается внутри ADC RP2040 / RP2350 и где проходит граница реальных возможностей.


Что представляет собой ADC в Pico на самом деле

Основные характеристики (которые все знают)

  • 12-битный SAR ADC
  • до 500 kS/s (теоретически)
  • 4 внешних канала + температурный датчик
  • один ADC на оба ядра

На бумаге — ничего выдающегося. Но есть нюансы.


FIFO — ключ к скорости

ADC в Pico не выдаёт данные напрямую в регистр.
Все измерения складываются в FIFO буфер, откуда их можно читать:

  • ядром CPU
  • или DMA-контроллером

И вот здесь начинается самое интересное.

FIFO позволяет:

  • буферизовать до 4 измерений
  • автоматически сигнализировать DMA
  • минимизировать задержки чтения
  • полностью убрать CPU из цепочки измерений

Это принципиально отличает Pico от большинства бюджетных MCU.


DMA: почему без него Pico «медленный»

Если читать ADC в цикле:

  • ядро тратит десятки тактов на каждое чтение
  • появляются джиттер и пропуски
  • реальная скорость падает до ~50–80 kS/s

С DMA картина меняется радикально:

  • ADC сам кладёт данные в FIFO
  • DMA переносит их в RAM
  • CPU вообще не участвует

Итог:

  • стабильная частота дискретизации
  • нулевой джиттер со стороны софта
  • линейный поток данных в памяти

Это ровно тот же подход, что используется в осциллографах и SDR.


Реальные скорости: без маркетинга

На практике (RP2040):

РежимРеальная скорость
CPU polling50–80 kS/s
IRQ~120 kS/s
ADC + DMA300–450 kS/s
ADC + DMA + overclockдо ~500 kS/s

Но есть ограничения:

  • один канал за раз
  • нет аппаратного триггера по уровню
  • нет дифференциального входа

Что можно измерять на таких скоростях

Аудиосигналы

  • 44.1 / 48 kHz — без проблем
  • простой аудиорекордер
  • спектроанализатор (FFT на втором ядре)

Вибрации и датчики

  • акселерометры без цифрового интерфейса
  • диагностика двигателей
  • измерение шумов питания

Радиолюбительские эксперименты

  • OOK / ASK сигналы
  • простейшие FSK
  • приём ИК / ультразвука

Логгеры данных

  • быстрые переходные процессы
  • токовые шунты
  • фотодиоды

Многоканальные измерения: подводные камни

ADC в Pico — один, мультиплексированный.

Это означает:

  • каналы читаются по очереди
  • между каналами есть задержка
  • фаза между каналами не сохраняется

Практика:

  • для 2 каналов — скорость делится на 2
  • для 4 каналов — на 4
  • синхронных измерений нет

Если нужен настоящий многоканальный АЦП — внешний чип неизбежен.


RP2350: стало ли лучше?

В RP2350 архитектура ADC осталась похожей, но есть улучшения:

  • стабильнее работа с DMA
  • меньше конфликтов по памяти
  • выше предсказуемость таймингов
  • лучше масштабируется под RTOS

Это не «новый ADC», но более зрелая платформа для измерительных задач.


Чего Pico не умеет (и не стоит ждать)

Чтобы не было иллюзий:

— нет аппаратного sample&hold на каналах
— нет дифференциальных входов
— нет PGA (усилителя)
— нет аппаратных триггеров по уровню
— нет антиалиас-фильтра

Pico — это сырой, честный АЦП, и всю аналоговую часть придётся делать самому.


Почему это всё-таки «скрытая возможность»

Потому что:

  • документация почти не акцентирует внимание на ADC+DMA
  • примеры в SDK — минимальные
  • большинство проектов используют ADC неправильно
  • реальный потенциал раскрывается только при правильной архитектуре

Pico не заменит профессиональный осциллограф.
Но он может стать отличным измерительным ядром для собственных приборов.


Итог

Raspberry Pi Pico — это не «плохой АЦП», а АЦП, который нужно уметь готовить.

С правильной настройкой:

  • DMA берёт на себя поток данных
  • CPU занимается обработкой
  • второе ядро — визуализацией или связью

Именно в таких задачах Pico раскрывается как инженерный микроконтроллер, а не игрушка.