Selama pertemuan untuk proyek tertentu, saya diminta untuk memikirkan cara mendeteksi tombol pada MCU. Deteksi harus mengkonsumsi daya sesedikit mungkin. Pada pandangan pertama, saya memikirkan rangkaian tipikal dengan pull-up atau pull-down:
mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab
Saya tidak menjelaskan beberapa fitur anti-bouncing di sini, karena itu di luar ruang lingkup pertanyaan ini. Dalam kedua kasus, ketika tombol ditekan, nilai total arus yang mengalir tergantung pada nilai resistor. Untuk menguranginya (saat ini), saya dapat meningkatkan nilai resistor tetapi tidak begitu banyak karena, jika saya benar, itu juga tergantung pada nilai kebocoran pin input. Plus, resistor besar akan pulih dengan lambat.
Pertanyaan saya adalah yang berikut: apa cara cerdas untuk mendeteksi tombol yang ditekan yang tidak mengonsumsi daya (biasanya untuk aplikasi yang mengonsumsi daya tinggi)? Apakah ada metode yang hampir tidak memakan daya saat tombol ditekan?
sumber
Jawaban:
Metode arus rendah yang pernah saya gunakan adalah menghubungkan saklar antara dua pin I / O mikrokontroler.
Satu I / O dikonfigurasikan sebagai output (SWO). Yang kedua dikonfigurasi sebagai input (SWI) dengan pull-up internal yang dapat diprogram diaktifkan.
Status sakelar jarang diambil sampel (setiap 10 ms) oleh rutin interupsi perangkat lunak. Urutan bacaannya adalah: drive SWO rendah, baca SWI, drive SWO tinggi.
Ini berarti bahwa saklar yang ditekan hanya menarik arus tarik-turun SWI melalui dirinya sendiri dan SWO kurang dari 1 kita selama pemindaian, sementara sakelar yang tidak ditekan tidak menghasilkan arus. Pengundian saat ini untuk <1 us setiap 10 ms menghasilkan konsumsi rata-rata saat ini yang sangat kecil.
sumber
Sebuah SPDT ( S perapian di tungku P ole D ouble T hrow) tombol akan tombol yang ultra efisien Anda.
Sumber: http://www.ni.com/white-paper/3960/en/
Dalam kasus Anda, 1P akan pergi ke MCU, 1T ke VCC, 2T ke GND.
sumber
Berapa lama tombol akan ditekan? Jika ini bukan toggle switch (yang mempertahankan statusnya) tetapi switch sesaat maka arus yang mengalir ketika tombol ditekan sebagian besar tidak relevan karena waktu singkat bahwa tombol sebenarnya ditutup.
Salah satu dari dua sirkuit yang Anda perlihatkan OK, tidak masalah.
Anda dapat mengasumsikan bahwa kebocoran input dan / atau arus ke input MCU dapat diabaikan . Semua MCU berada dalam teknologi CMOS hari ini dan memiliki arus input nol praktis. Jadi berhentilah mempertimbangkannya, itu tidak ada di sana.
Alih-alih menggunakan resistor eksternal Anda juga bisa menggunakan resistor pull-up internal ke dalam banyak input MCU. Resistor ini mungkin memiliki nilai yang relatif rendah (mungkin 50 kohm) sehingga arus kecil akan mengalir ketika tombol ditekan.
Anda dapat menggunakan resistor 1 Mohm dengan aman untuk pull-up / pull-down. Hanya di lingkungan yang sangat "kotor" (secara elektrik) Anda mungkin membutuhkan nilai yang lebih rendah. Anda juga dapat menempatkan kapasitor 100 nF secara paralel dengan sakelar untuk menekan interferensi dari sirkuit lain di sekitarnya.
Pro tip: Cadangan tempat untuk kapasitor pada PCB, tetapi jangan memasang tutup. namun. Dalam hal terjadi masalah: tempatkan dan lihat apakah itu membantu.
Untuk mendeteksi keadaan sakelar, gunakan polling (seperti pada jawaban TonyM) atau gunakan interupsi . Itu tergantung pada aplikasi mana yang lebih baik untuk konsumsi daya (dari MCU).
sumber
Salah satu metode yang saya gunakan mengambil keuntungan dari sifat kapasitif input CMOS.
mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab
Pada sirkuit di atas sakelar, ketika ditutup, memungkinkan resistor pull-down untuk mengisi / melepaskan kapasitansi input GPIO ke permukaan tanah.
Trik dengan sirkuit ini adalah menggunakan sifat dua arah dari GPIO untuk menjaga input dibebankan pada level logika yang tinggi ketika sakelar terbuka.
Kontrol rutin secara berkala mengubah pin keluar sebagai level tinggi, atau secara singkat memungkinkan pull-up, cukup lama untuk mempertahankan muatan penutup. Pin input kemudian bertindak seperti bit memori dinamis dan akan, dengan sebagian besar perangkat, menahan muatan itu untuk waktu yang cukup lama dan dapat digunakan.
Ketika dikonfigurasikan dengan benar, jika tombol ditekan, muatan pada pin akan mengeluarkan lebih cepat daripada kecepatan refresh. Kondisi itu kemudian dapat dideteksi sebagai bagian dari algoritma penyegaran sebagai pembacaan sebelum operasi penyegaran, atau digunakan untuk menggerakkan interupsi.
Daya sebentar digunakan selama pulsa refresh, baik untuk mengisi ulang kapasitor dan melalui resistor dan beralih jika ditutup. Namun, panjang pulsa refresh pendek dan frekuensi polling menghasilkan arus refresh relatif tidak signifikan.
Jelas metode ini aktif. Jika mikro dimatikan, status sakelar akan tak tentu saat bangun. Siklus refresh pertama setelah bangun harus mengabaikan pin yang dibaca. Selain itu, metode ini tidak boleh digunakan untuk membangunkan mikro. Sebelum tidur, sebaiknya pin diaktifkan sebagai output rendah untuk memarkirnya dalam keadaan nol saat ini.
Untuk membaca lebih banyak sakelar statis, seperti sakelar celup set-up, rutin khusus dapat digunakan alih-alih siklus penyegaran berkelanjutan. Setelah membaca, pin GPIO kemudian harus "diparkir" dalam keadaan output rendah aktif (nol saat ini) untuk menghindari masalah input mengambang.
CATATAN: Teknik ini memang sedikit menderita dari sensitivitas kebisingan jika panjang jejaknya panjang dan melewati daerah yang bising. Karena itu R1 harus dekat dengan pin input. Namun, saya tidak akan merekomendasikan hal ini untuk memasang saklar jarak jauh pada panel depan di suatu tempat kecuali Anda menambahkan kapasitansi tambahan dekat dengan pin.
sumber
Jika tombol Anda adalah saklar piezo, maka daya yang diperlukan hanyalah daya yang dihasilkan dengan menekan tombol.
Sebagai contoh: R2 / C1 mengumpulkan energi yang dihasilkan dengan menekan piezo. D1 mencegah tegangan C1 menjadi terlalu tinggi. R1 menguras C1 saat tombol dilepaskan. MCU GPIO harus dalam input, tanpa mode tarik. Voa, tombol deteksi dengan nol arus undian dari suplai.
mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab
sumber
Jika perangkat harus dapat tetap dalam kondisi tidak terbatas, menggunakan sakelar SPDT akan menjadi pendekatan dengan daya paling rendah, karena sirkuit statis dapat dibuat untuk tidak menarik arus di luar kebocoran internal dan sakelar. Keuntungan tambahan dari sakelar SPDT adalah bahwa sakelar-sakelar tersebut dapat didemokkan hampir sempurna, tidak peduli seberapa cepat mereka dioperasikan atau seberapa payahnya kontak, asalkan hanya satu kontak berhenti memantul sebelum yang lain pertama kali dibaca ditutup.
Ada dua pendekatan yang baik untuk memasang sakelar seperti itu:
mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab
Pendekatan pertama membutuhkan satu resistor lebih sedikit daripada yang kedua, tetapi yang kedua akan lebih toleran terhadap tumpang tindih antara kedua kutub (itu akan menarik lebih tinggi dari arus yang biasa, tetapi tidak akan membuat mati pendek di seluruh pasokan). Perhatikan bahwa jika sakelar dapat memasuki kondisi yang cukup resistif untuk jangka waktu yang lama, yang dapat membakar arus yang jauh lebih banyak dari biasanya, tetapi selama penggunaan normal, tidak ada resistor yang akan membawa arus signifikan kecuali selama momen singkat di antara waktu sakelar berubah status dan output merespons.
sumber
Gunakan internal pull-up mikrokontroler dan ketika pers terdeteksi menonaktifkan pull-up. Kemudian sesekali aktifkan kembali secara singkat untuk memeriksa status tombol.
sumber