клас 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 Cams виставляють лише один вивід заголовка з підтримкою ADC (P6), тому на стандартному обладнанні read_timed_multi корисний лише з одним ADC. Для використання з більш ніж одним ADC підключіть додаткові аналогові входи через посилання cpu класу pyb.Pin.

Приклад зчитування з одного 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 кГц. При високих частотах дискретизації відключення переривань на час роботи може зменшити ризик випадкової втрати даних.