класс DAC – цифро-аналоговое преобразование¶
DAC выдаёт аналоговое напряжение от 0 В до 3,3 В на одном из двух каналов DAC STM32.
На каждой OpenMV Cam на базе STM32, предоставляющей pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal), каналы подключены следующим образом:
Канал DAC |
Вывод разъёма |
Вывод STM32 |
|---|---|---|
|
(нет на разъёме) |
|
|
|
|
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; смотрите конструктор выше для значения этого параметра.
- 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)
Константы¶