клас DAC – цифро-аналогове перетворення

DAC виводить аналогові напруги від 0 В до 3,3 В на одному з двох каналів STM32 DAC.

На кожній STM32 OpenMV Cam, що надає pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal), канали підключені наступним чином:

Канал DAC

Вивід роз’єму

Вивід STM32

DAC(1)

(не на роз’ємі)

PA4

DAC(2)

P6

PA5

OpenMV Cam N6 не має периферійного пристрою DAC; pyb.DAC недоступний на цій платі.

Приклад використання:

from pyb import DAC

dac = DAC(1)            # create DAC channel 1
dac.write(128)          # write a value to the DAC (approximately 1.65 V)

dac = DAC(1, bits=12)   # use 12-bit resolution
dac.write(4095)         # output maximum value, 3.3 V

Для виведення безперервної синусоїди:

import math
from pyb import DAC

# create a buffer containing a sine-wave
buf = bytearray(100)
for i in range(len(buf)):
    buf[i] = 128 + int(127 * math.sin(2 * math.pi * i / len(buf)))

# output the sine-wave at 400Hz
dac = DAC(1)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)

Для виведення безперервної синусоїди з 12-бітною роздільною здатністю:

import math
from array import array
from pyb import DAC

# 128-sample sine wave, half-word samples centred at 2048 (12-bit mid).
N = 128
buf = array("H", (
    2048 + int(2047 * math.sin(2 * math.pi * i / N))
    for i in range(N)
))

# Output the sine wave at 400Hz.
dac = DAC(1, bits=12)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)

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

class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)

Створює новий об’єкт DAC.

port може бути об’єктом Pin або цілим числом (1 або 2), що вибирає канал DAC 1 або 2. Фізичний вивід, до якого маршрутизується кожен канал, залежить від OpenMV Cam.

bits – ціле число, що визначає роздільну здатність; може бути 8 або 12. Максимальне значення, яке приймають write() та write_timed(), дорівнює (2**bits) - 1 (255 для 8-бітного режиму, 4095 для 12-бітного).

Параметр buffering вибирає поведінку вихідного буфера операційного підсилювача DAC, призначеного для зменшення вихідного імпедансу. Може бути None для вибору режиму за замовчуванням (буферизація увімкнена для DAC.noise(), DAC.triangle() та DAC.write_timed(), вимкнена для DAC.write()), False для повного вимкнення буферизації або True для її увімкнення.

При увімкненій буферизації вивід DAC може керувати навантаженнями до 5 кОм. Без буферизації вихідний імпеданс становить максимум 15 кОм: відповідно, для досягнення точності 1% без буферизації прикладене навантаження має бути менше 1,5 МОм. Використання буфера знижує точність, особливо поблизу крайніх значень діапазону.

Методи

init(bits: int = 8, *, buffering: bool | None = None) None

Повторно ініціалізує DAC. bits може бути 8 або 12. buffering може бути None, False або True; значення цього параметра описано у конструкторі вище.

deinit() None

Деініціалізує DAC, звільняючи його вивід для інших цілей.

noise(freq: int) None

Генерує псевдовипадковий шумовий сигнал. Нове випадкове значення записується на вихід DAC із заданою частотою.

triangle(freq: int) None

Генерує трикутну хвилю. Значення на виході DAC змінюється з заданою частотою і проходить весь 12-бітний діапазон (вгору і вниз). Тому частота самої повторюваної трикутної хвилі у 8192 рази менша.

write(value: int) None

Прямий доступ до виходу DAC. Мінімальне значення – 0; максимальне – (2**bits) - 1, де bits задається при створенні об’єкта DAC або через init().

write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None

Ініціює пакетну передачу з RAM у DAC за допомогою DMA. Вхідні дані трактуються як масив байтів у 8-бітному режимі та як масив беззнакових напівслів (типовий код масиву „H“) у 12-бітному режимі.

freq може бути цілим числом, що задає частоту запису семплів DAC за допомогою Timer(6). Або це може бути вже ініціалізований об’єкт Timer, який використовується для тактування семплів DAC. Допустимі таймери: 2, 4, 5, 6, 7 та 8.

mode може бути DAC.NORMAL або DAC.CIRCULAR.

Приклад одночасного використання обох DAC:

dac1 = DAC(1)
dac2 = DAC(2)
dac1.write_timed(buf1, pyb.Timer(6, freq=100), mode=DAC.CIRCULAR)
dac2.write_timed(buf2, pyb.Timer(7, freq=200), mode=DAC.CIRCULAR)

Константи

NORMAL: int

Режим NORMAL виконує одноразову передачу форми сигналу з буфера даних.

CIRCULAR: int

Режим CIRCULAR передає форму сигналу з буфера даних і повертається на початок буфера щоразу, коли досягає його кінця, утворюючи безперервний цикл до виклику deinit().