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
bufa una frequenza impostata dall’oggettotimer.bufpuò essere ad esempio un bytearray o un array.array. I valori dell’ADC hanno una risoluzione a 12 bit e vengono memorizzati direttamente inbufse la dimensione dei suoi elementi è di 16 bit o superiore. Sebufha elementi di soli 8 bit (ad esempio un bytearray) la risoluzione del campionamento verrà ridotta a 8 bit.timerdeve 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,
timerpuò 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
bytearrayoarray.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 unbytearray) 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 serieread_timed_multiè utile solo con un singolo ADC. Collega ulteriori ingressi analogici tramite i riferimenticpudipyb.Pinper 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
Truese 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 restituisceFalse, 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.