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

DAC(1)

(no está en el conector)

PA4

DAC(2)

P6

PA5

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.

port puede ser un objeto Pin, o un entero (1 o 2) que selecciona el canal 1 o 2 del DAC. El pin físico al que se enruta cada canal depende de la OpenMV Cam.

bits es un entero que especifica la resolución, y puede ser 8 o 12. El valor máximo aceptado por write() y write_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 None para seleccionar el valor predeterminado (el búfer está habilitado para DAC.noise(), DAC.triangle() y DAC.write_timed(), y deshabilitado para DAC.write()), False para deshabilitar el búfer por completo, o True para 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, False o True; consulta el constructor anterior para conocer el significado de este parámetro.

deinit() None

Desinicializa el DAC, dejando su pin disponible para otros usos.

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, donde bits se establece al crear el objeto DAC o mediante init().

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.

freq puede 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.

mode puede ser DAC.NORMAL o DAC.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

NORMAL: int

El modo NORMAL realiza una sola transmisión de la forma de onda del búfer de datos.

CIRCULAR: int

El modo CIRCULAR transmite la forma de onda del búfer de datos y vuelve al inicio del búfer cada vez que llega al final, produciendo un bucle continuo hasta que se llama a deinit().