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
bufdengan laju yang ditentukan oleh objektimer.bufdapat berupa bytearray atau array.array misalnya. Nilai ADC memiliki resolusi 12-bit dan disimpan langsung ke dalambufjika ukuran elemennya 16 bit atau lebih. Jikabufhanya memiliki elemen 8-bit (misalnya bytearray) maka resolusi sampel akan dikurangi menjadi 8 bit.timerharus 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,
timerjuga 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
bytearrayatauarray.arraymisalnya. 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 (misalnyabytearray) 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 standarread_timed_multihanya berguna dengan satu ADC. Hubungkan input analog tambahan melalui referensicpupyb.Pinuntuk 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
Truejika 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 mengembalikanFalse, 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.