Saya sedang mengerjakan arduino khusus yang akan berjalan pada 3.3 V tanpa regulator atau chip USB (untuk konsumsi daya). Saya pernah mendengar bahwa overclocking chip pada 16 MHz / 3.3 V umumnya baik-baik saja, tetapi saya tetap ingin tetap dalam spesifikasi.
Pertama: untuk berjalan pada 8 MHz, apakah saya hanya perlu mengganti kristal? Atau ada hal lain yang harus saya lakukan?
Kedua: Apakah saya perlu melakukan perubahan kode untuk mencerminkan kecepatan baru? Saya menggunakan koneksi serial, SPI, dan I2C dalam proyek ini, bersama dengan sistem operasi NilRTOS dan fungsi millis / delay. Apakah ada yang rusak? Apakah kode akan berjalan lebih lambat?
Ketiga: Bagaimana saya bisa memprogram chip? Apakah saya boleh memprogramnya di Arduino Uno pada 16 MHz, lalu memindahkannya ke arduino khusus?
Keempat: Apakah konsumsi daya akan berubah pada 8 MHz?
Terima kasih!
Jawaban:
Rumusnya tampaknya volt * 5.9-6.6 = mhz (valid antara 1.8v dan 4.5v), jadi pada 3.3v, ini akan menghasilkan 12.8mhz. Ketahuilah bahwa, jika Anda berlari dengan kecepatan 12.8mhz, SETIAP turun di bawah 3.3V MUNGKIN menyebabkan masalah (dan juga sangat sulit untuk didiagnosis!) Atau Anda MUNGKIN melakukannya.
Namun, chip Arduino Atmega328p memiliki deteksi "brown-out" pada 4.3V - setiap penurunan di bawah itu, chip dimatikan. Anda bisa mendapatkan ISP (AKA ICSP) untuk mengubah sekering - kunjungi http://www.engbedded.com/fusecalc/ untuk mengetahui apa yang harus ditetapkan dengan sekering. Anda juga dapat menggunakan ISP untuk membaca sekering saat ini, atau memang memprogram ulang chip tanpa papan Arduino - semua proyek saya memiliki header 6-pin. Jika Anda melakukan ini, sebelum memprogram ulang menggunakan papan Arduino, Anda harus "Membakar Bootloader" (di menu alat). Perhatikan bahwa pemrograman masih dapat dilakukan melalui Arduino IDE.
Atau, jika Anda ingin "menyalakan" (dan memiliki ISP), Anda dapat mengubah sekering untuk menggunakan jam 8mhz internal - ini membebaskan 2 pin tambahan juga! Perlu diketahui, bagaimanapun, bahwa jam internal dapat melayang 1,2 jam per hari (= 5%), dibandingkan dengan 1,7 detik per hari (= 20 bagian per juta) pada kristal kuarsa yang khas. Jika Anda tidak menggunakannya untuk ketepatan waktu, ini mungkin tidak masalah.
Anda perlu membuat perubahan pada waktu, untuk kode Anda - Anda perlu menambahkan boards.txt dengan pengaturan yang benar untuk chip / clockspeed Anda dll - Anda dapat menyalin pengaturan dari entri untuk papan, mengubah nama, dan mengubah pengaturan "build.f_cpu"; restart (atau mulai) IDE Arduino Anda, buka "Tools-> Board" dan pilih board yang Anda tambahkan.
Anda dapat memindahkan chip on / off board, dan memprogram ulang di sana (perhatikan bahwa board yang dipilih di Tools-> Board adalah board FINAL, bukan board pemrograman). Hati-hati memasukkan / mencabutnya - pada akhirnya, Anda AKAN menekuk pin! Atau, Anda dapat menggunakan ISP (ICSP), seperti yang disebutkan di atas - sangat direkomendasikan. Pemrograman ISP juga akan berfungsi jika chip tersebut bawaan pabrik, asalkan memiliki jam kerja.
Berapa banyak daya yang digunakan oleh chip sangat tergantung pada apa yang Anda lakukan dengannya - tidak hanya kecepatan jam, sumber jam, dll tetapi juga mode tidur. Jika Anda banyak tidur, itu mungkin kurang menarik ketika berjalan lebih cepat daripada berjalan lebih lambat - jika hampir semua waktu Anda tertidur, maka konsumsi daya harus dihitung per siklus jam, bukan per detik - jika jam Anda setengah kecepatan, dan setengah saat ini, maka Anda menggambar arus yang sama per instruksi. Karena sisa waktu Anda dihabiskan untuk tidur, Anda tidak mendapat manfaat. Lihat http://www.gammon.com.au/power untuk rincian penggunaan daya yang sangat baik, kiat tentang cara menghemat daya, dll.
Jika Anda memperlambat jam terlalu banyak, serial dan i2c mungkin menjadi tidak dapat diandalkan (kecuali jika Anda memperlambat kecepatannya), tapi saya berharap dapat turun ke 1mhz sebelum ini menjadi masalah - sebuah chip 1mhz coba lakukan 9600bps memiliki 104 instruksi per bit data yang ditransfer. i2c beroperasi pada 100khz, sehingga Anda mendapatkan 10 instruksi per bit (pada 1mhz) - mungkin mendorongnya. 8mhz seharusnya baik-baik saja. Tes tes tes.
UPDATE: Ada 3 pengaturan yang memungkinkan untuk deteksi brown-out - ada 3 nilai yang mungkin untuk AtMega328p: dinonaktifkan, 1.8v, 2.7v, dan 4.3v. Saya mendapat kesan (di atas) bahwa Arduino biasanya diatur ke 4.3v; ternyata bukan itu masalahnya (lihat komentar di bawah). Saya ingat melihat suatu tempat bahwa ada deteksi kecoklatan. Ini adalah sesuatu yang perlu diingat, jika arduino Anda diatur ulang, terutama saat meletakkan beban yang lebih besar pada baterai (motor berjalan, banyak led, dll.).
sumber
Tidak, jalankan osilator internal seperti yang disarankan oleh AMADANON Inc.
Atau, atur sekering "jam pembagian dengan 8" (yang akan menjalankannya pada 2 MHz dari kristal 16 MHz) dan kemudian dalam kode ubah divisi kembali ke 2. yaitu.
Atau untuk pemrograman di Uno lain biarkan sekring sendirian, program pada 16 MHz dan kemudian jatuhkan jam di chip target, berharap itu bekerja cukup lama di 3.3V untuk menjalankan instruksi pertama itu. Yang paling aman adalah menginstal kristal 8 MHz atau resonator di papan target. Namun jika timing tidak kritis jalankan dengan osilator internal.
Jika Anda memberi tahu IDE bahwa Anda memiliki prosesor 8 MHz (mis., Lilypad) maka harus menyesuaikan penundaan, perhitungan baud rate, dll. Dengan tepat.
I2C dan SPI memiliki jam otomatis. Mereka dapat berjalan di berbagai tingkat. Saya ragu akan ada masalah dengan mereka. Adapun serial, asalkan perhitungan dilakukan dengan benar berbagai tingkat baud masih harus tersedia.
Ya, itu akan berjalan pada kecepatan setengah dibandingkan dengan 16 MHz.
Kamu bisa melakukannya. Atau Anda bisa menghubungkan header ICSP atau header FTDI dan memprogramnya in situ.
Contoh di sini: http://www.gammon.com.au/breadboard
Ya, itu agak berkurang.
Anda dapat menguranginya lebih banyak dengan menggunakan teknik lain seperti yang dijelaskan di http://www.gammon.com.au/power , dan dirujuk oleh AMADANON Inc.
sumber