class ADC – analogdan dijitale dönüşüm

Kullanım:

import pyb

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

Her ADC kanalına ve ayrıca MCU’nun dahili çip sıcaklığı, VBAT ve VREFINT sensörlerine eşzamanlı erişim için pyb.ADCAll sınıfına bakın.

Yapıcılar

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

Verilen pin ile ilişkili bir ADC nesnesi oluşturur. Bu, daha sonra o pin üzerindeki analog değerleri okumanıza olanak tanır.

Metotlar

read() int

Analog pin üzerindeki değeri okur ve döndürür. Döndürülen değer 0 ile 4095 arasında olacaktır.

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

Analog değerleri timer nesnesi tarafından belirlenen bir hızda buf içine okur.

buf örneğin bytearray veya array.array olabilir. ADC değerleri 12 bit çözünürlüğe sahiptir ve eleman boyutu 16 bit veya daha büyükse doğrudan buf içine kaydedilir. buf yalnızca 8 bitlik elemanlara sahipse (örneğin bir bytearray) örnekleme çözünürlüğü 8 bite düşürülür.

timer bir Timer nesnesi olmalıdır ve zamanlayıcı her tetiklendiğinde bir örnek okunur. Zamanlayıcı önceden başlatılmış ve istenen örnekleme frekansında çalışıyor olmalıdır.

Bu fonksiyonun önceki davranışını desteklemek için, timer örnekleme yapılacak frekansı (Hz cinsinden) belirten bir tam sayı da olabilir. Bu durumda Timer(6) verilen frekansta çalışacak şekilde otomatik olarak yapılandırılır.

Bir Timer nesnesi kullanan örnek (tercih edilen yol):

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

Frekans için bir tam sayı kullanan örnek:

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)

Bu fonksiyon herhangi bir yığın (heap) belleği ayırmaz. Engelleyici davranışa sahiptir: arabellek dolana kadar çağıran programa dönmez.

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

Birden fazla ADC’den göreceli zamanlama veya faz verisi çıkarır.

Birden fazla ADC’den analog değerleri timer nesnesi tarafından belirlenen bir hızda arabelleklere okur. Zamanlayıcı her tetiklendiğinde her ADC’den sırayla hızla bir örnek okunur.

ADC ve arabellek örnekleri, her ADC’nin ilişkili bir arabelleği olacak şekilde demetler (tuple) halinde geçirilir. Tüm arabellekler aynı tür ve uzunlukta olmalıdır ve arabellek sayısı ADC sayısına eşit olmalıdır.

Arabellekler örneğin bytearray veya array.array olabilir. ADC değerleri 12 bit çözünürlüğe sahiptir ve eleman boyutu 16 bit veya daha büyükse doğrudan arabelleğe kaydedilir. Arabellekler yalnızca 8 bitlik elemanlara sahipse (örneğin bir bytearray) örnekleme çözünürlüğü 8 bite düşürülür.

timer bir Timer nesnesi olmalıdır. Zamanlayıcı önceden başlatılmış ve istenen örnekleme frekansında çalışıyor olmalıdır.

STM32 OpenMV Cam’ler yalnızca bir ADC özellikli başlık pini (P6) sunar, bu nedenle standart donanımda read_timed_multi yalnızca tek bir ADC ile kullanışlıdır. Birden fazla ADC ile kullanmak için ek analog girişleri pyb.Pin cpu referansları aracılığıyla bağlayın.

Bir ADC okuma örneği:

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)

Bu fonksiyon herhangi bir yığın (heap) belleği ayırmaz. Engelleyici davranışa sahiptir: arabellekler dolana kadar çağıran programa dönmez.

Tüm örnekler doğru zamanlamayla alındıysa fonksiyon True döndürür. Yüksek örnekleme hızlarında bir örnek kümesini almak için geçen süre zamanlayıcı periyodunu aşabilir. Bu durumda fonksiyon False döndürerek örnekleme aralığında bir hassasiyet kaybı olduğunu belirtir. Aşırı durumlarda örnekler kaçırılabilir.

Maksimum hız; veri genişliği ve okunan ADC sayısı gibi faktörlere bağlıdır. Testlerde iki ADC, taşma olmadan 210kHz’lik bir zamanlayıcı hızında örneklendi. 215kHz’de örnekler kaçırıldı. Üç ADC için sınır yaklaşık 140kHz, dört ADC için yaklaşık 110kHz’dir. Yüksek örnekleme hızlarında bu süre boyunca kesmeleri devre dışı bırakmak, ara sıra meydana gelen veri kaybı riskini azaltabilir.