Memahami GPIO analog dan digital

11

Saya mencoba memahami GPIO, dan telah membaca banyak posting blog yang berbeda dan saya pikir saya hampir mendapatkannya, tetapi masih berjuang dengan beberapa hal.

Saya telah melihat beberapa referensi untuk GPIO hanya bisa bekerja dengan nilai-nilai biner, tetapi tulisan lain yang mengatakan nilainya bisa dari 0-255. Saya berasumsi ini adalah perbedaan antara GPIO analog dan digital. Apakah itu benar? Apakah mungkin pin GPIO tunggal dapat bertindak sebagai analog dan digital?

pedalpete
sumber
Sebagai tindak lanjut dari beberapa jawaban ... Nilai biner mengacu pada input atau output digital. Ini bisa berupa 1 (yang seharusnya merupakan sumber tegangan, disebut "hi" atau "on") atau 0 (artinya 0V, disebut "lo" atau "off"). Itu adalah resolusi 1 bit. Input analog dapat berupa rentang, biasanya dari 0V ke VCC (tegangan sumber). Chip digital dengan resolusi 8bit akan mengubah input analog ini menjadi sinyal digital 8bit dengan kisaran 0 - 255 (biner: 00000000 - 11111111), karena 2 ^ 8 - 1 = 255 (biner berarti basis 2, 8 adalah dari 8 bit bagian, dan "- 1" karena barang-barang digital mulai menghitung pada 0, bukan 1).
Kurt E. Clothier

Jawaban:

14

Pin GPIO adalah pin 'input / output keperluan umum'. Ini secara default hanya tinggi atau rendah (level tegangan, tinggi tegangan suplai pengontrol mikro, rendah biasanya dibumikan, atau 0V). Tetapi tingkat 'tinggi' dan 'rendah' ​​biasanya diberikan sebagai tegangan sebagai proporsi dari tegangan suplai. Jadi apa pun yang biasanya di atas 66% dari tegangan suplai dianggap sebagai level logika 'tinggi' yang berarti beberapa perangkat tegangan rendah dapat berbicara dengan perangkat tegangan tinggi selama tingkatnya termasuk dalam apa yang dianggap 'tinggi'. Mikrokontroler daya rendah 1,8-2,7,7 V atau penerima GPS misalnya akan mengalami kesulitan berkomunikasi langsung ke mikrokontroler 5V karena apa yang dilihat oleh perangkat bertegangan rendah sebagai 'tinggi', perangkat tegangan tinggi tidak akan menganggapnya tinggi sama sekali. Ini untuk menggunakan GPIO sebagai pin input,

Kadang-kadang Anda dapat menggunakan pin TUNGGAL untuk nilai 'analog', dengan mengkonfigurasi pin GPIO untuk digunakan oleh perangkat onboard lain seperti konverter 'analog ke digital' (ADC). Pin diatur ke saluran pada ADC dan ini bertindak sebagai input ke ADC sekarang, bukan pin GPIO normal. Anda kemudian dapat mengatur ADC untuk mengambil sampel, dan membaca nilai register hasil ADC untuk angka-angka seperti 0-1024 jika resolusi 10-bit.

Seperti yang disebutkan seseorang, pin GPIO dapat digunakan dalam perangkat lunak untuk memberikan efek sinyal Pulsed Width Modulation (PWM), biasanya pada kecepatan rendah untuk beralih GPIO. Sebagian besar mikrokontroler memiliki generator PWM khusus yang dapat dikonfigurasi untuk menggunakan pin GPIO sebagai pin output, dan ini sangat cepat dan jauh lebih stabil daripada menggunakan perangkat lunak untuk mengontrol GPIO untuk menghasilkan sinyal PWM. PWM digunakan untuk sinyal gaya 'rata-rata' atau '%' dan memungkinkan Anda untuk melakukan hal-hal seperti lampu redup dan mengendalikan kecepatan motor.

Pin GPIO biasanya diatur dalam kelompok, yang disebut Port. Dalam pengontrol kecil, mereka mungkin arsitektur 8-bit, sehingga port sering dikelompokkan menjadi banyak 8, dan nilai-nilainya dapat dibaca sekaligus pada saat yang sama dengan membaca 'data register' yang mewakili nilai logika tinggi / rendah dari mereka. pin. Demikian pula, Anda dapat mengatur pin menjadi output dan kemudian menulis 8-bit ke dalam register data, dan pengendali mikrokontroler GPIO akan membaca nilai perubahan register, dan mendorong pin tinggi atau menarik pin rendah tergantung pada nilai apa yang baru saja Anda tetapkan.

Pada pengontrol yang lebih baru seperti ARM Cortex A8 dan A9 seperti di Raspberry Pi dan BeagleBone, pengontrol GPIO dan opsi berbeda sangat rumit. Mereka menggunakan arsitektur 32-bit, sehingga sebagian besar pin GPIO diatur ke dalam blok 32-bit, bahkan jika tidak semua benar-benar dapat digunakan (beberapa mungkin didedikasikan atau tidak diaktifkan). BeagleBone (yang telah saya kerjakan sebelumnya) memiliki beberapa opsi yang sangat mengagumkan untuk jumlah pin yang besar, dan kadang-kadang Anda harus menggunakan alat 'pin mux', yang memungkinkan Anda untuk mengatur mode khusus pin tertentu untuk berbagai hal. seperti PWM, tangkapan pulsa, keluaran waktu, input saluran analog (ADC), dan bahkan pemetaan (pada BeagleBone) ke sub-prosesor industri yang tersedia pada inti ARM, tetapi dianggap sebagai prosesor independen dan memerlukan pemetaan pin sendiri agar untuk terhubung ke dunia luar.

KyranF
sumber
Bisakah Anda memberi contoh bagaimana "pin TUNGGAL dapat digunakan untuk nilai 'analog'"?
Pavel
@ JimJim2000 hanya aliran on / off atau PWM yang tepat melalui filter RC untuk menghasilkan tegangan analog "rata-rata" pada output.
KyranF
7

Anda kemungkinan besar merujuk keluar analog Arduino, yang sering menggunakan pin GPIO dengan PWM perangkat lunak . GPIO biasanya memiliki tiga negara. Output Tinggi, Output Rendah, dan Input / High-Z (Impedansi Tinggi, di mana itu tidak mempengaruhi output).

PWM dengan cepat mengubah output dari Output Tinggi ke Output rendah (periode), untuk membuat rata-rata (Duty Cycle), memungkinkan untuk sesuatu yang terlihat seperti nilai analog. Dengan mengaktifkan BIO GPIO pada siklus kerja 50% (atau 128), outputnya masih biner, tetapi rata-rata setengah jalan antara Tinggi dan Rendah.

Pikirkan bola lampu. Anda melihatnya Hidup, atau Mati. Tapi itu benar-benar menyala dan mati 60 kali per detik, sangat cepat sehingga Anda tidak melihat itu berkedip sangat cepat. Tapi nyalakan dan matikan bohlam secara manual dengan sangat lambat, dan Anda akan melihatnya berkedip. Dengan 255, ini berarti 100% aktif, dan kurang dari 255 adalah sebagian kecil dari 100% aktif.

Begitulah cara Binary GPIO dapat bertindak seperti pin Analog 255 state.

Pejalan kaki
sumber
Terima kasih @ Derby, itu jauh lebih jelas. Saya tidak secara khusus melihat arduino, tetapi raspberry pi dan beaglebone. Apakah yang Anda maksudkan berarti bahwa pin apa pun dapat memiliki nilai antara 0 dan 255? Saya semakin bingung antara dokumentasi yang mengatakan bahwa suatu nilai bisa berupa biner vs yang lain yang mengatakan bahwa suatu nilai bisa 0-255.
pedalpete
1
@pedalpete RPI dan Arduino memiliki banyak tumpang tindih dalam kerumunan dan ide. Tapi PWM 0 hingga 255 adalah arbitrer. Itu bisa 0 hingga 65535, atau 0 hingga 16. 0 hingga 255 adalah 8 bit presisi. Di mana 255 atau 65535 atau apa pun 100%. GPIO hanya memiliki Binary On dan Off, tetapi Anda menggunakan PWM untuk berpura-pura dapat memiliki lebih dari sekedar hidup atau mati. Ini adalah ilusi optik yang berguna dan disengaja.
Pejalan kaki
2
Bola lampu tidak berkedip dan mati pada 60 kali per detik. Filamen memanas dan tetap memanas
Scott Seidman
0

Bit GPIO dapat berupa 0 atau 1. Port GPIO 8 bit, terbuat dari 8 bit berturut-turut, dapat berkisar antara 00000000 dan 11111111, atau 255 desimal. Ini tidak ada hubungannya dengan konsep "analog"

Scott Seidman
sumber
Terima kasih Scott, meskipun saya pikir saya lebih bingung sekarang daripada sebelumnya. Apa itu porta GPIO? Jika saya memiliki pin GPIO (contoh pada Raspberry Pi), apakah masing-masing pin dianggap sebagai port? Jika demikian, apakah setiap pin dapat bekerja dengan kisaran 0-255 desimal tersebut?
pedalpete
Abaikan pertanyaan terakhir saya, saya mengerti maksud Anda sekarang tentang sebuah port.
pedalpete