klasa DAC – konwersja cyfrowo-analogowa

DAC wytwarza napięcia analogowe z zakresu od 0 V do 3,3 V na jednym z dwóch kanałów DAC układu STM32.

W każdej kamerze OpenMV Cam opartej na STM32, która udostępnia pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal), kanały są podłączone w następujący sposób:

Kanał DAC

Pin złącza

Pin STM32

DAC(1)

(niedostępny na złączu)

PA4

DAC(2)

P6

PA5

OpenMV Cam N6 nie posiada urządzenia peryferyjnego DAC; pyb.DAC jest na tej płytce niedostępne.

Przykład użycia:

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

Aby wytworzyć ciągłą falę sinusoidalną:

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)

Aby wytworzyć ciągłą falę sinusoidalną z rozdzielczością 12-bitową:

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)

Konstruktory

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

Tworzy nowy obiekt DAC.

port może być obiektem Pin albo liczbą całkowitą (1 lub 2) wybierającą kanał DAC 1 lub 2. Fizyczny pin, do którego prowadzony jest dany kanał, zależy od modelu OpenMV Cam.

bits to liczba całkowita określająca rozdzielczość; może wynosić 8 lub 12. Maksymalna wartość akceptowana przez write() i write_timed() to (2**bits) - 1 (255 dla 8 bitów, 4095 dla 12 bitów).

Parametr buffering wybiera zachowanie wzmacniacza operacyjnego na wyjściu DAC, którego zadaniem jest zmniejszenie impedancji wyjściowej. Może przyjmować wartość None, aby wybrać domyślne ustawienie (buforowanie włączone dla DAC.noise(), DAC.triangle() i DAC.write_timed(), a wyłączone dla DAC.write()), False, aby całkowicie wyłączyć buforowanie, lub True, aby włączyć buforowanie wyjścia.

Gdy buforowanie jest włączone, pin DAC może zasilać obciążenia o wartości aż do 5 KΩ. W przeciwnym razie impedancja wyjściowa wynosi maksymalnie 15 KΩ: w konsekwencji, aby uzyskać dokładność 1% bez buforowania, przyłożone obciążenie musi być mniejsze niż 1,5 MΩ. Użycie bufora wiąże się z pogorszeniem dokładności, zwłaszcza w pobliżu skrajów zakresu.

Metody

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

Ponownie inicjalizuje DAC. bits może wynosić 8 lub 12. buffering może przyjmować wartość None, False lub True; znaczenie tego parametru opisano w konstruktorze powyżej.

deinit() None

Deinicjalizuje DAC, udostępniając jego pin do innych zastosowań.

noise(freq: int) None

Generuje pseudolosowy sygnał szumu. Nowa losowa próbka jest zapisywana na wyjściu DAC z zadaną częstotliwością.

triangle(freq: int) None

Generuje falę trójkątną. Wartość na wyjściu DAC zmienia się z zadaną częstotliwością i narasta przez cały zakres 12-bitowy (w górę i w dół). Dlatego częstotliwość samej powtarzającej się fali trójkątnej jest 8192 razy mniejsza.

write(value: int) None

Bezpośredni dostęp do wyjścia DAC. Wartość minimalna to 0; maksymalna to (2**bits) - 1, gdzie bits ustawiane jest podczas tworzenia obiektu DAC lub przez init().

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

Inicjuje transfer porcji danych z pamięci RAM do DAC za pomocą DMA. Dane wejściowe traktowane są jako tablica bajtów w trybie 8-bitowym oraz jako tablica półsłów bez znaku (kod typu tablicy «H») w trybie 12-bitowym.

freq może być liczbą całkowitą określającą częstotliwość, z jaką zapisywane są próbki DAC, przy użyciu Timer(6). Może też być już zainicjalizowanym obiektem Timer, który służy do wyzwalania próbki DAC. Prawidłowe liczniki to 2, 4, 5, 6, 7 i 8.

mode może przyjmować wartość DAC.NORMAL lub DAC.CIRCULAR.

Przykład jednoczesnego użycia obu układów 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)

Stałe

NORMAL: int

Tryb NORMAL wykonuje pojedynczą transmisję przebiegu z bufora danych.

CIRCULAR: int

Tryb CIRCULAR transmituje przebieg z bufora danych i po dotarciu do końca za każdym razem zawija się do początku bufora, tworząc ciągłą pętlę aż do wywołania deinit().