Cara cerdas untuk mendeteksi tombol (lebih hemat daya)

28

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:

skema

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?

vionyst
sumber
5
Pull-down 10k hampir tidak memakan daya. 3.3V memberikan 330uA. Dan pada kebanyakan MCU modern, Anda memiliki opsi untuk mengaturnya secara internal, yang akan memiliki resistensi lebih tinggi. Karena itu, Anda dapat mengaktifkan pasokan tombol dari pin MCU melalui BJT atau MOSFET. Aktifkan saja selama membaca, dan baca dengan polling.
Lundin
27
@Lundin Dalam istilah "modern", 330 A mungkin arus tinggi ...μ
awjlogan
6
memang, banyak mikrokontroler bisa mendapatkan arus tidur serendah 2-10 μA. Menghabiskan 30x pada satu pull-down agak menyedihkan, terutama dalam situasi bertenaga baterai.
whatsisname
1
Seberapa besar resistor yang dapat Anda gunakan pada pull down tergantung pada impedansi pin dan pada tegangan apa mereka beralih. Katakanlah Anda memiliki pin 3.3v dalam keadaan impedansi tinggi yang beralih pada 2.4v, yang Anda butuhkan adalah impedansi yang sedikit lebih rendah daripada input. Saya akan merekomendasikan Anda memasang potensiometer dan mengukur seberapa tinggi nilai resistor yang dapat Anda gunakan untuk pin agar tetap bekerja dengan andal, dan kemudian pergi 20% lebih rendah nilainya untuk menjaga margin.
Drunken Code Monkey

Jawaban:

29

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.

TonyM
sumber
Dapat dipertanyakan mengapa Anda membutuhkan pull-up menggunakan teknik ini. Urutan SWO Rendah, Baca SWI, SWO Tinggi, SWI Baca mungkin cukup untuk mengetahui apakah pin terhubung bersama. Anda juga dapat berbagi SWO di antara banyak sakelar.
Trevor_G
8
@ Trvor Meninggalkan input mengambang ketika sakelar terbuka bukanlah ide yang bagus. Tergantung pada teknologinya, ia dapat menyebabkan buffer input mengonsumsi daya jika inputnya dalam kondisi sedang.
RoyC
1
@ Trvor Mengalikan resistor pull up secara efektif dengan siklus tugas sw1 sw2. Masih menarik membawa kita kembali ke skema OP 1. Ini dapat bekerja di lingkungan dengan kebisingan rendah.
RoyC
2
Bukankah fakta bahwa MCU harus tetap terjaga untuk melakukan pemungutan suara alih-alih mengandalkan interupsi sepenuhnya membatalkan setiap penghematan dari siklus tugas sakelar yang lebih pendek?
AndreKR
5
Hai @AndreKR, kami memiliki aplikasi mikrokontroler bertenaga baterai dan diperlukan beberapa sakelar yang terhubung sehingga kami menggunakan teknik ini karena cukup mudah. Kami tidak memasukkan MCU hanya untuk deteksi sakelar. MCU menggambar 900nA dalam mode tidur di antara 10 ms-nya menyela sehingga penghematan pull-up bermanfaat.
TonyM
23

Sebuah SPDT ( S perapian di tungku P ole D ouble T hrow) tombol akan tombol yang ultra efisien Anda.

masukkan deskripsi gambar di sini

Sumber: http://www.ni.com/white-paper/3960/en/

Dalam kasus Anda, 1P akan pergi ke MCU, 1T ke VCC, 2T ke GND.

Harry Svensson
sumber
+1 .. selalu menyadap saya bahwa submisiatur SPDT sangat sulit ditemukan atau harganya terlalu mahal ...
Trevor_G
1
@ Trevor Ya ... ada beberapa hal yang sayangnya sangat mahal. Sementara barang-barang lainnya harganya lebih rendah (MCU misalnya). Anda tidak dapat memiliki semuanya.
Harry Svensson
Ini ide yang bagus. Sayangnya saya tidak berhasil menemukan tombol SPDT CMS yang sesuai dengan kebutuhan saya. Saya akan tetap mengingat sirkuit ini
vionyst
10

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).

Bimpelrekkie
sumber
Sebenarnya tombolnya akan sesaat tapi waktu akan ditekan mungkin cukup lama (menit)
vionyst
Jika perangkat aktif 24/7, beberapa menit mungkin tidak banyak. Yang penting adalah siklus tugas, 5 menit setiap jam adalah 5 x 60/3600 = 8,3%. Jadi bahkan pada arus 100 uA saklar akan mengkonsumsi rata-rata 8,3 uA dalam skenario saya. Pesan saya adalah: jangan terlalu fokus pada arus yang digunakan sakelar saat ditekan tanpa membandingkannya dengan konsumsi lengkap sistem saat ini. Hanya ketika kontribusinya sama, maka masuk akal untuk meningkatkan konsumsi switch saat ini. Tidak ada gunanya membuat saklar 0,1 uA ketika MCU menggunakan 1uA terus menerus.
Bimpelrekkie
"Tidak ada gunanya membuat saklar 0,1 uA ketika MCU menggunakan 1uA terus menerus." kedengarannya off. Saya pikir maksud Anda puncak 1uA. 10% hanya untuk peralihan akan berlebihan;)
Trevor_G
@ Trevor Tidak memuncak, maksud saya rata- rata arus 1uA untuk MCU tetapi 0.1uA ketika sakelar ditekan. Dikombinasikan dengan sakelar 0,1 A yang hanya akan ditekan untuk periode yang relatif singkat, sakelar tersebut hampir tidak memberikan kontribusi apa pun terhadap total konsumsi daya rata-rata karena arus rata-rata adalah: 100% x 1 uA + 8,3% * 0,1 uA = 1,0083 uA (8,3% digunakan kembali dari komentar di atas).
Bimpelrekkie
2
Ya hanya membaca seperti yang Anda maksudkan rata-rata 0,1uA pada saklar. Yang tidak masuk akal seperti dip-switch.
Trevor_G
10

Salah satu metode yang saya gunakan mengambil keuntungan dari sifat kapasitif input CMOS.

skema

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.

Trevor_G
sumber
1
Ini memang terlihat sangat rentan terhadap EMI. Jika ada bentuk energi radio yang masuk ke sirkuit itu dan saya pikir semua taruhan dimatikan. Untung hal nirkabel tidak begitu umum saat ini :)
Lundin
@Lundin itu tidak seburuk yang Anda bayangkan. 30pF dan satu mc membuat filter yang agak bagus.
Trevor_G
8

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.

schematic

mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab

Heath Raftery
sumber
3
Hmm, bisakah Anda membuat / mendesain prototipe yang berfungsi dan menunjukkan manfaat dari solusi dengan saklar normal yang telah kami gunakan selama 30 tahun terakhir?
Bimpelrekkie
Yakin. Saya telah menambahkan contoh skematis. Cukup buat itu. Manfaatnya adalah tidak ada penarikan saat ini dari pasokan dalam keadaan tertutup atau terbuka. Kerugian termasuk kontrol yang buruk dari upaya yang diperlukan untuk mengaktifkan sakelar (sirkuit aktif akan lebih baik, tetapi itu menggagalkan manfaat yang sangat marjinal dari rangkaian), dan itu menjadi desain yang baru dibandingkan dengan desain sakelar normal berusia 30 (300?) Tahun.
Heath Raftery
Namun, kalkulator saya memiliki banyak tombol dan beroperasi setidaknya 5 tahun pada sel koin. Masih tidak melihat bagaimana solusi Anda akan membawa manfaat untuk itu. Saya masih berpikir itu adalah "solusi" untuk masalah yang tidak ada. Dan lebih mahal juga.
Bimpelrekkie
1
Oh saya setuju! Ini memenuhi kriteria asli "konsumsi daya sesedikit mungkin", tetapi mengapa menabung kurang dari satu millijoule sebenarnya berguna sulit untuk dibayangkan.
Heath Raftery
Bukankah impedansi input MCU melakukan hal-hal buruk karena impedansi output yang tinggi dari piezo?
Scott Seidman
5

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:

schematic

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.

supercat
sumber
2

Gunakan internal pull-up mikrokontroler dan ketika pers terdeteksi menonaktifkan pull-up. Kemudian sesekali aktifkan kembali secara singkat untuk memeriksa status tombol.

τεκ
sumber