luokka ADC – analogia-digitaalimuunnos

Käyttö:

import pyb

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

Katso pyb.ADCAll, jos haluat samanaikaisen pääsyn jokaiseen ADC-kanavaan sekä MCU:n sisäisiin sirun lämpötila-, VBAT- ja VREFINT-sensoreihin.

Konstruktorit

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

Luo annettuun nastaan liitetty ADC-objekti. Tämä mahdollistaa analogisten arvojen lukemisen kyseisestä nastasta.

Metodit

read() int

Lue analogisen nastan arvo ja palauta se. Palautettu arvo on välillä 0 ja 4095.

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

Lue analogisia arvoja puskuriin buf nopeudella, jonka timer-objekti määrittää.

buf voi olla esimerkiksi bytearray tai array.array. ADC-arvot ovat 12-bittisellä resoluutiolla ja ne tallennetaan suoraan puskuriin buf, jos sen alkion koko on 16 bittiä tai enemmän. Jos puskurissa buf on vain 8-bittisiä alkioita (esim. bytearray), näytteen resoluutio pienennetään 8 bittiin.

timer tulee olla Timer-objekti, ja näyte luetaan aina, kun ajastin laukeaa. Ajastimen on jo oltava alustettu ja käynnissä halutulla näytteenottotaajuudella.

Tämän funktion aiemman toiminnan tukemiseksi timer voi olla myös kokonaisluku, joka määrittää näytteenottotaajuuden (hertseinä). Tässä tapauksessa Timer(6) konfiguroidaan automaattisesti toimimaan annetulla taajuudella.

Esimerkki Timer-objektin käytöstä (suositeltu tapa):

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

Esimerkki kokonaisluvun käytöstä taajuutena:

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)

Tämä funktio ei varaa lainkaan keomuistia. Sillä on estävä toiminta: se ei palaa kutsuvaan ohjelmaan ennen kuin puskuri on täynnä.

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

Pura suhteellinen ajoitus- tai vaihetieto useista ADC:istä.

Lukee analogisia arvoja useista ADC:istä puskureihin nopeudella, jonka timer-objekti määrittää. Aina kun ajastin laukeaa, jokaisesta ADC:stä luetaan vuorollaan nopeasti yksi näyte.

ADC- ja puskuri-instanssit välitetään monikoissa siten, että jokaisella ADC:llä on siihen liitetty puskuri. Kaikkien puskureiden on oltava samaa tyyppiä ja samanpituisia, ja puskureiden määrän on oltava yhtä suuri kuin ADC:iden määrä.

Puskurit voivat olla esimerkiksi bytearray tai array.array. ADC-arvot ovat 12-bittisellä resoluutiolla ja ne tallennetaan suoraan puskuriin, jos sen alkion koko on 16 bittiä tai enemmän. Jos puskureissa on vain 8-bittisiä alkioita (esim. bytearray), näytteen resoluutio pienennetään 8 bittiin.

timer tulee olla Timer-objekti. Ajastimen on jo oltava alustettu ja käynnissä halutulla näytteenottotaajuudella.

STM32 OpenMV Cam -laitteet tarjoavat vain yhden ADC-yhteensopivan liitinnastan (P6), joten vakiolaitteistossa read_timed_multi on hyödyllinen vain yhdellä ADC:llä. Kytke lisää analogisia tuloja pyb.Pin cpu -viittausten kautta käyttääksesi sitä useamman kuin yhden ADC:n kanssa.

Esimerkki yhden ADC:n lukemisesta:

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)

Tämä funktio ei varaa lainkaan keomuistia. Sillä on estävä toiminta: se ei palaa kutsuvaan ohjelmaan ennen kuin puskurit ovat täynnä.

Funktio palauttaa True, jos kaikki näytteet kerättiin oikealla ajoituksella. Korkeilla näytteenottotaajuuksilla näytejoukon keräämiseen kuluva aika voi ylittää ajastimen jakson. Tässä tapauksessa funktio palauttaa False, mikä ilmaisee tarkkuuden menetystä näytteenottovälissä. Ääritapauksissa näytteitä voi jäädä saamatta.

Maksiminopeus riippuu tekijöistä kuten datan leveydestä ja luettavien ADC:iden määrästä. Testeissä kahta ADC:tä näytteistettiin 210 kHz:n ajastinnopeudella ilman ylivuotoa. 215 kHz:llä näytteitä jäi saamatta. Kolmella ADC:llä raja on noin 140 kHz ja neljällä noin 110 kHz. Korkeilla näytteenottotaajuuksilla keskeytysten poistaminen käytöstä keräyksen ajaksi voi vähentää satunnaisen datahäviön riskiä.