Saya sedang mengerjakan proyek berbasis AVR berbasis daya baterai rendah yang mengintegrasikan beberapa perangkat yang berbeda termasuk strip neopixel dan Adafruit pixie . Ketika keseluruhan perangkat diam, saya ingin menarik kurang dari 0,1 mA untuk memaksimalkan masa pakai baterai LiPo.
Saya mendapatkan ini semua berfungsi (diukur 0,035mA) tapi saya tidak yakin saya harus melakukannya dengan cara yang "benar" dan saya berencana untuk membangun produk berdasarkan ini sehingga ingin melakukannya dengan benar.
(Tidak ditampilkan: flyback diode untuk relay)
Perhatian utama yang saya miliki adalah menyalakan "parasit" perangkat ketika VCC terputus melalui arus yang mengalir dari pin data. Misalnya, Pixie (yang berkomunikasi melalui serial), tidak memiliki mode daya mati dan bahkan ketika "mati" terkuras sekitar satu miliamp. Jadi saya menempatkan relay kecil untuk memutuskan VCC-nya, dan menemukan bahwa pin serial sebenarnya masih menyalakan Pixie. Petunjuk di tempat lain menyarankan bahwa banyak chip memiliki diode shunting pin input digital mereka ke VCC sebagai perlindungan daya. Untuk mengatasi ini, saya harus menangguhkan perpustakaan serial dan sebenarnya digitalWrite (PIN, LOW) selama tidur.
Hal yang sama dengan strip WS2812b - memutus VCC masih memungkinkan perangkat untuk didukung dari pin data. Dan dalam desain lain ketika saya memutus GND dengan N-Channel MOSFET, saya telah melihat kebalikannya - arus balik arus melalui jalur data ke ground! (Ini harus diselesaikan dengan dioda per pos pada PJRC.) WS2812b sebenarnya memakan waktu sekitar satu miliamp masing-masing bahkan ketika dinyalakan,
Jadi pertanyaannya: Apakah ada cara umum, "bersih" untuk memutuskan sambungan VCC dan GND dari bagian-bagian proyek selama sistem tidur ketika ada pin data dalam campuran. Apa praktik terbaik?
Beberapa ide:
- Paksa VCC ke GND (tidak yakin bagaimana? Hbridge?). (Jika saya melakukan itu, apa yang terjadi pada pin data yang tinggi?)
- Tempatkan buffer tri-state antara semua pin data dan perangkat ini, dan selama tidur, taruh buffer tri-state dalam status impedansi tinggi, putuskan sambungan VCC atau GND hanya dengan P atau N MOSFET
- Putuskan sambungan GND hanya dengan N MOSFET, dan tempatkan dioda pada semua pin data
- Apakah ada semacam kait daya yang memutus VCC dan GND dan menjadikannya dalam keadaan “impedansi tinggi” (seperti buffer tri-state untuk daya?) Dengan cara itu, arus tidak memiliki cara untuk mengalir keluar dari jalur data.
Dapatkah seseorang mencerahkan saya ke cara yang paling bersih dan paling berulang dalam menangani masalah “pemutusan sambungan” semacam ini? (Tak perlu dikatakan, saya telah menghabiskan berjam-jam googling masalah ini dengan sedikit keberuntungan, meskipun saya memang menemukan catatan teknologi ini pada pemindahan muatan tetapi tidak membahas back-feed dan kekuatan parasit)
Jawaban:
Ketika saya melakukan ini, saya biasanya menggunakan switch analog CMOS pada jalur data yang terpengaruh.
Sesuatu seperti ADG812 memiliki 4 saluran switch SPST yang mudah cocok untuk logika yang cukup cepat, dan memberikan impedansi yang sangat tinggi antara node switch ketika dalam keadaan off.
Yang menyenangkan tentang ini adalah bahwa teknik ini berfungsi untuk jalur data searah dan dua arah.
Bagian-bagian ini juga berjalan dengan senyum cerah:
Urutan biasa untuk mematikan daya:
Matikan sakelar jalur data
Matikan domain.
Power up adalah kebalikannya, tentu saja.
[Memperbarui]
Ini memang dikenal dengan nama lain, seperti gerbang pas dan gerbang transmisi .
Ini sangat berbeda dari buffer tri-state sejati (seperti yang Anda lihat pada diagram di tautan di atas), tetapi untuk logika biasa, efeknya lebih baik (ini pada dasarnya merupakan perangkat dua arah) tetapi dengan daya yang lebih rendah.
sumber
Jika sinyal data terhubung ke mikrokontroler Anda, Anda dapat membuatnya impedansi tinggi dengan mengkonfigurasi pin tersebut sebagai input. (Jika chip lain menggunakan daya yang sangat kecil, Anda dapat memperlakukan Vcc-nya seperti sinyal data.)
Jika tidak, Anda dapat menggunakan sakelar analog (chip logika 74x66) untuk melepaskannya. Untuk sinyal searah, 74x125 akan berfungsi juga.
sumber
Saya tidak berpikir ada satu ukuran cocok untuk semua strategi, sayangnya. Alihkan daya ke subsistem seperti yang sudah Anda lakukan. Dalam perangkat lunak, pin drive rendah untuk kondisi daya rendah, kecuali melakukan hal itu akan menyebabkan kondisi daya tetap tinggi. Dalam hal ini, drive pin tinggi. Jangan biarkan input mengambang. Urutkan kekuatan seperlunya untuk menciptakan kondisi awal yang aman.
sumber
Masalah buruk yang dapat menyebabkan mikrokontroler melakukan hal-hal yang sangat aneh.saya2C
Solusi yang bagus adalah dengan menggunakan pull-down serial I / O like
Anda tidak memiliki opsi itu - Anda dipaksa untuk menggunakan serial I / O asinkron. Beberapa mikrokontroler memungkinkan pendekatan yang sama seperti I2C untuk menyelesaikan masalah. Jika Anda dapat memprogram pin output serial menjadi pull-down-only daripada pull-up-for-1 yang lebih umum , pull-down-for-0 , maka Anda dapat menambahkan resistor pull-up ke switch-Vcc ke membangun logika yang tinggi.
Solusi ini tidak sekuat noise seperti pendekatan Anda saat ini, tetapi harus menyelesaikan masalah back-powering modul I / O Anda dari AVR. Ini sebenarnya bukan solusi "bersih", tetapi jauh lebih aman untuk mikrokontroler (s) dalam modul IO Anda.
mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab
sumber