class ADC – аналого-цифровое преобразование

Использование:

import pyb

adc = pyb.ADC("P6")
val = adc.read()

См. pyb.ADCAll для одновременного доступа ко всем каналам ADC, а также к встроенным в MCU датчикам температуры кристалла, VBAT и VREFINT.

Конструкторы

class pyb.ADC(pin: int | str | Pin)

Создаёт объект ADC, связанный с указанным выводом. Это позволяет затем считывать аналоговые значения на этом выводе.

Методы

read() int

Считывает значение на аналоговом выводе и возвращает его. Возвращаемое значение находится в диапазоне от 0 до 4095.

read_timed(buf: bytearray | 'array.array', timer: Timer | int) int

Считывает аналоговые значения в buf с частотой, задаваемой объектом timer.

buf может быть, например, bytearray или array.array. Значения ADC имеют 12-битное разрешение и сохраняются непосредственно в buf, если размер его элемента составляет 16 бит или более. Если buf содержит только 8-битные элементы (например, bytearray), то разрешение выборки будет уменьшено до 8 бит.

timer должен быть объектом Timer, и выборка считывается каждый раз при срабатывании таймера. Таймер должен быть уже инициализирован и работать с требуемой частотой выборки.

Для поддержки прежнего поведения этой функции timer также может быть целым числом, указывающим частоту (в Гц) для выборки. В этом случае Timer(6) будет автоматически настроен на работу с заданной частотой.

Пример с использованием объекта Timer (предпочтительный способ):

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
tim = pyb.Timer(6, freq=10)        # create a timer running at 10Hz
buf = bytearray(100)               # buffer to hold the samples
adc.read_timed(buf, tim)           # sample 100 values, taking 10s

Пример с использованием целого числа для частоты:

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
buf = bytearray(100)               # buffer of 100 bytes
adc.read_timed(buf, 10)            # read 100 samples at 10Hz (10s total)

for val in buf:
    print(val)

Эта функция не выделяет память в куче. Она имеет блокирующее поведение: она не возвращает управление вызывающей программе, пока буфер не будет заполнен.

static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool

Извлекает данные об относительном времени или фазе из нескольких ADC.

Считывает аналоговые значения из нескольких ADC в буферы с частотой, задаваемой объектом timer. Каждый раз при срабатывании таймера выборка быстро считывается поочерёдно из каждого ADC.

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

Буферы могут быть, например, bytearray или array.array. Значения ADC имеют 12-битное разрешение и сохраняются непосредственно в буфер, если размер его элемента составляет 16 бит или более. Если буферы содержат только 8-битные элементы (например, bytearray), то разрешение выборки будет уменьшено до 8 бит.

timer должен быть объектом Timer. Таймер должен быть уже инициализирован и работать с требуемой частотой выборки.

Камеры STM32 OpenMV Cam выводят только один вывод заголовка с поддержкой ADC (P6), поэтому на штатном оборудовании read_timed_multi полезна только с одним ADC. Подключите дополнительные аналоговые входы через ссылки pyb.Pin cpu, чтобы использовать её с более чем одним ADC.

Пример считывания одного ADC:

import array

adc = pyb.ADC(pyb.Pin.board.P6)
tim = pyb.Timer(8, freq=100)
rx = array.array("H", (0 for i in range(100)))

# Sample 100 values at 100Hz (takes one second).
pyb.ADC.read_timed_multi((adc,), (rx,), tim)

for val in rx:
    print(val)

Эта функция не выделяет память в куче. Она имеет блокирующее поведение: она не возвращает управление вызывающей программе, пока буферы не будут заполнены.

Функция возвращает True, если все выборки были получены с правильной синхронизацией. При высоких частотах выборки время, затраченное на получение набора выборок, может превысить период таймера. В этом случае функция возвращает False, указывая на потерю точности в интервале между выборками. В крайних случаях выборки могут быть пропущены.

Максимальная частота зависит от ряда факторов, включая ширину данных и количество считываемых ADC. В ходе тестирования два ADC выбирались с частотой таймера 210 кГц без переполнения. При 215 кГц выборки пропускались. Для трёх ADC предел составляет около 140 кГц, а для четырёх — около 110 кГц. При высоких частотах выборки отключение прерываний на время операции может снизить риск спорадической потери данных.