ADC osztály – analóg-digitális átalakítás

Használat:

import pyb

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

Lásd a pyb.ADCAll osztályt az összes ADC-csatorna, valamint az MCU belső lapkahőmérséklet-, VBAT- és VREFINT-érzékelőinek egyidejű eléréséhez.

Konstruktorok

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

Létrehoz egy adott lábhoz társított ADC objektumot. Ez lehetővé teszi, hogy analóg értékeket olvass be az adott lábon.

Metódusok

read() int

Beolvassa az analóg lábon lévő értéket és visszaadja azt. A visszaadott érték 0 és 4095 között lesz.

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

Analóg értékeket olvas be a buf pufferbe a timer objektum által beállított sebességgel.

A buf lehet például bytearray vagy array.array. Az ADC-értékek 12 bites felbontásúak, és közvetlenül a buf pufferbe kerülnek tárolásra, ha annak elemmérete 16 bit vagy nagyobb. Ha a buf csak 8 bites elemekből áll (pl. egy bytearray), akkor a minta felbontása 8 bitre csökken.

A timer egy Timer objektum kell legyen, és minden alkalommal beolvasásra kerül egy minta, amikor az időzítő kivált. Az időzítőnek már inicializálva és a kívánt mintavételezési frekvencián futnia kell.

A függvény korábbi viselkedésének támogatása érdekében a timer lehet egész szám is, amely a mintavételezési frekvenciát (Hz-ben) adja meg. Ebben az esetben a Timer(6) automatikusan a megadott frekvencián való futásra lesz konfigurálva.

Példa Timer objektum használatával (ajánlott módszer):

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

Példa a frekvenciához egész szám használatával:

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)

Ez a függvény nem foglal le heap memóriát. Blokkoló viselkedésű: nem tér vissza a hívó programhoz, amíg a puffer meg nem telik.

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

Relatív időzítési vagy fázisadatok kinyerése több ADC-ből.

Analóg értékeket olvas be több ADC-ből pufferekbe a timer objektum által beállított sebességgel. Minden alkalommal, amikor az időzítő kivált, gyorsan beolvasásra kerül egy-egy minta sorban minden ADC-ből.

Az ADC- és pufferpéldányokat tuple-ökben adjuk át, ahol minden ADC-hez egy társított puffer tartozik. Minden puffernek azonos típusúnak és hosszúságúnak kell lennie, és a pufferek számának meg kell egyeznie az ADC-k számával.

A pufferek lehetnek például bytearray vagy array.array típusúak. Az ADC-értékek 12 bites felbontásúak, és közvetlenül a pufferbe kerülnek tárolásra, ha annak elemmérete 16 bit vagy nagyobb. Ha a pufferek csak 8 bites elemekből állnak (pl. egy bytearray), akkor a minta felbontása 8 bitre csökken.

A timer egy Timer objektum kell legyen. Az időzítőnek már inicializálva és a kívánt mintavételezési frekvencián futnia kell.

Az STM32 OpenMV Cam kamerák csak egyetlen ADC-képes fejléclábat (P6) tesznek elérhetővé, így a gyári hardveren a read_timed_multi csak egyetlen ADC-vel hasznos. További analóg bemeneteket pyb.Pin cpu hivatkozásokon keresztül vezethetsz be, hogy egynél több ADC-vel használhasd.

Példa egy ADC beolvasására:

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)

Ez a függvény nem foglal le heap memóriát. Blokkoló viselkedésű: nem tér vissza a hívó programhoz, amíg a pufferek meg nem telnek.

A függvény True értéket ad vissza, ha minden minta helyes időzítéssel került beolvasásra. Magas mintavételezési sebességeknél egy mintakészlet beolvasásához szükséges idő meghaladhatja az időzítő periódusát. Ebben az esetben a függvény False értéket ad vissza, ami a mintavételezési intervallum pontosságának elvesztését jelzi. Szélsőséges esetekben minták kimaradhatnak.

A maximális sebesség olyan tényezőktől függ, mint az adatszélesség és a beolvasott ADC-k száma. Tesztelés során két ADC-t 210 kHz-es időzítősebességgel mintavételeztek túlcsordulás nélkül. 215 kHz-en minták maradtak ki. Három ADC esetén a határ körülbelül 140 kHz, négy esetén pedig körülbelül 110 kHz. Magas mintavételezési sebességeknél a megszakítások időtartamra történő letiltása csökkentheti az alkalmi adatvesztés kockázatát.