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

DAC выдаёт аналоговое напряжение от 0 В до 3,3 В на одном из двух каналов DAC STM32.

На каждой OpenMV Cam на базе STM32, предоставляющей 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().