class DAC – digitaal-naar-analoog-conversie¶
De DAC geeft analoge spanningen tussen 0 V en 3,3 V uit op een van de twee STM32 DAC-kanalen.
Op elke STM32 OpenMV Cam die pyb.DAC beschikbaar stelt (M4 / M7 / H7 / H7 Plus / Pure Thermal) zijn de kanalen als volgt bedraad:
DAC-kanaal |
Header-pin |
STM32-pin |
|---|---|---|
|
(niet op header) |
|
|
|
|
De OpenMV Cam N6 heeft geen DAC-randapparaat; pyb.DAC is niet beschikbaar op dat board.
Voorbeeldgebruik:
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
Om een continue sinusgolf uit te voeren:
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)
Om een continue sinusgolf met 12-bits resolutie uit te voeren:
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)
Constructors¶
- class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)¶
Construeer een nieuw DAC-object.
portkan eenPin-object zijn, of een geheel getal (1of2) dat DAC-kanaal 1 of 2 selecteert. Naar welke fysieke pin elk kanaal wordt gerouteerd hangt af van de OpenMV Cam.bitsis een geheel getal dat de resolutie aangeeft en kan 8 of 12 zijn. De maximale waarde die doorwrite()enwrite_timed()wordt geaccepteerd is(2**bits) - 1(255 voor 8-bits, 4095 voor 12-bits).De parameter buffering selecteert het gedrag van de uitgangsbuffer van de DAC-opamp, die als doel heeft de uitgangsimpedantie te verlagen. Het kan
Nonezijn om de standaard te selecteren (buffering ingeschakeld voorDAC.noise(),DAC.triangle()enDAC.write_timed(), en uitgeschakeld voorDAC.write()),Falseom buffering volledig uit te schakelen, ofTrueom uitgangsbuffering in te schakelen.Wanneer buffering is ingeschakeld kan de DAC-pin lasten tot 5KΩ aansturen. Anders heeft hij een uitgangsimpedantie van maximaal 15KΩ: om zonder buffering een nauwkeurigheid van 1% te bereiken, moet de aangelegde last bijgevolg kleiner zijn dan 1,5MΩ. Het gebruik van de buffer gaat ten koste van nauwkeurigheid, vooral nabij de uiteinden van het bereik.
Methods¶
- init(bits: int = 8, *, buffering: bool | None = None) None¶
Herinitialiseer de DAC. bits kan 8 of 12 zijn. buffering kan
None,FalseofTruezijn; zie de bovenstaande constructor voor de betekenis van deze parameter.
- noise(freq: int) None¶
Genereer een pseudowillekeurig ruissignaal. Op de gegeven frequentie wordt een nieuw willekeurig sample naar de DAC-uitgang geschreven.
- triangle(freq: int) None¶
Genereer een driehoeksgolf. De waarde op de DAC-uitgang verandert op de gegeven frequentie en doorloopt het volledige 12-bits bereik (omhoog en omlaag). De frequentie van de herhalende driehoeksgolf zelf is daarom 8192 keer kleiner.
- write(value: int) None¶
Directe toegang tot de DAC-uitgang. De minimumwaarde is
0; het maximum is(2**bits) - 1, waarbijbitswordt ingesteld bij het aanmaken van het DAC-object of viainit().
- write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None¶
Start een burst van RAM naar DAC met behulp van een DMA-overdracht. De invoerdata wordt in 8-bits modus behandeld als een array van bytes en in 12-bits modus als een array van unsigned halfwords (array-typecode ‘H’).
freqkan een geheel getal zijn dat de frequentie aangeeft waarmee de DAC-samples worden geschreven, met behulp van Timer(6). Of het kan een al geïnitialiseerd Timer-object zijn dat wordt gebruikt om het DAC-sample te triggeren. Geldige timers zijn 2, 4, 5, 6, 7 en 8.modekanDAC.NORMALofDAC.CIRCULARzijn.Voorbeeld waarbij beide DAC’s tegelijkertijd worden gebruikt:
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)
Constants¶