kelas ADC -- konversi analog ke digital

Penggunaan:

import pyb

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

Lihat pyb.ADCAll untuk akses simultan ke setiap kanal ADC beserta sensor suhu internal chip, VBAT, dan VREFINT pada MCU.

Konstruktor

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

Membuat objek ADC yang terkait dengan pin yang diberikan. Ini memungkinkan Anda membaca nilai analog pada pin tersebut.

Metode

read() int

Membaca nilai pada pin analog dan mengembalikannya. Nilai yang dikembalikan berada di antara 0 dan 4095.

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

Membaca nilai analog ke dalam buf dengan laju yang ditentukan oleh objek timer.

buf dapat berupa bytearray atau array.array misalnya. Nilai ADC memiliki resolusi 12-bit dan disimpan langsung ke dalam buf jika ukuran elemennya 16 bit atau lebih. Jika buf hanya memiliki elemen 8-bit (misalnya bytearray) maka resolusi sampel akan dikurangi menjadi 8 bit.

timer harus berupa objek Timer, dan sampel dibaca setiap kali timer dipicu. Timer harus sudah diinisialisasi dan berjalan pada frekuensi sampling yang diinginkan.

Untuk mendukung perilaku sebelumnya dari fungsi ini, timer juga dapat berupa bilangan bulat yang menentukan frekuensi (dalam Hz) untuk melakukan sampling. Dalam hal ini Timer(6) akan dikonfigurasi secara otomatis untuk berjalan pada frekuensi yang diberikan.

Contoh menggunakan objek Timer (cara yang disarankan):

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

Contoh menggunakan bilangan bulat untuk frekuensi:

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)

Fungsi ini tidak mengalokasikan memori heap apa pun. Fungsi ini memiliki perilaku pemblokiran: fungsi tidak kembali ke program pemanggil sampai buffer penuh.

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

Mengekstrak data timing atau fase relatif dari beberapa ADC.

Membaca nilai analog dari beberapa ADC ke dalam buffer dengan laju yang ditentukan oleh objek timer. Setiap kali timer dipicu, sampel dibaca secara cepat dari setiap ADC secara bergantian.

Instans ADC dan buffer dilewatkan dalam tuple dengan setiap ADC memiliki buffer yang terkait. Semua buffer harus bertipe dan berukuran sama, dan jumlah buffer harus sama dengan jumlah ADC.

Buffer dapat berupa bytearray atau array.array misalnya. Nilai ADC memiliki resolusi 12-bit dan disimpan langsung ke dalam buffer jika ukuran elemennya 16 bit atau lebih. Jika buffer hanya memiliki elemen 8-bit (misalnya bytearray) maka resolusi sampel akan dikurangi menjadi 8 bit.

timer harus berupa objek Timer. Timer harus sudah diinisialisasi dan berjalan pada frekuensi sampling yang diinginkan.

OpenMV Cam STM32 hanya mengekspos satu pin header yang mendukung ADC (P6), sehingga pada perangkat keras standar read_timed_multi hanya berguna dengan satu ADC. Hubungkan input analog tambahan melalui referensi cpu pyb.Pin untuk menggunakannya dengan lebih dari satu ADC.

Contoh membaca satu 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)

Fungsi ini tidak mengalokasikan memori heap apa pun. Fungsi ini memiliki perilaku pemblokiran: fungsi tidak kembali ke program pemanggil sampai buffer penuh.

Fungsi mengembalikan True jika semua sampel diperoleh dengan timing yang benar. Pada laju sampel tinggi, waktu yang dibutuhkan untuk memperoleh sekumpulan sampel dapat melebihi periode timer. Dalam hal ini fungsi mengembalikan False, menunjukkan hilangnya presisi pada interval sampel. Dalam kasus ekstrem, sampel mungkin terlewat.

Laju maksimum bergantung pada faktor-faktor termasuk lebar data dan jumlah ADC yang sedang dibaca. Dalam pengujian, dua ADC disampling pada laju timer 210kHz tanpa overrun. Sampel terlewat pada 215kHz. Untuk tiga ADC batasnya sekitar 140kHz, dan untuk empat ADC sekitar 110kHz. Pada laju sampel tinggi, menonaktifkan interupsi selama durasi tersebut dapat mengurangi risiko kehilangan data sporadis.