Menghubungkan tombol push ke pin pengontrol

8

Masalah ini sudah berusia puluhan tahun tetapi saya tidak melihat jawaban langsung untuk itu di situs ini. Saya ingin yang berikut ini:

masukkan deskripsi gambar di sini

Sirkuit ini hanya memungkinkan untuk memeriksa keadaan tombol dari dalam mikrokontroler. Tidak ada yang mewah. Pertanyaan saya:

  1. Adakah yang lebih baik dari desain sederhana ini?
  2. Apakah nilai resistor 100 kilo ohm memadai untuk perangkat CMOS kita sekarang, seperti dsPIC30FXXXX dan bukan aplikasi daya tinggi?
Kirill Kobelev
sumber
2
1) Tidak juga, kecuali Anda sedang mencari pelepasan perangkat keras. 2) Ya.
NickHalden

Jawaban:

6

Pertama, banyak mikrokontroler dan pengontrol sinyal digital akan memiliki resistor penarik internal. Berikut ini contohnya, Atmel ATMega164.Port GPIO ATMega164p

Biasanya akan ada register yang memungkinkan pull-up internal dinyalakan dan dimatikan. Karena variasi dalam proses fabrikasi, pullup internal ini datang dalam rentang yang sangat luas, dan bukan pilihan yang baik jika Anda memerlukan kontrol yang sangat dekat atas penarikan arus dalam aplikasi daya ultra rendah. Jika menjaga jumlah komponen rendah adalah penting, ini adalah cara mudah untuk melakukannya. Menggunakan internal pull up untuk debounce perangkat keras bukan ide yang baik, karena tidak mungkin untuk memperkirakan nilai tepatnya.

Apakah 100kΩnilai memadai tergantung. Jika itu hanya sebuah saklar yang akan dibalik secara berkala oleh pengguna, maka 100kΩakan menjadi pilihan yang baik untuk meminimalkan konsumsi daya. Untuk hal-hal yang akan beralih lebih cepat, seperti rotary encoders, proses yang akan saya lalui adalah

  1. Temukan arus sink maksimum dalam lembar data
  2. Hitung nilai pull up menggunakan Hukum Ohm
  3. Pilih resistor berukuran standar beberapa ukuran lebih besar, tergantung pada kecepatan yang sebenarnya dibutuhkan
  4. Uji dan lihat apakah ukuran resistor yang dipilih memberikan kenaikan dan penurunan yang diperlukan
  5. Sesuaikan dengan itu

Jadi jika arus sink maksimum per pin GPIO adalah 10 mA dan beroperasi pada 5V: R=VI=5V10mA=500Ω. Menjaga nilai R ini sekecil mungkin akan memungkinkan tepi paling tajam dan frekuensi switching tertinggi.

Matt Young
sumber
Apakah Anda mengatakan bahwa karena kapasitansi kawat / jejak Anda akan memiliki sirkuit RC yang akan menyebabkan penundaan propagasi sinyal ke UC, dan bahwa dengan R yang lebih besar penundaan propagasi ini benar-benar dapat menyebabkan kesalahan membaca encoder putar?
angelatlarge
Ya, reaktansi parasit hanyalah fakta kehidupan yang perlu ditangani lebih dan lebih seiring dengan meningkatnya frekuensi.
Matt Young
Menarik! Namun saya bingung: dengan asumsi kapasitansi paracitic kurang dari 1 uF, diberi resistor 100k Ohm dan dengan asumsi 0,1uF parasit C, kita mendapatkan konstanta waktu sekitar 23mS (input = 5V, output = 4.5V). Dengan kata lain dalam rangkaian 5V, UC akan melihat 4.5V pada input dalam pulsa yang naik dalam waktu kurang dari 25ms. Agar UC melewatkan itu (dengan asumsi bahwa itu bukan polling), pembuat enkode akan menghasilkan pulsa pada 40Hz atau lebih. Apakah itu sesuatu yang harus kita khawatirkan?
angelatlarge
Kapasitansi parasit biasanya dalam rentang Farad nano atau pico. Ini menjadi masalah dengan rotary encoders pada kecepatan yang lebih tinggi. Pertimbangkan enkoder optik yang mengeluarkan 24 pulsa per revolusi, dan berputar pada 1500 RPM. Gelombang output persegi akan menjadi 600Hz dengan periode sekitar 1,2 ms. Ini masih cukup lambat sehingga ukuran minimum naik tidak perlu, tetapi 100kΩakan membuat naik dan turun kali yang tidak mungkin diterima. Ini layak untuk ditanyakan sendiri.
Matt Young
Benar dan benar. Saya sedang memikirkan rotary encoders manual.
angelatlarge
4

Anda bisa menjadi lebih simpel dari itu.

Cukup gunakan resistor pull-up / pull-down internal di mikrokontroler Anda.

100k memadai, tetapi pullup internal bisa sedikit lebih rendah di beberapa MCU, misalnya dalam AVR atmega8 adalah 30-80kOhm untuk reset pull-up dan 20-50kOhm untuk semua pin I / O lainnya.

miceuz
sumber
Anda tidak dapat mengatakan bahwa 100r sudah memadai. Tidak ada tanda terima universal, Anda harus menghitung nilainya sesuai dengan MCU dan perangkat yang menggerakkan pin di sisi lain.
Blup1980
1
Orang yang mengajukan pertanyaan menentukan tombol tekan. Saya tidak melihat masalah dengan jawaban ini.
mjh2007
1
  1. Adakah yang lebih baik dari desain sederhana ini?


    Lebih baik tidak bisa dijawab tanpa kriteria khusus untuk mengukur, yang belum Anda berikan. Dalam kebanyakan kasus, topologi yang Anda tampilkan baik-baik saja. Dua variasi mungkin "lebih baik" tergantung situasi:

    Banyak mikrokontroler memiliki tarikan internal pada beberapa pin mereka. Ini dimaksudkan untuk situasi seperti ini. Resistor kemudian internal ke mikro dan Anda mengatur sedikit tempat untuk mengaktifkannya. Satu-satunya bagian eksternal yang diperlukan adalah tombol tekan itu sendiri.

    Varian lain yang berguna untuk diingat adalah untuk desain berdaya rendah di mana tombolnya mungkin sebuah saklar yang dapat ditutup untuk jangka waktu yang lama. Dalam hal ini Anda ingin meminimalkan arus rata-rata jangka panjang melalui resistor pullup. Anda membuatnya sebesar mungkin, tetapi ada batasan untuk itu dan kelemahan untuk membuatnya terlalu besar. Sebagai gantinya, Anda mengaktifkan pullup hanya untuk beberapa μs sekaligus untuk membaca tombol. Jika Anda memeriksa tombol setiap 1 ms dan pullup aktif selama 10 μs, maka rata-rata pullup saat ini berkurang 100x. Dengan resistor eksternal Anda menggunakan pin lain untuk menggerakkan sisi atas pullup. Dengan penarikan internal, Anda mengaktifkan / menonaktifkannya di firmware sesuai kebutuhan.

  2. Apakah nilai resistor 100 kilo ohm memadai untuk perangkat CMOS kita sekarang, seperti dsPIC30FXXXX dan bukan aplikasi daya tinggi?


    Saya sudah menjawab panjang lebar di sini .

Olin Lathrop
sumber
0

Lebih baik dari desain sederhana itu? Iya. Lempar tutupnya dan Anda memiliki sakelar deboelled perangkat keras sederhana.

masukkan deskripsi gambar di sini

Kapasitor akan menjadi tutup keramik 0,1 uF yang umum. Resistor akan menjadi 10k. Situs ini memiliki perincian lengkap tentang alasannya. Singkatnya, sirkuit debounce mencegah mikrokontroler dari kesalahan mencatat beberapa penekanan ketika Anda menekan tombol. Pengaturan Resistor / Kapasitor memuluskan mekanis memantul tombol sehingga transisi yang mantap.

Pejalan kaki
sumber
Tutup elektrolit tidak suka disingkat. Saya secara teratur menggunakan 100nF yang berfungsi dengan baik untuk aplikasi saya.
jippie
1
@ Jippie simbolnya adalah apa yang dimiliki gambar itu, tetapi keramik 100nf atau 0.1 uF adalah yang dibutuhkan.
Pejalan kaki
3
Ini bukan sirkuit debouncing yang bagus. Pertama, ini hanya menghilangkan break, bukan make. Ketika tombol ditekan, tutupnya segera disingkat. Kedua, konstanta waktu 1 ms terlalu pendek untuk banyak digunakan. Ketiga, ini hanya bisa dimasukkan ke input pemicu Schmidt. Input normal tidak suka sinyal yang naik perlahan. Biarkan saja tutupnya dan lakukan debouncing di firmware, yang tetap harus Anda lakukan meskipun dengan tutupnya.
Olin Lathrop
Ya, saat tutup langsung disingkat, tetapi pengisian ulang apa pun karena bouncing disaring low pass, menghilangkan efek bouncing. Mungkin lebih akurat, debounce pada make adalah mekanisme yang sangat berbeda dari debounce saat istirahat. Satu ms terlalu cepat. Saya tidak suka menggunakan sirkuit ini karena sejumlah alasan. Namun, jika Anda mengendarai interupsi dengan pin yang dimaksud, debouncing dalam firmware sering bukan solusi terbaik. Pindah ke DPST dan debouncing dengan flipflop SR adalah metode yang cukup bagus untuk kasus itu.
Scott Seidman
0

EDIT - komentar yang saya buat di bawah ini dimaksudkan untuk menindaklanjuti apa yang dikatakan Olin kemudian tentang sirkuit dengan kapasitor untuk menambahkan debounce. Maaf sepertinya muncul di tempat yang salah - mungkin seseorang dapat memperbaikinya karena saya jelas terlalu buta atau bodoh untuk melihat bagaimana saya seharusnya melakukannya !!

Saya setuju dengan Olin - tidak memberikan pembatalan yang baik. Saya juga akan menambahkan bahwa korslet kapasitor dapat menyebabkan gelombang besar arus yang dapat mengatur ulang mikroprosesor jika tata letak PCB tidak benar-benar baik. Beberapa sakelar memerlukan arus pembasahan untuk beroperasi dengan benar dan andal dan 100k mungkin terlalu tinggi untuk beberapa sakelar (terutama sakelar membran).

Andy alias
sumber