Apa implikasi menjalankan ATmega328P pada 8 MHz dan 3,3 V dengan sistem Arduino?

8

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!

Vulcan
sumber
2
Ada banyak papan kompatibel-Arduino 3.3V, Sparkfun Pro mini menjadi salah satu contoh. Ini didukung oleh IDE sehingga semua penyesuaian jam spesifik akan dilakukan untuk Anda setelah Anda mengambilnya dari dropdown 'papan'.
Oleg Mazurov
Pada 8MHz Anda mungkin akan baik-baik saja menggunakan osilator internal daripada kristal. Berhati-hatilah ketika Anda mengkompilasi kode yang ketika Anda misalnya memilih "Pro Mini 328p at 8MHz" yang 8 diterapkan ke kode, jadi saya tidak akan menyarankan kompilasi untuk 16MHz dan kemudian transplantasi atau Anda mungkin menemukan bahwa penundaan (1000) membutuhkan waktu dua detik sebagai contoh sederhana. Dan periksa penghematan daya / tidur dalam kode H2OhNo. (Saat lain ketika saya menyarankan Anda mendapatkan programmer sama sekali alih-alih membatasi diri Anda untuk mengunggah serial, cari Tindie untuk "ISP.")
Patrick Tudor

Jawaban:

7

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

AMADANON Inc.
sumber
Terima kasih atas tanggapan ini! Saya agak bingung dengan apa yang Anda katakan tentang detektor brownout yang ditutup di bawah 4,3 V. Sekarang saya menjalankan 3,7 V dan berfungsi dengan baik; tidak harus membuat perubahan pada sekering.
Vulcan
@ user40, lihat bagian "PEMBARUAN" di bagian bawah posting saya.
AMADANON Inc.
4

Pertama: untuk berjalan pada 8 MHz, apakah saya hanya perlu mengganti kristal? Atau ada hal lain yang harus saya lakukan?

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.

#include <avr/power.h>

void setup ()
  {
  // slow clock to divide by 2
  clock_prescale_set (clock_div_2);
  } // end of setup

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.

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.

Jika Anda memberi tahu IDE bahwa Anda memiliki prosesor 8 MHz (mis., Lilypad) maka harus menyesuaikan penundaan, perhitungan baud rate, dll. Dengan tepat.

Apakah ada yang rusak?

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.

Apakah kode akan berjalan lebih lambat?

Ya, itu akan berjalan pada kecepatan setengah dibandingkan dengan 16 MHz.

Ketiga: Bagaimana saya bisa memprogram chip? Apakah saya boleh memprogramnya di Arduino Uno pada 16 MHz, lalu memindahkannya ke arduino khusus?

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

Keempat: Apakah konsumsi daya akan berubah pada 8 MHz?

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.

Nick Gammon
sumber
Nick terima kasih! Saya sebenarnya telah membaca situs web Anda sebelumnya dan itu membantu saya mengurangi konsumsi daya secara radikal. Akibatnya, AAs dan AAA sekarang menjadi sumber daya yang layak untuk perangkat ini, yang merupakan masalah besar karena masalah berat. Jadi terima kasih untuk situs web itu juga - ini adalah layanan besar untuk komunitas dan sangat membantu orang-orang seperti saya.
Vulcan