Перейти к содержанию

Регистры ADC RP2350

Регистры 12-битного АЦП RP2350: до восьми внешних входов в корпусе QFN-80, датчик температуры, одиночные и непрерывные преобразования, поочерёдный опрос каналов, FIFO результатов для DMA и прерывания.

АЦП RP2350 — 12-битный преобразователь последовательного приближения на 500 тысяч выборок в секунду с эффективной разрядностью 9,2 бита. В корпусе QFN-60 у него четыре внешних входа на GPIO26–29 и датчик температуры на канале 4, как у RP2040; в QFN-80 — восемь входов на GPIO40–47 и датчик на канале 8 (даташит RP2350, раздел 12.4).

Регистры устроены как у RP2040, но поля CS шире: AINSEL — 4 бита, RROBIN — 9 бит, по одному на канал. Исправлены и скачки дифференциальной нелинейности на кодах 0x200, 0x600, 0xA00 и 0xE00 из эрраты RP2040-E11 — это прибавило около 0,5 эффективного бита.

Датчик температуры измеряет напряжение перехода биполярного диода: около 0,706 В при 27 °C с наклоном −1,721 мВ/°C. Перед измерением включают его смещение битом TS_EN — это добавляет около 40 мкА потребления от ADC_AVDD. Точность сильно зависит от опорного напряжения: ошибка 1 % при 3,3 В сдвигает результат больше чем на 4 °C.

ЭкземплярБазовый адрес
ADC0x400A 0000

В RP2040 блок ADC устроен иначе — регистры и поля отличаются, они описаны на странице «Регистры ADC RP2040».

Регистры блока

РегистрСмещениеНазначениеПосле сброса
ADC_CS0x00Управление и состояние АЦП0x0000 0000
ADC_RESULT0x04Результат последнего преобразования0x0000 0000
ADC_FCS0x08Управление и состояние FIFO0x0000 0000
ADC_FIFO0x0CFIFO результатов0x0000 0000
ADC_DIV0x10Делитель частоты выборок0x0000 0000
ADC_INTR0x14Необработанные флаги прерываний0x0000 0000
ADC_INTE0x18Разрешение прерываний0x0000 0000
ADC_INTF0x1CПринудительная установка прерываний0x0000 0000
ADC_INTS0x20Флаги прерываний после маски и принуждения0x0000 0000

ADC_CS — управление и состояние АЦП

Смещение 0x00, адрес 0x400A 0000, после сброса 0x0000 0000. Макросы pico-sdk: ADC_CS_…

31302928272625242322212019181716
—RROBIN
1514131211109876543210
AINSEL—ERR_STICKYERRREADY—START_MANYSTART_ONCETS_ENEN
  • RROBIN (биты 24:16, чтение и запись, после сброса 0x000) — Поочерёдный опрос: по биту на канал 0–8. Все нули — опрос выключен; иначе АЦП по кругу переходит между отмеченными каналами, начиная с AINSEL, и после каждого преобразования обновляет AINSEL.
  • AINSEL (биты 15:12, чтение и запись, после сброса 0x0) — Выбор входа: в QFN-60 0–3 — GPIO26–29, 4 — датчик температуры; в QFN-80 0–7 — GPIO40–47, 8 — датчик.
  • ERR_STICKY (бит 10, сброс записью 1, после сброса 0x0) — Ошибка была в одном из прошлых преобразований; сбрасывается записью 1.
  • ERR (бит 9, только чтение, после сброса 0x0) — Ошибка в последнем преобразовании: результат не определён или зашумлён.
  • READY (бит 8, только чтение, после сброса 0x0) — 1 — АЦП готов к новому преобразованию, предыдущее завершено; 0 — идёт преобразование.
  • START_MANY (бит 3, чтение и запись, после сброса 0x0) — Непрерывные преобразования, пока бит равен 1: следующее начинается сразу после предыдущего или по делителю DIV.
  • START_ONCE (бит 2, сбрасывается сам, после сброса 0x0) — Запуск одного преобразования; сбрасывается сам и не действует при START_MANY = 1.
  • TS_EN (бит 1, чтение и запись, после сброса 0x0) — Включение датчика температуры: 1 — включён.
  • EN (бит 0, чтение и запись, после сброса 0x0) — Включение питания и тактирования АЦП: 1 — включён.

ADC_RESULT — результат последнего преобразования

Смещение 0x04, адрес 0x400A 0004, после сброса 0x0000 0000, только чтение. Макросы pico-sdk: ADC_RESULT_…

Отдельных полей нет: значение занимает биты 11:0, остальные биты не используются.

ADC_FCS — управление и состояние FIFO

Смещение 0x08, адрес 0x400A 0008, после сброса 0x0000 0000. Макросы pico-sdk: ADC_FCS_…

31302928272625242322212019181716
—THRESH—LEVEL
1514131211109876543210
—OVERUNDERFULLEMPTY—DREQ_ENERRSHIFTEN
  • THRESH (биты 27:24, чтение и запись, после сброса 0x0) — Порог FIFO: запрос DMA и прерывание, когда в FIFO не меньше значений.
  • LEVEL (биты 19:16, только чтение, после сброса 0x0) — Сколько результатов сейчас лежит в FIFO.
  • OVER (бит 11, сброс записью 1, после сброса 0x0) — FIFO переполнилось; сбрасывается записью 1.
  • UNDER (бит 10, сброс записью 1, после сброса 0x0) — Чтение из пустого FIFO; сбрасывается записью 1.
  • FULL (бит 9, только чтение, после сброса 0x0) — FIFO заполнено.
  • EMPTY (бит 8, только чтение, после сброса 0x0) — FIFO пусто.
  • DREQ_EN (бит 3, чтение и запись, после сброса 0x0) — Запрос DMA, когда в FIFO есть данные.
  • ERR (бит 2, чтение и запись, после сброса 0x0) — Записывать в FIFO вместе с результатом бит ошибки преобразования.
  • SHIFT (бит 1, чтение и запись, после сброса 0x0) — Сдвигать результаты в FIFO вправо до 8 бит — для DMA в массив байтов.
  • EN (бит 0, чтение и запись, после сброса 0x0) — Записывать результат каждого преобразования в FIFO.

ADC_FIFO — fIFO результатов

Смещение 0x0C, адрес 0x400A 000C, после сброса 0x0000 0000. Макросы pico-sdk: ADC_FIFO_…

1514131211109876543210
ERR—VAL
  • ERR (бит 15, чтение с побочным действием, после сброса не определено) — 1 — при этой выборке была ошибка преобразования; бит остаётся на месте и при сдвиге SHIFT.
  • VAL (биты 11:0, чтение с побочным действием, после сброса не определено) — Результат преобразования.

ADC_DIV — делитель частоты выборок

Смещение 0x10, адрес 0x400A 0010, после сброса 0x0000 0000. Макросы pico-sdk: ADC_DIV_…

31302928272625242322212019181716
—INT
1514131211109876543210
INTFRAC
  • INT (биты 23:8, чтение и запись, после сброса 0x0000) — Целая часть делителя.
  • FRAC (биты 7:0, чтение и запись, после сброса 0x00) — Дробная часть делителя в 1/256: дробь получается дельта-сигма-модуляцией первого порядка.

ADC_INTR — необработанные флаги прерываний

Смещение 0x14, адрес 0x400A 0014, после сброса 0x0000 0000. Макросы pico-sdk: ADC_INTR_…

  • FIFO (бит 0, только чтение, после сброса 0x0) — Прерывание по уровню FIFO: число значений достигло порога FCS.THRESH.

ADC_INTE — разрешение прерываний

Смещение 0x18, адрес 0x400A 0018, после сброса 0x0000 0000. Макросы pico-sdk: ADC_INTE_…

  • FIFO (бит 0, чтение и запись, после сброса 0x0) — Разрешение прерывания по уровню FIFO.

ADC_INTF — принудительная установка прерываний

Смещение 0x1C, адрес 0x400A 001C, после сброса 0x0000 0000. Макросы pico-sdk: ADC_INTF_…

  • FIFO (бит 0, чтение и запись, после сброса 0x0) — Принудительная установка прерывания по уровню FIFO.

ADC_INTS — флаги прерываний после маски и принуждения

Смещение 0x20, адрес 0x400A 0020, после сброса 0x0000 0000. Макросы pico-sdk: ADC_INTS_…

  • FIFO (бит 0, только чтение, после сброса 0x0) — Прерывание по уровню FIFO после маски и принуждения.

Частые вопросы

Сколько входов АЦП у RP2350?

В корпусе QFN-60 (RP2350A) — четыре внешних входа на GPIO26–29, в QFN-80 (RP2350B) — восемь на GPIO40–47. Ещё один канал — встроенный датчик температуры: AINSEL = 4 или 8 соответственно.

Как измерить температуру встроенным датчиком RP2350?

Включите АЦП и датчик битами EN и TS_EN регистра CS, выберите AINSEL = 4 (QFN-60) или 8 (QFN-80) и запустите START_ONCE. При опорном 3,3 В напряжение U = RESULT × 3,3 / 4096, температура ≈ 27 − (U − 0,706) / 0,001721 °C; для точности нужна калибровка.

Источники

  1. Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 12.4.7: список регистров, назначение полей, тип доступа и значения после сброса
  2. Raspberry Pi. pico-sdk 2.1.1: заголовки src/rp2350/hardware_regs/include/hardware/regs/*.h (коммит bddd20f) — смещения, биты, тип доступа и значение после сброса каждого поля, базовые адреса из addressmap.h; лицензия BSD-3-Clause

Нашли ошибку в регистрах?

Другие регистры RP2350

Статьи и термины