клас DAC – цифро-аналогове перетворення¶
DAC виводить аналогові напруги від 0 В до 3,3 В на одному з двох каналів STM32 DAC.
На кожній STM32 OpenMV Cam, що надає 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)
Константи¶