clase DAC – conversión de digital a analógico¶
El DAC genera tensiones analógicas entre 0 V y 3,3 V en uno de los dos canales DAC del STM32.
En cada OpenMV Cam basada en STM32 que expone pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal) los canales están conectados de la siguiente manera:
Canal del DAC |
Pin del conector |
Pin del STM32 |
|---|---|---|
|
(no está en el conector) |
|
|
|
|
La OpenMV Cam N6 no tiene un periférico DAC; pyb.DAC no está disponible en esa placa.
Ejemplo de uso:
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 generar una onda sinusoidal continua:
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 generar una onda sinusoidal continua con resolución 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)
Constructores¶
- class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)¶
Construye un nuevo objeto DAC.
portpuede ser un objetoPin, o un entero (1o2) que selecciona el canal 1 o 2 del DAC. El pin físico al que se enruta cada canal depende de la OpenMV Cam.bitses un entero que especifica la resolución, y puede ser 8 o 12. El valor máximo aceptado porwrite()ywrite_timed()es(2**bits) - 1(255 para 8 bits, 4095 para 12 bits).El parámetro buffering selecciona el comportamiento del búfer de salida del amplificador operacional del DAC, cuyo propósito es reducir la impedancia de salida. Puede ser
Nonepara seleccionar el valor predeterminado (el búfer está habilitado paraDAC.noise(),DAC.triangle()yDAC.write_timed(), y deshabilitado paraDAC.write()),Falsepara deshabilitar el búfer por completo, oTruepara habilitar el búfer de salida.Cuando el búfer está habilitado, el pin del DAC puede excitar cargas de hasta 5KΩ. De lo contrario, tiene una impedancia de salida de 15KΩ como máximo: por lo tanto, para lograr una precisión del 1% sin búfer se requiere que la carga aplicada sea inferior a 1,5MΩ. El uso del búfer conlleva una pérdida de precisión, especialmente cerca de los extremos del rango.
Métodos¶
- init(bits: int = 8, *, buffering: bool | None = None) None¶
Reinicializa el DAC. bits puede ser 8 o 12. buffering puede ser
None,FalseoTrue; consulta el constructor anterior para conocer el significado de este parámetro.
- noise(freq: int) None¶
Genera una señal de ruido pseudoaleatorio. Se escribe una nueva muestra aleatoria en la salida del DAC a la frecuencia indicada.
- triangle(freq: int) None¶
Genera una onda triangular. El valor en la salida del DAC cambia a la frecuencia indicada y recorre todo el rango de 12 bits (subiendo y bajando). Por lo tanto, la frecuencia de la onda triangular repetitiva en sí es 8192 veces menor.
- write(value: int) None¶
Acceso directo a la salida del DAC. El valor mínimo es
0; el máximo es(2**bits) - 1, dondebitsse establece al crear el objeto DAC o medianteinit().
- write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None¶
Inicia una ráfaga de transferencia de RAM al DAC mediante una transferencia DMA. Los datos de entrada se tratan como una matriz de bytes en modo de 8 bits, y como una matriz de medias palabras sin signo (código de tipo de matriz “H”) en modo de 12 bits.
freqpuede ser un entero que especifica la frecuencia a la que escribir las muestras del DAC, usando Timer(6). O puede ser un objeto Timer ya inicializado que se utiliza para disparar la muestra del DAC. Los temporizadores válidos son 2, 4, 5, 6, 7 y 8.modepuede serDAC.NORMALoDAC.CIRCULAR.Ejemplo usando ambos DAC al mismo tiempo:
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¶