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.Pincpu, чтобы использовать её с более чем одним 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 кГц. При высоких частотах выборки отключение прерываний на время операции может снизить риск спорадической потери данных.