Làm cách nào tôi có thể chạy atmega328 trong một năm bằng pin?


51

Kịch bản

Tôi đã tạo ra một khóa cửa điện tử đẹp cho phòng ký túc xá của tôi. Nó hiện là một Arduino Diecimila với một servo [un] khóa cửa. Nó có bàn phím số với các nút 3x4 và 5 đèn LED (2 cặp serie và một đèn LED đơn). Nó hiện cũng chạy trên một bộ sạc điện thoại.

Bây giờ tôi đã thiết kế lại nó để chạy trên một Arduino độc lập (ATmega328), nhưng thực sự muốn nó chạy trên pin AA hoặc thậm chí là pin 9V.

Về phần mềm, tôi hình dung rằng tôi có thể thực hiện sleepcác cuộc gọi trong một số thời điểm nhất định bên trong phương thức vòng lặp để giữ mức tiêu thụ năng lượng ATmega ở mức thấp nhất có thể. Và để "đèn flash" của đèn LED với thời gian tắt càng lâu càng tốt.

Câu hỏi 1

Khi một nút được nhấn trong vài mili giây mà bảng ngủ, nó sẽ được "ghi nhớ" / "giữ" cho đến khi nó ra khỏi giấc ngủ và sau đó được chọn làm nút nhấn?

Điều gì sẽ là cách tốt nhất để xử lý nút này nhấn vào giấc ngủ? Tôi có thể mã hóa nó để đánh thức hoạt động của nút không, hoặc tôi phải để nó ngủ trong ví dụ 10m.s. trong mỗi vòng lặp?

Câu hỏi 2

Làm thế nào tôi có thể tiếp cận toán học tính toán cần bao nhiêu pin AA để chạy thiết bị này trong 10 tháng?

Ngoài ra, tôi không biết cách đo mức sử dụng năng lượng trung bình mỗi phút hoặc lâu hơn, vì nó thay thế nhanh chóng, v.v.

Thiết bị

Thiết bị khóa cửa của tôi

Câu trả lời:


35

Atmega328 cung cấp sáu chế độ tiết kiệm năng lượng, được sắp xếp theo thứ tự từ tối thiểu đến xuất sắc (ước tính các giả định hiện tại từ bài đăng trên diễn đàn này ):

  • SLEEP_MODE_IDLE: 15 mA
  • SLEEP_MODE_ADC: 6,5 mA
  • SLEEP_MODE_PWR_SAVE: 1,62 mA
  • SLEEP_MODE_EXT_STANDBY: 1.62 mA
  • SLEEP_MODE_STANDBY: 0,84 mA
  • SLEEP_MODE_PWR_DOWN: 0,36 mA

Trích dẫn câu hỏi ban đầu:

Tôi hình dung tôi có thể thực hiện sleepcác cuộc gọi trong một số thời điểm nhất định trong phương thức vòng lặp "

Bạn sẽ cần sử dụng sleep_cpu()sau khi thiết lập chế độ ngủ bạn yêu cầu, từ danh sách trên. Arduino Playground có một bài viết hữu ích về điều này .

Ứng dụng cần được điều khiển gián đoạn, sử dụng rộng rãi các chế độ ngủ ở trên và đánh thức bộ xử lý khi nhấn nút, tràn bộ đếm thời gian và các sự kiện hẹn giờ theo dõi để thực hiện các tác vụ.

Tiết kiệm năng lượng bổ sung có thể đạt được thông qua các bước sau:

  • Sử dụng bộ tạo dao động bên trong của vi điều khiển và tốc độ xung nhịp thấp (8 MHz thay vì 16) - nhưng đảm bảo rằng mã liên quan đến thời gian và thời gian vẫn hoạt động như mong đợi. Một phiên bản khác của bộ nạp khởi động có thể cần thiết cho việc này.
  • Tránh giữ đèn LED lâu nếu ứng dụng sử dụng chúng. Sử dụng đèn flash nhanh gấp đôi hoặc gấp ba trong thời gian ngắn (bật 0,05 giây, tắt 0,5 giây), với các khoảng trống giây ở giữa, đảm bảo chỉ báo đáng chú ý với mức tiêu thụ năng lượng tối thiểu
  • Sử dụng bộ điều chỉnh chuyển mạch thay vì bộ điều chỉnh tuyến tính, nếu cần bộ điều chỉnh.
  • Chạy vi điều khiển ở điện áp thấp hơn nếu được hỗ trợ, 3.0 Volts (ví dụ: Pin CR2032, không cần bộ điều chỉnh) hoặc 3.3 Volts thay vì 5 Volts.
  • Thực hiện theo các khuyến nghị trong biểu dữ liệu cho các cài đặt pin đầu vào và đầu ra không sử dụng để lãng phí điện năng tối thiểu.

Việc kết hợp các đề xuất này cho phép chạy các ứng dụng vi điều khiển trong nhiều tuần hoặc nhiều tháng trên một tế bào đồng xu CR2032 và nhiều năm trên một tế bào lithium loại LR123. Tất nhiên, số dặm của bạn có thể thay đổi tùy thuộc vào cảm biến, đầu ra và xử lý thực tế mà ứng dụng của bạn yêu cầu.

Một số tài liệu tham khảo hữu ích:


Với kinh nghiệm của tôi, trong SLEEP_MODE_PWR_DOWN, bạn có thể giảm xuống còn 0,1uA đến 6.0uA nếu bạn thông minh về việc tắt mọi thứ nhỏ nhặt (như phát hiện ra màu nâu). Tôi đã tạo các bản dựng sử dụng ít hơn 60uA, tồn tại 3-5 năm trên một bộ pin kiềm kiềm.
Tim Eckel

@TimEckel Tôi điên khi chỉ ra trạng thái với đèn LED - ăn ngân sách năng lượng như thể nó không còn hợp thời.
Anindo Ghosh

3
Nó không phải. Sử dụng đèn LED công suất cao với điện trở cao. Sẽ sử dụng một phần của mA thay vì hơn 20 mA. Ngoài ra, hãy nháy đèn LED trạng thái trong 5-15 ms cứ sau vài giây thay vì bật liên tục. Tôi có một đèn LED trạng thái mờ giá rẻ sử dụng 30 mA, tôi đã đổi nó thành đèn LED công suất cao với điện trở 3,3k Ohm mà tôi nháy trong 15 ms cứ sau 8 giây. Đã đi từ 30 mA đến 2,9 uA dòng điện trung bình, 1/1000 công suất!
Tim Eckel

4
@TimEckel Bạn rõ ràng không hiểu mức độ đam mê của tôi đối với ánh sáng mờ ảo :-D Không phải là tôi muốn giảm cường độ, tôi thích những thứ nhỏ bé lấp lánh như ngọn lửa của Hades, ngân sách năng lượng bị mờ nhạt! Một lưu ý nghiêm trọng hơn: Tôi nhận thức được những thủ thuật nhỏ đó, và trên thực tế đã tạo ra một vài lỗi của riêng tôi, điều này làm tăng tác động báo động trực quan trong khi giảm công suất thông qua đèn LED. Nhận xét trước đó là ( chỉ một phần ) trong trò đùa, đi cùng với nhiều câu hỏi LED vui nhộn tôi trả lời quanh đây.
Anindo Ghosh

3
Tôi đã đo mức tiêu thụ năng lượng của ATMega328P ở các mức điện áp và tần số khác nhau và tạo ra biểu đồ này docs.google.com.vn/s
dàn tính / d / Cách

19

Tôi có một Arduino Pro Mini trên bàn ngay bây giờ, nó đang hết 2 pin AA và có thể chạy được hơn một năm nếu được yêu cầu.

Có ba khía cạnh của thiết kế đã đạt được điều này.

1. Một bộ điều chỉnh khác nhau

Tôi đang sử dụng bộ điều chỉnh tăng LTC3525. Nó có dòng tĩnh rất thấp (7uA) và hiệu suất cao (> 90% @ 0,2mA). Một cái gì đó giống như bảng Sparkfun này https://www.sparkfun.com/products/8999 sẽ làm một công việc tương tự. Đảm bảo kết nối nó với chân 5V trên Arduino, không phải VIN, để bộ điều chỉnh Arduino không được sử dụng.

2. Xe trượt tuyết

Tỷ lệ thời gian thiết bị hoạt động sẽ nhỏ. Trong thời gian còn lại, thiết bị sẽ ngủ trong SLEEP_MODE_POWER_DOWN. Bạn có thể căn cứ thói quen ngủ của mình khỏi Thư viện năng lượng thấp Rocketscreem . Theo liên kết đó, bạn sẽ có thể giảm xuống còn 1.7uA khi tắt ADC, BOD và WDT và ở chế độ tắt nguồn.

3. Ngắt

Nửa còn lại của giấc ngủ bị gián đoạn để đánh thức nó. Trong chế độ ngủ Power Down, chỉ các mức ngắt trên INT1 và INT2, TWI khớp và WDT sẽ đánh thức nó. Vì vậy, bạn cần phải có một nút được kết nối với INT1 hoặc INT2 để nhấn nút sẽ đánh thức nó.

Những thứ khác:

Tắt tất cả các đèn LED trừ khi thực sự cần thiết. Nếu khóa trong nhà, đèn LED không phải sáng, tiết kiệm điện hơn. Ngoài ra nếu bạn cần MCU thực hiện một số nhiệm vụ thường xuyên, hãy sử dụng bộ đếm thời gian theo dõi để định kỳ đánh thức nó.

Biên tập:

Một phương pháp có thể hoạt động là sử dụng thư viện Low Power ở trên và ngủ trong 60ms cho mỗi vòng lặp nhờ bộ đếm thời gian theo dõi. Khi thức dậy kiểm tra nhấn nút. Hàm để gọi sẽ là

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

14

Tất cả những ý kiến ​​này là tại chỗ. Tôi muốn thêm một vài gợi ý:

1) Đối với đèn LED, sử dụng đèn LED 20 mA đầu ra cao. Đây là logic. Hãy nói rằng bạn muốn một đèn LED trạng thái mờ nhấp nháy cứ sau 8 giây. Bạn không muốn nó sáng, vì vậy bạn sử dụng một số đèn LED ngẫu nhiên. Vấn đề là, một đèn LED mờ vẫn sử dụng 20 mA (hoặc nhiều hơn) để chỉ xuất ra 100 mcd. Thay vào đó, hãy lấy một đèn LED đầu ra cao vẫn được xếp hạng 20 mA nhưng có thể xuất ra 4000 mcd (đảm bảo bạn nhìn ở góc đầu ra, bạn vẫn có thể muốn nó ở mức 30 độ trở lên). Với đèn LED 4000 mcd này, bạn kết nối nó với một cái gì đó như điện trở 3,3 k Ohm và bạn nhận được khoảng 100 mcd sản lượng ánh sáng, nhưng đang sử dụng ít hơn 1 mA. Vì vậy, thay vì sử dụng 20 mA cho đèn LED trạng thái, bạn đang sử dụng một phần của một mA. Tôi cũng thường đặt đèn flash LED trạng thái đúng giờ chỉ trong 5-15 ms, điều này cũng có thể tiết kiệm rất nhiều năng lượng nếu trước đó bạn có đèn flash đúng giờ ở mức 100 ms.

2) Bộ điều chỉnh điện áp mà tôi lựa chọn là Microchip MCP1700. Nó chỉ sử dụng 1.6 dòngA của dòng tĩnh và có giá siêu rẻ (khoảng 0,30 đô la với số lượng nhỏ). Hạn chế duy nhất là điện áp đầu vào tối đa chỉ 6 volt, vì vậy bạn không thể sử dụng pin 9 volt. Nhưng, nó hoàn hảo cho 4 pin AA, một pin LiPo hoặc hai pin lithium coin.

3) Để cấp nguồn cho mạch ATmega với 4 pin AA, tôi thường sử dụng diode 1N4001 trên VCC để giảm tối đa 6 volt của 4 pin xuống 5,5 volt. Ngoài ra, diode bảo vệ ATmega khỏi điện áp ngược, vì vậy nó phục vụ hai mục đích hữu ích. Làm điều này, tôi có thể tạo ra một mạch chạy bằng pin có thể sử dụng ít nhất 0,1 0,1A trong khi ngủ vì không có bộ điều chỉnh điện áp nào ăn hết dòng điện mọi lúc.


8

Tôi đã thực hiện một thử nghiệm trên máy atmega328P-PU trần trên bảng mạch bằng thư viện RocketScream LowPower

Đã sử dụng bản phác thảo này:

#include "LowPower.h"

void setup(){}

void loop()
{
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);         
    delay(5000);
}

Với vàng uC hiện tại, tôi đo được 7,25 uA khi ở chế độ tắt nguồn.


1
Đẹp! Tôi sẽ thử điều này càng sớm càng tốt. Điều này có cho phép chạy atmega238 trong nhiều năm với pin CR2032 không?
Basj

6

Có hai câu hỏi ở đây, nhưng chỉ có câu hỏi thứ hai thực sự là một phần của tiêu đề câu hỏi, vì vậy có lẽ tốt hơn nếu bạn mở một câu hỏi khác cho câu hỏi lập trình Arduino. Tôi sẽ trả lời câu hỏi thứ hai ở đây.

Pin đơn 1,5V kiềm kiềm hàng đầu có dung lượng khoảng 2600mAh. Nếu bạn dùng pin lithium, bạn có thể nhận được khoảng 3400mAh nếu may mắn. Hãy xem con số đó là cơ sở cho trường hợp tốt nhất tuyệt đối.

Cách bạn tính toán thời gian chạy tối đa theo lý thuyết cho một tải chỉ đơn giản là công suất chia cho tải. Nếu tải của bạn là 1mA, bạn có thể chạy nó trong 3400/1 = 3400 giờ = 141 ngày = ~ 5 tháng. Tuy nhiên, đây chỉ là mức tối đa về mặt lý thuyết , vì bạn sẽ bắt đầu bị sụt áp đáng kể khoảng 65% vào thời điểm đó. Nếu bạn đang điều chỉnh đầu ra, bạn sẽ có hiệu ứng chạy trốn khi điện áp pin càng thấp, dòng điện cao hơn cần thiết để duy trì điện áp quy định, giúp tiêu hao pin nhanh hơn. Tôi sẽ ngạc nhiên nếu bạn có thể nhận được hơn 80% công suất được quảng cáo từ nó với điện áp đủ cao để chạy thiết bị của bạn.

Vì vậy, giả sử rằng bạn nhận được 80% thời gian đó sau khi sụt điện áp và sự thiếu hiệu quả của bộ điều chỉnh. Chúng tôi sẽ cho rằng bạn đang chạy ở 3,3V từ ba pin nối tiếp. Điều này vẫn sẽ cung cấp cho bạn cùng một công suất, nhưng điện áp sẽ đủ cho một bộ điều chỉnh. Nếu thiết bị của bạn chạy ở 15mA (đó là một ước tính khá bảo thủ), các con số sẽ như thế này:

  • Dung lượng sau 80% hiệu suất = 3400 * 0,8 = 2720mAh
  • Thời gian = 2720/15 = 181 giờ = 7,54 ngày

Vì vậy, bạn cần khoảng 144 pin lithium (48 bộ 3) để chạy nó trong một năm. Không tốt lắm!

Thay vào đó, tôi khuyên bạn nên sử dụng nguồn cung cấp DC được điều tiết từ nguồn điện. Có thể bao gồm một bản sao lưu pin, dễ dàng thiết lập với rơle SPDT - chỉ cần nối cuộn dây với nguồn điện một chiều và có tiếp điểm "tắt" được kết nối với pin. Khi DC không thành công, tiếp điểm giảm xuống và pin được sử dụng thay thế.


Những giấc mơ không dây của tôi tan nát;) Cảm ơn câu trả lời chi tiết. Đây dường như là lựa chọn tốt nhất đối với tôi.
LouwHopley

Thật trùng hợp, đây cũng chính là câu hỏi tôi đặt ra cho bản thân khi thiết kế khóa cửa điện tử. Ngay cả với pin sạc 10.000mAh chunky cũng không đáng. Kết thúc chỉ bằng cách sử dụng bộ chuyển đổi DC 250mA và pin điện thoại di động cũ để dự phòng.
Đa thức

4
15 mA trung bình không có vẻ rất bảo thủ đối với tôi! Chiếc 328 có thể chạy ở các microamp một chữ số ở chế độ ngủ, và chắc chắn bạn có thể thoát khỏi việc có nó trong giấc ngủ ít nhất là bán sâu rất nhiều thời gian. Ngoài ra, ở tần số thấp (ví dụ 0,5 MHz), bạn có thể nhận được bằng <1 mA ở chế độ hoạt động. Tất nhiên, các thành phần khác (bộ điều chỉnh điện áp, v.v.) cần phải được chọn để phù hợp với tính chất năng lượng thấp.
exscape

4
@Polynomial Tôi không nhìn kỹ vào sơ đồ, nhưng chắc chắn dự án có thể được xây dựng mà không có "đèn LED nguồn". Hoặc bạn có thể nháy nó, để nó bật, ví dụ như ở độ sáng một nửa (thông qua PWM), chỉ trong 25 giây cứ sau 2 giây, như vậy mức sử dụng hiện tại sẽ giảm xuống trung bình ~ 0,09 mA thay vì 15.
exscape

1
Arduino đang đói điện. Xây dựng hội đồng của riêng bạn sẽ giải quyết điều này. Atmega328 rút 0,2 mA khi 32kH và 0,75 uA ở chế độ tiết kiệm năng lượng.
Vorac

4

Một điều chưa ai đề cập đến: Bạn cần có một số cách để tắt nguồn + 5V cấp nguồn cho servo, khi bạn không sử dụng nó. Ngay cả khi nó không di chuyển, một servo vẫn sẽ rút điện.

Một FET với cổng được điều khiển bởi chân I / O từ arduino là một cách tốt để làm điều đó.


Tôi thường sử dụng 2N3904 cho mỗi cảm biến hoặc bất cứ thứ gì để bật / tắt. Hoặc, nếu cảm biến có công suất thấp và cùng điện áp với những gì tôi đang chạy ATmega, tôi chỉ cần sử dụng pin trực tiếp để kiểm soát trạng thái nguồn.
Tim Eckel

1
Sử dụng 2n7000 để sử dụng ít năng lượng hơn đáng kể so với 2n3904 và bạn không cần điện trở cơ sở.
John Meacham

3

Bạn có thể cân nhắc sử dụng bộ điều khiển vi mô được tối ưu hóa đặc biệt cho mức tiêu thụ điện năng thấp cho thiết kế tiếp theo của bạn. Để tiêu thụ điện năng thấp, cần phải có năng lượng rất thấp trong khi ngủ. Điều thường bị bỏ qua là điều quan trọng là nó có thể thức dậy nhanh như thế nào từ giấc ngủ này.

Điều quan trọng là phải mất bao nhiêu phí từ giấc ngủ sâu nhất để xử lý ngắt nhanh nhất có thể (vì khi đó sự cố mất điện sẽ rất ngắn) và quay trở lại giấc ngủ.

Một ví dụ về bộ điều khiển vi mô như vậy là MSP430 từ Texas Cụ. Trên trang web của họ, bạn sẽ tìm thấy các ghi chú ứng dụng làm thế nào để lưu trữ các ứng dụng thu năng lượng và năng lượng.

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.