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_timed(buf: bytearray | 'array.array', timer: Timer | int) int¶
Lee valores analógicos en
bufa una velocidad establecida por el objetotimer.bufpuede ser, por ejemplo, un bytearray o un array.array. Los valores del ADC tienen una resolución de 12 bits y se almacenan directamente enbufsi el tamaño de sus elementos es de 16 bits o mayor. Sibufsolo tiene elementos de 8 bits (por ejemplo, un bytearray), la resolución de muestreo se reducirá a 8 bits.timerdebe 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,
timertambié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,
bytearrayoarray.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, unbytearray), 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 serieread_timed_multisolo resulta útil con un único ADC. Conecte entradas analógicas adicionales mediante referenciascpudepyb.Pinpara 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
Truesi 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 devuelveFalse, 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.