class DAC – conversão digital para analógico¶
O DAC produz tensões analógicas entre 0 V e 3,3 V num de dois canais DAC do STM32.
Em todos os OpenMV Cam baseados em STM32 que expõem pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal) os canais estão ligados da seguinte forma:
Canal DAC |
Pino do conector |
Pino STM32 |
|---|---|---|
|
(não no conector) |
|
|
|
|
O OpenMV Cam N6 não possui um periférico DAC; pyb.DAC não está disponível nessa placa.
Exemplo de utilização:
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
Para produzir uma onda sinusoidal contínua:
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)
Para produzir uma onda sinusoidal contínua com resolução de 12 bits:
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)
Construtores¶
- class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)¶
Constrói um novo objeto DAC.
portpode ser um objetoPin, ou um inteiro (1ou2) que seleciona o canal DAC 1 ou 2. O pino físico ao qual cada canal está ligado depende do OpenMV Cam.bitsé um inteiro que especifica a resolução e pode ser 8 ou 12. O valor máximo aceite porwrite()ewrite_timed()é(2**bits) - 1(255 para 8 bits, 4095 para 12 bits).O parâmetro buffering seleciona o comportamento do buffer do amplificador operacional de saída do DAC, cuja finalidade é reduzir a impedância de saída. Pode ser
Nonepara selecionar o comportamento predefinido (buffer ativado paraDAC.noise(),DAC.triangle()eDAC.write_timed(), e desativado paraDAC.write()),Falsepara desativar completamente o buffer, ouTruepara ativar o buffer de saída.Quando o buffer está ativado, o pino DAC pode acionar cargas até 5 KΩ. Caso contrário, tem uma impedância de saída máxima de 15 KΩ: consequentemente, para obter uma precisão de 1% sem buffer, é necessário que a carga aplicada seja inferior a 1,5 MΩ. A utilização do buffer acarreta uma penalização na precisão, especialmente próximo dos extremos da gama.
Métodos¶
- init(bits: int = 8, *, buffering: bool | None = None) None¶
Reinicializa o DAC. bits pode ser 8 ou 12. buffering pode ser
None,FalseouTrue; consulte o construtor acima para o significado deste parâmetro.
- noise(freq: int) None¶
Gera um sinal de ruído pseudo-aleatório. Uma nova amostra aleatória é escrita na saída do DAC à frequência indicada.
- triangle(freq: int) None¶
Gera uma onda triangular. O valor na saída do DAC muda à frequência indicada e percorre toda a gama de 12 bits (subida e descida). Portanto, a frequência da onda triangular repetida em si é 8192 vezes menor.
- write(value: int) None¶
Acesso direto à saída do DAC. O valor mínimo é
0; o valor máximo é(2**bits) - 1, ondebitsé definido ao criar o objeto DAC ou através deinit().
- write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None¶
Inicia uma transferência em rajada de RAM para o DAC usando DMA. Os dados de entrada são tratados como um array de bytes no modo de 8 bits e como um array de meias-palavras sem sinal (typecode de array “H”) no modo de 12 bits.
freqpode ser um inteiro que especifica a frequência de escrita das amostras do DAC, utilizando Timer(6). Ou pode ser um objeto Timer já inicializado, que é usado para acionar a amostra do DAC. Os temporizadores válidos são 2, 4, 5, 6, 7 e 8.modepode serDAC.NORMALouDAC.CIRCULAR.Exemplo utilizando ambos os DACs ao mesmo tempo:
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)
Constantes¶