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

Режим сканирования АЦП

Нужно опрашивать пять датчиков на разных входах АЦП, не переключая канал вручную после каждого преобразования. Для этого у АЦП STM32 есть режим сканирования: он сам проходит по заданному списку каналов, а DMA раскладывает результаты по массиву.

Обновлено Редакция GAW

Режим сканирования (scan mode) — режим АЦП STM32, в котором преобразователь автоматически обходит группу каналов, заданную списком, и после каждого преобразования сам переключается на следующий канал. Включается битом SCAN в регистре ADC_CR1 (RM0090, разд. 13.3.8).

Группы каналов

ГруппаСколько преобразованийГде задан списокКуда результат
Регулярнаядо 16ADC_SQR1–ADC_SQR3, длина — поле L[3:0] в SQR1один регистр ADC_DR
Инжектированнаядо 4ADC_JSQRсвой регистр ADC_JDR1–4

Источник: RM0090, разд. 13.3.3. Каналы в списке идут в любом порядке и могут повторяться.

Сканирование и DMA

У регулярной группы один регистр результата на всех. Поэтому сканирование почти всегда работает в паре с DMA: после каждого преобразования АЦП выдаёт запрос, и контроллер DMA переносит результат из ADC_DR в очередной элемент массива (RM0090, разд. 13.8.1). Если DMA или программа не успели забрать результат, выставляется флаг переполнения OVR — см. ошибка переполнения.

Типичная настройка для непрерывного опроса:

  1. SCAN = 1, CONT = 1 — бесконечный обход списка.
  2. DMA = 1 и DDS = 1 — запросы к DMA не прекращаются после последней передачи.
  3. Поток DMA в кольцевом режиме с длиной, равной числу элементов списка.
  4. Время выборки каждого канала в ADC_SMPRx — по выходному сопротивлению источника, см. время выборки АЦП.

После этого в массиве всегда лежат свежие результаты всех каналов, а программа просто читает его.

Флаг EOC

У STM32F4 флаг конца преобразования EOC в режиме сканирования выставляется либо в конце всего прохода (EOCS = 0), либо после каждого канала (EOCS = 1). Первый вариант удобен с DMA, второй — при чтении по прерыванию.

Регистры АЦП STM32F1 и STM32F4, пример кода со сканированием в DMA и время преобразования разобраны в статье об АЦП STM32, а время одного преобразования считает калькулятор АЦП STM32.

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

Можно ли в режиме сканирования обойтись без DMA?

У STM32F1 нет: в режиме сканирования бит DMA должен быть установлен (RM0008, разд. 11.3.8). Все регулярные каналы пишут результат в один регистр ADC_DR, и следующий результат затирает предыдущий. У STM32F4 можно выставить EOCS = 1 и забирать каждый результат по прерыванию EOC, но при высокой скорости это легко приводит к переполнению OVR. Надёжнее DMA: RM0090 прямо советует его для нескольких регулярных каналов (разд. 13.8.1).

Можно ли измерить один канал несколько раз за проход?

Да. Последовательность в регистрах ADC_SQRx произвольная, каналы могут повторяться: RM0090 приводит пример IN3, IN8, IN2, IN2, IN0, IN2, IN2, IN15 (разд. 13.3.3). Так можно чаще опрашивать быстрый сигнал или усреднять один канал внутри прохода.

Сколько длится полный проход по каналам?

Сумму времени преобразований всех элементов списка: для каждого — время выборки, заданное в ADC_SMPRx для его канала, плюс время самого преобразования, делённое на частоту АЦП. Время одного преобразования для заданных частоты и SMPx считает калькулятор АЦП STM32, а время прохода — сумма по всем элементам списка.

Источники

  1. STMicroelectronics. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437, STM32F429/439, Rev 21 — разд. 13.3.3: 16 мультиплексируемых каналов, регулярная группа — до 16 преобразований в любом порядке, каналы и порядок — в ADC_SQRx, число преобразований — поле L[3:0] в ADC_SQR1; инжектированная группа — до 4, в ADC_JSQR; пример последовательности IN3, IN8, IN2, IN2, IN0, IN2, IN2, IN15; разд. 13.3.8: SCAN в ADC_CR1 включает обход группы, по одному преобразованию на канал; при CONT = 1 обход регулярной группы повторяется с первого канала; при DMA = 1 результат каждого регулярного преобразования переносится из ADC_DR в SRAM; EOC выставляется в конце последовательности при EOCS = 0 или после каждого преобразования при EOCS = 1; результаты инжектированных каналов хранятся в ADC_JDRx; разд. 13.8.1: регулярные результаты лежат в одном регистре данных, поэтому для нескольких каналов нужен DMA; при потере данных — флаг OVR; при DDS = 1 запросы DMA продолжаются после последней передачи, что позволяет кольцевой режим DMA
  2. STMicroelectronics. RM0008 Reference manual STM32F101/102/103/105/107, Rev 21 — разд. 11.3.8: режим сканирования STM32F1 — бит SCAN в ADC_CR1, обход каналов из ADC_SQRx и ADC_JSQR; в режиме сканирования бит DMA должен быть установлен, и DMA переносит результаты регулярной группы в SRAM после каждого обновления ADC_DR; результаты инжектированных каналов — в ADC_JDRx

Нашли ошибку?