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