Ý nghĩa của việc chạy ATmega328P ở 8 MHz và 3,3 V với hệ thống Arduino là gì?


8

Tôi đang làm việc trên một arduino tùy chỉnh sẽ chạy ở 3,3 V mà không có bộ điều chỉnh hoặc chip USB (để tiêu thụ điện năng). Tôi đã nghe nói rằng việc ép xung chip ở mức 16 MHz / 3,3 V nói chung là tốt, nhưng dù sao tôi cũng muốn ở lại thông số kỹ thuật.

Đầu tiên: để chạy ở 8 MHz, tôi chỉ cần thay thế tinh thể? Hoặc có bất cứ điều gì khác tôi phải làm?

Thứ hai: Tôi có cần thực hiện bất kỳ thay đổi mã nào để phản ánh tốc độ mới không? Tôi đang sử dụng các kết nối nối tiếp, SPI và I2C trong dự án này, cùng với hệ điều hành NilRTOS và các chức năng millis / delay. Bất kỳ trong số này sẽ bị phá vỡ? Mã sẽ chạy chậm hơn đáng chú ý?

Thứ ba: Làm thế nào tôi có thể lập trình chip? Có thể lập trình nó trong Arduino Uno ở 16 MHz, sau đó ghép nó vào arduino tùy chỉnh không?

Thứ tư: Tiêu thụ điện năng sẽ thay đổi ở 8 MHz?

Cảm ơn!


2
Có rất nhiều bo mạch tương thích với Arduino 3,3V, Sparkfun Pro mini là một ví dụ. Nó được IDE hỗ trợ, do đó, tất cả các điều chỉnh dành riêng cho đồng hồ sẽ được thực hiện cho bạn sau khi bạn chọn nó từ danh sách thả xuống của bảng.
Oleg Mazurov

Ở 8 MHz, bạn có thể ổn khi sử dụng bộ tạo dao động bên trong thay vì tinh thể. Cẩn thận khi bạn biên dịch mã mà khi bạn chọn "Pro Mini 328p ở 8 MHz" mà 8 được áp dụng cho mã, vì vậy tôi không khuyên bạn nên biên dịch cho 16 MHz và sau đó ghép hoặc bạn có thể thấy rằng độ trễ (1000) mất hai giây như một ví dụ đơn giản. Và kiểm tra tiết kiệm năng lượng / ngủ trong mã H2OhNo. (Một khoảnh khắc khác khi tôi đề nghị bạn nên có bất kỳ lập trình viên nào thay vì giới hạn bản thân trong các video tải lên nối tiếp, hãy tìm kiếm Tindie cho "ISP.")
Patrick Tudor

Câu trả lời:


7

Công thức dường như là volt * 5,9-6,6 = mhz (hợp lệ trong khoảng từ 1,8v đến 4,5v), vì vậy ở mức 3,3v, điều này sẽ cung cấp 12,8 mhz. Xin lưu ý rằng, nếu bạn đang chạy ở tốc độ 12,8 MHz, BẤT K drop mức nào dưới 3,3v có thể gây ra sự cố (và cũng rất khó chẩn đoán!) Hoặc bạn có thể thoát khỏi nó.

Tuy nhiên, chip Arduino Atmega328p có bộ phát hiện "màu nâu" ở mức 4.3v - bất kỳ mức giảm nào dưới mức đó, chip sẽ tắt. Bạn có thể nhận được một ISP (AKA ICSP) để thay đổi các cầu chì - truy cập http://www.engbedded.com/fusecalc/ để tìm ra những gì cần đặt cầu chì. Bạn cũng có thể sử dụng ISP để đọc các cầu chì hiện tại hoặc thực sự lập trình lại chip mà không cần bo mạch Arduino - tất cả các dự án của tôi đều có tiêu đề 6 chân. Nếu bạn làm điều này, trước khi lập trình lại bằng bảng Arduino, bạn sẽ phải "Ghi Bootloader" (trong menu công cụ). Lưu ý rằng lập trình vẫn có thể được thực hiện thông qua Arduino IDE.

Ngoài ra, nếu bạn muốn đi "nhẹ" (và có ISP), bạn có thể thay đổi cầu chì để sử dụng đồng hồ 8 mhz bên trong - điều này cũng giải phóng thêm 2 chân! Tuy nhiên, hãy lưu ý rằng đồng hồ bên trong có thể trôi 1,2 giờ mỗi ngày (= 5%), so với 1,7 giây mỗi ngày (= 20 phần triệu) trên một tinh thể thạch anh điển hình. Nếu bạn không sử dụng nó để chấm công, điều này có lẽ không thành vấn đề.

Bạn sẽ cần thay đổi thời gian, đối với mã của bạn - bạn cần thêm một bảng.txt với các cài đặt chính xác cho chip / tốc độ đồng hồ, v.v. - bạn có thể sao chép các cài đặt từ mục nhập cho bảng, thay đổi tên và thay đổi cài đặt "build.f_cpu"; khởi động lại (hoặc bắt đầu) Arduino IDE của bạn, đi đến "Công cụ-> Bảng" và chọn bảng bạn đã thêm.

Bạn có thể di chuyển chip bật / tắt bảng và lập trình lại nó ở đó (lưu ý rằng bảng được chọn trong Công cụ-> Bảng là bảng FINAL, không phải bảng lập trình). Hãy cẩn thận cắm / rút phích cắm - cuối cùng, bạn S uốn cong các chân! Ngoài ra, bạn có thể sử dụng ISP (ICSP), như đã đề cập ở trên - rất khuyến khích. Lập trình ISP cũng sẽ hoạt động nếu chip mặc định của nhà máy, miễn là nó có đồng hồ hoạt động.

Con chip sử dụng bao nhiêu năng lượng phụ thuộc rất nhiều vào những gì bạn làm với nó - không chỉ tốc độ đồng hồ, nguồn đồng hồ, v.v mà còn cả chế độ ngủ. Nếu bạn ngủ nhiều, nó có thể rút ra ít hơn khi chạy nhanh hơn chạy chậm hơn - nếu gần như toàn bộ thời gian của bạn là ngủ, thì mức tiêu thụ năng lượng nên được tính trên mỗi chu kỳ đồng hồ, không phải mỗi giây - nếu đồng hồ của bạn chỉ bằng một nửa tốc độ và một nửa hiện tại, sau đó bạn vẽ cùng một hiện tại cho mỗi hướng dẫn. Vì thời gian còn lại của bạn dành cho giấc ngủ, bạn không nhận được lợi ích gì. Xem http://www.gammon.com.au/power để biết cách sử dụng năng lượng rất tốt, các mẹo về cách tiết kiệm điện, v.v.

Nếu bạn làm chậm đồng hồ xuống quá nhiều, nối tiếp và i2c có thể trở nên không đáng tin cậy (trừ khi bạn làm chậm tốc độ), nhưng tôi hy vọng có thể giảm xuống 1mhz trước khi đây là một vấn đề - một chip 1mhz cố gắng thực hiện 9600bps có 104 hướng dẫn cho mỗi bit dữ liệu được truyền. i2c chạy ở tốc độ 100khz, vì vậy bạn nhận được 10 hướng dẫn mỗi bit (ở mức 1mhz) - có thể đẩy nó. 8 MHz nên ổn. Kiểm tra, kiểm tra, kiểm tra.

CẬP NHẬT: Có 3 cài đặt có thể phát hiện ra màu nâu - có 3 giá trị có thể có cho AtMega328p: bị vô hiệu hóa, 1.8v, 2.7v và 4.3v. Tôi có ấn tượng (ở trên) rằng Arduinos thường được đặt thành 4.3v; rõ ràng đó không phải là trường hợp (xem bình luận dưới đây). Tôi nhớ rằng đã thấy ở đâu đó có phát hiện mất điện. Đây là điều cần lưu ý, nếu arduino của bạn đặt lại, đặc biệt là khi đặt tải lớn hơn vào pin (động cơ chạy, nhiều đèn led, v.v.).


Cảm ơn phản hồi này! Tôi hơi bối rối với những gì bạn nói về máy dò mất điện tắt dưới 4.3 V. Bây giờ tôi đang chạy ở 3.7 V và nó hoạt động tốt; không phải thực hiện bất kỳ thay đổi nào đối với cầu chì.
Vulcan

@ user40, xem phần "CẬP NHẬT" ở cuối bài viết của tôi.
AMADANON Inc. 22/2/2015

3

Đầu tiên: để chạy ở 8 MHz, tôi chỉ cần thay thế tinh thể? Hoặc có bất cứ điều gì khác tôi phải làm?

Không, chạy trên bộ tạo dao động nội bộ theo đề xuất của AMADANON Inc.

Hoặc, đặt cầu chì "chia đồng hồ cho 8" (sẽ chạy nó ở mức 2 MHz từ tinh thể 16 MHz) và sau đó trong mã thay đổi cách chia trở lại thành 2. tức là.

#include <avr/power.h>

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

Hoặc để lập trình trong một Uno khác, hãy để cầu chì một mình, lập trình ở 16 MHz và sau đó thả đồng hồ xuống trong chip mục tiêu, hy vọng nó hoạt động đủ lâu ở 3,3V để thực hiện lệnh đầu tiên đó. Điều an toàn nhất là chỉ cần cài đặt một tinh thể hoặc bộ cộng hưởng 8 MHz trên bảng đích. Tuy nhiên nếu thời gian không phải là chạy quan trọng với bộ dao động nội bộ.

Thứ hai: Tôi có cần thực hiện bất kỳ thay đổi mã nào để phản ánh tốc độ mới không? Tôi đang sử dụng các kết nối nối tiếp, SPI và I2C trong dự án này, cùng với hệ điều hành NilRTOS và các chức năng millis / delay.

Nếu bạn nói với IDE bạn có bộ xử lý 8 MHz (ví dụ: Lilypad) thì nó sẽ điều chỉnh độ trễ, tính toán tốc độ baud, v.v. một cách thích hợp.

Bất kỳ trong số này sẽ bị phá vỡ?

I2C và SPI là đồng hồ tự. Họ có thể chạy ở nhiều mức giá. Tôi nghi ngờ sẽ có bất kỳ vấn đề với họ. Đối với nối tiếp, việc cung cấp các tính toán được thực hiện ngay một loạt các tốc độ truyền vẫn nên có sẵn.

Mã sẽ chạy chậm hơn đáng chú ý?

Vâng, nó sẽ chạy ở một nửa tốc độ so với 16 MHz.

Thứ ba: Làm thế nào tôi có thể lập trình chip? Có thể lập trình nó trong Arduino Uno ở 16 MHz, sau đó ghép nó vào arduino tùy chỉnh không?

Bạn có thể làm điều đó. Hoặc bạn có thể kết nối tiêu đề ICSP hoặc tiêu đề FTDI và lập trình tại chỗ.

Ví dụ ở đây: http://www.gammon.com.au/breadboard

Thứ tư: Tiêu thụ điện năng sẽ thay đổi ở 8 MHz?

Vâng, nó được giảm bớt phần nào.

Bạn có thể giảm đáng kể hơn bằng cách sử dụng các kỹ thuật khác như được mô tả tại http://www.gammon.com.au/power và được AMADANON Inc.


Cảm ơn Nick! Tôi thực sự đã đọc trang web của bạn trước đây và nó đã giúp tôi cắt giảm mức tiêu thụ năng lượng triệt để. Do đó, các AA và AAA hiện là nguồn năng lượng khả thi cho thiết bị này, đây là một vấn đề lớn vì trọng lượng là vấn đề. Vì vậy, cảm ơn vì trang web đó - đó là một dịch vụ lớn cho cộng đồng và thực sự hữu ích cho những người như tôi.
Vulcan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.