class ADC – conversión analógica a digital

Uso:

import pyb

adc = pyb.ADC("P6")
val = adc.read()

Consulte pyb.ADCAll para acceder simultáneamente a todos los canales ADC, además de los sensores internos del MCU de temperatura del troquel, VBAT y VREFINT.

Constructores

class pyb.ADC(pin: int | str | Pin)

Crea un objeto ADC asociado al pin indicado. Esto le permite leer valores analógicos en ese pin.

Métodos

read() int

Lee el valor del pin analógico y lo devuelve. El valor devuelto estará entre 0 y 4095.

read_timed(buf: bytearray | 'array.array', timer: Timer | int) int

Lee valores analógicos en buf a una velocidad establecida por el objeto timer.

buf puede ser, por ejemplo, un bytearray o un array.array. Los valores del ADC tienen una resolución de 12 bits y se almacenan directamente en buf si el tamaño de sus elementos es de 16 bits o mayor. Si buf solo tiene elementos de 8 bits (por ejemplo, un bytearray), la resolución de muestreo se reducirá a 8 bits.

timer debe ser un objeto Timer, y se lee una muestra cada vez que el temporizador se dispara. El temporizador ya debe estar inicializado y funcionando a la frecuencia de muestreo deseada.

Para mantener el comportamiento anterior de esta función, timer también puede ser un entero que especifica la frecuencia (en Hz) a la que muestrear. En este caso, Timer(6) se configurará automáticamente para funcionar a la frecuencia dada.

Ejemplo usando un objeto Timer (forma preferida):

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
tim = pyb.Timer(6, freq=10)        # create a timer running at 10Hz
buf = bytearray(100)               # buffer to hold the samples
adc.read_timed(buf, tim)           # sample 100 values, taking 10s

Ejemplo usando un entero para la frecuencia:

adc = pyb.ADC(pyb.Pin.board.P6)    # create an ADC on pin P6
buf = bytearray(100)               # buffer of 100 bytes
adc.read_timed(buf, 10)            # read 100 samples at 10Hz (10s total)

for val in buf:
    print(val)

Esta función no asigna memoria del montículo. Tiene un comportamiento bloqueante: no regresa al programa que la llama hasta que el búfer está lleno.

static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool

Extrae datos relativos de temporización o de fase de múltiples ADC.

Lee valores analógicos de múltiples ADC en búferes a una velocidad establecida por el objeto timer. Cada vez que el temporizador se dispara, se lee rápidamente una muestra de cada ADC por turno.

Las instancias de ADC y de búfer se pasan en tuplas, con cada ADC asociado a un búfer. Todos los búferes deben ser del mismo tipo y longitud, y el número de búferes debe ser igual al número de ADC.

Los búferes pueden ser, por ejemplo, bytearray o array.array. Los valores del ADC tienen una resolución de 12 bits y se almacenan directamente en el búfer si el tamaño de sus elementos es de 16 bits o mayor. Si los búferes solo tienen elementos de 8 bits (por ejemplo, un bytearray), la resolución de muestreo se reducirá a 8 bits.

timer debe ser un objeto Timer. El temporizador ya debe estar inicializado y funcionando a la frecuencia de muestreo deseada.

Las OpenMV Cam con STM32 exponen solo un pin de cabecera con capacidad ADC (P6), por lo que en el hardware de serie read_timed_multi solo resulta útil con un único ADC. Conecte entradas analógicas adicionales mediante referencias cpu de pyb.Pin para usarlo con más de un ADC.

Ejemplo de lectura de un ADC:

import array

adc = pyb.ADC(pyb.Pin.board.P6)
tim = pyb.Timer(8, freq=100)
rx = array.array("H", (0 for i in range(100)))

# Sample 100 values at 100Hz (takes one second).
pyb.ADC.read_timed_multi((adc,), (rx,), tim)

for val in rx:
    print(val)

Esta función no asigna memoria del montículo. Tiene un comportamiento bloqueante: no regresa al programa que la llama hasta que los búferes están llenos.

La función devuelve True si todas las muestras se adquirieron con la temporización correcta. A velocidades de muestreo altas, el tiempo necesario para adquirir un conjunto de muestras puede exceder el período del temporizador. En este caso, la función devuelve False, lo que indica una pérdida de precisión en el intervalo de muestreo. En casos extremos pueden perderse muestras.

La velocidad máxima depende de factores como el ancho de los datos y el número de ADC que se leen. En las pruebas, se muestrearon dos ADC a una velocidad de temporizador de 210 kHz sin desbordamiento. Se perdieron muestras a 215 kHz. Para tres ADC el límite ronda los 140 kHz, y para cuatro ronda los 110 kHz. A velocidades de muestreo altas, deshabilitar las interrupciones durante la operación puede reducir el riesgo de pérdida esporádica de datos.