class ADC – conversione analogico-digitale

Utilizzo:

import pyb

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

Vedere pyb.ADCAll per l’accesso simultaneo a tutti i canali ADC oltre ai sensori interni del MCU per la temperatura del die, VBAT e VREFINT.

Costruttori

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

Crea un oggetto ADC associato al pin specificato. Questo permette poi di leggere valori analogici su quel pin.

Metodi

read() int

Legge il valore sul pin analogico e lo restituisce. Il valore restituito sarà compreso tra 0 e 4095.

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

Legge valori analogici in buf a una frequenza impostata dall’oggetto timer.

buf può essere ad esempio un bytearray o un array.array. I valori dell’ADC hanno una risoluzione a 12 bit e vengono memorizzati direttamente in buf se la dimensione dei suoi elementi è di 16 bit o superiore. Se buf ha elementi di soli 8 bit (ad esempio un bytearray) la risoluzione del campionamento verrà ridotta a 8 bit.

timer deve essere un oggetto Timer e viene letto un campione ogni volta che il timer scatta. Il timer deve essere già inizializzato e in esecuzione alla frequenza di campionamento desiderata.

Per supportare il comportamento precedente di questa funzione, timer può anche essere un intero che specifica la frequenza (in Hz) a cui campionare. In questo caso Timer(6) verrà configurato automaticamente per funzionare alla frequenza indicata.

Esempio usando un oggetto Timer (modo preferito):

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

Esempio usando un intero per la frequenza:

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)

Questa funzione non alloca alcuna memoria heap. Ha un comportamento bloccante: non ritorna al programma chiamante finché il buffer non è pieno.

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

Estrae dati relativi di temporizzazione o di fase da più ADC.

Legge valori analogici da più ADC in buffer a una frequenza impostata dall’oggetto timer. Ogni volta che il timer scatta viene letto rapidamente un campione da ciascun ADC a turno.

Le istanze di ADC e buffer vengono passate in tuple in cui ogni ADC ha un buffer associato. Tutti i buffer devono essere dello stesso tipo e lunghezza e il numero di buffer deve essere uguale al numero di ADC.

I buffer possono essere ad esempio bytearray o array.array. I valori dell’ADC hanno una risoluzione a 12 bit e vengono memorizzati direttamente nel buffer se la dimensione dei suoi elementi è di 16 bit o superiore. Se i buffer hanno elementi di soli 8 bit (ad esempio un bytearray) la risoluzione del campionamento verrà ridotta a 8 bit.

timer deve essere un oggetto Timer. Il timer deve essere già inizializzato e in esecuzione alla frequenza di campionamento desiderata.

Le OpenMV Cam STM32 espongono un solo pin di header con capacità ADC (P6), quindi sull’hardware di serie read_timed_multi è utile solo con un singolo ADC. Collega ulteriori ingressi analogici tramite i riferimenti cpu di pyb.Pin per usarlo con più di un ADC.

Esempio di lettura di 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)

Questa funzione non alloca alcuna memoria heap. Ha un comportamento bloccante: non ritorna al programma chiamante finché i buffer non sono pieni.

La funzione restituisce True se tutti i campioni sono stati acquisiti con la temporizzazione corretta. Ad alte frequenze di campionamento il tempo impiegato per acquisire un insieme di campioni può superare il periodo del timer. In questo caso la funzione restituisce False, indicando una perdita di precisione nell’intervallo di campionamento. In casi estremi alcuni campioni possono essere persi.

La frequenza massima dipende da fattori quali la larghezza dei dati e il numero di ADC letti. Nei test due ADC sono stati campionati a una frequenza del timer di 210kHz senza overrun. Alcuni campioni sono stati persi a 215kHz. Per tre ADC il limite è intorno ai 140kHz, e per quattro è intorno ai 110kHz. Ad alte frequenze di campionamento disabilitare gli interrupt per tutta la durata può ridurre il rischio di perdite di dati sporadiche.