Giảm mức tiêu thụ điện năng của Arduino

Giảm mức tiêu thụ điện năng của Arduino

Khi nói đến thiết bị điện tử cầm tay, một trong những tính năng quan trọng nhất là cách tối đa hóa tuổi thọ pin.

Khi nói đến thiết bị điện tử cầm tay, một trong những tính năng quan trọng nhất là cách tối đa hóa thời lượng pin. ATmega328P, được sử dụng trên các bo mạch phổ biến như SparkFun RedBoard, Arduino Uno và Pro Mini thực sự khá ngốn điện. RedBoard và Arduino Uno, tiêu thụ tối thiểu khoảng 15mA, nghe có vẻ không nhiều nhưng như bạn sẽ thấy trong hướng dẫn này, chúng ta có thể giảm đáng kể chỉ bằng một vài thủ thuật. Trong hướng dẫn này, chúng ta sẽ xem liệu chúng ta có thể giảm dòng điện cung cấp xuống dưới 10uA bằng một vài thủ thuật phần cứng và phần mềm hay không.

Loại bỏ phần cứng bổ sung

Mọi mạch tích hợp (IC) đều cần nguồn điện để hoạt động. Bằng cách giảm số lượng IC cần thiết, bạn có thể tiết kiệm một chút điện năng. Arduino Uno và RedBoard đều có cầu nối USB chuyển đổi tín hiệu USB thành tín hiệu mà Bộ thu phát không đồng bộ toàn cầu (UART) của Arduino có thể sử dụng. FT231x, được sử dụng trên RedBoard, chỉ tiêu thụ khoảng 10mA. Chỉ cần thay thế SparkFun RedBoard bằng Pro Mini 5V, bạn không chỉ tiết kiệm được khá nhiều không gian vật lý mà còn có thể giảm dòng điện cung cấp từ 15mA xuống chỉ còn 4mA.

Loại bỏ bộ điều chỉnh tuyến tính

Bộ điều chỉnh tuyến tính rất tuyệt. Chúng rẻ và có thể điều chỉnh điện áp cao xuống điện áp thấp chỉ với 3 chân (Vin, Vout nối đất). Tuy nhiên, nhược điểm của bộ điều chỉnh tuyến tính là chúng có thể trở nên khá nóng khi có sự chênh lệch lớn giữa điện áp đầu vào và đầu ra hoặc nếu bạn sử dụng nhiều dòng điện. Bạn có thể tính toán lượng điện năng bị lãng phí dưới dạng nhiệt bằng một phương trình đơn giản:

Pwasted = (Vin - Vout) * I

Với bộ điều chỉnh tuyến tính, dòng điện đầu vào bằng với dòng điện đầu ra. Bộ điều chỉnh tuyến tính, tốt nhất, chỉ có hiệu suất khoảng 70%. Càng rút nhiều dòng điện, hiệu suất càng thấp.

Không đi sâu vào chi tiết, bộ nguồn chế độ chuyển mạch hiệu quả hơn nhiều vì dòng điện đầu vào không nhất thiết phải giống với dòng điện đầu ra. Với tải nhẹ, bạn có thể tìm thấy bộ điều chỉnh chuyển mạch có hiệu suất trên 90%. Với bộ điều chỉnh chuyển mạch, bạn không chỉ có thể giảm điện áp đầu vào (sử dụng bộ chuyển đổi buck) mà còn có thể tăng điện áp (sử dụng bộ chuyển đổi tăng áp). Các IC khác, như TPS61200 được sử dụng trên PowerCell, hoàn hảo cho các ứng dụng chạy bằng pin, vì nó có thể giảm hiệu quả điện áp của pin hoặc tăng áp pin!

Giảm điện áp

Một trong những cách dễ nhất để giảm dòng điện là giảm điện áp bạn cung cấp cho Arduino. Chỉ cần giảm điện áp từ 5V xuống 3,3V, dòng điện sẽ giảm từ ~4mA xuống còn ~1mA!

Tuy nhiên, việc giảm điện áp cũng có một nhược điểm. Giảm điện áp hệ thống quá nhiều mà không giảm tốc độ xung nhịp có thể khiến vi điều khiển bắt đầu hoạt động lạ. RedBoard, Uno và Pro Mini 5V đều sử dụng tinh thể 16MHz. Khi xem bảng dữ liệu của 328P, chúng ta có thể thấy rằng ở mức 3,3V, tần số tối đa được khuyến nghị là khoảng 13MHz. Mối quan hệ giữa tốc độ xung nhịp và điện áp hệ thống là lý do tại sao Pro Mini 3,3V của chúng tôi sử dụng xung nhịp 8MHz thay vì 16MHz.

Lưu ý: Cần đề cập rằng đôi khi tôi sẽ chạy ATmega328P của mình ở mức 16MHz trong khi cấp nguồn bằng 3,3V và không gặp bất kỳ sự cố nào, nhưng kết quả của bạn có thể khác. Chúng tôi khuyên bạn không nên chạy vi điều khiển ngoài thông số kỹ thuật được liệt kê trong bảng dữ liệu của nó.

Dưới đây tôi đã tạo một biểu đồ cho thấy chỉ cần giảm điện áp, bạn có thể giảm đáng kể mức tiêu thụ điện năng của Arduino. Đối với thử nghiệm của mình, tôi đã tải một bản phác thảo trống lên 328P chạy ở tần số 1MHz.

Giảm Tốc Độ Xung Nhịp

Trong các dự án mà Arduino không cần thực hiện một lượng lớn lệnh trong thời gian ngắn hoặc trong các dự án mà thời gian không phải là vấn đề, việc giảm tốc độ xung nhịp của bộ vi điều khiển có thể giảm một vài miliampe khỏi dòng điện cung cấp. Ví dụ, chạy Arduino ở mức 5V và giảm tốc độ xung nhịp từ 16MHz xuống chỉ còn 8MHz có thể giảm dòng điện cần thiết từ 12mA xuống còn ~8,5mA.

Để hiểu rõ hơn về mối quan hệ giữa tốc độ xung nhịp và bộ vi điều khiển, chúng ta hãy xem biểu đồ bên dưới.

Như bạn thấy, việc giảm tốc độ xung nhịp có thể tăng gấp ba thời lượng pin. Tất nhiên, đánh đổi là bạn sẽ không thể thực hiện nhiều lệnh mỗi giây và đối với một số ứng dụng, giải pháp này không phải là một lựa chọn.

Tiết kiệm điện năng bằng phần mềm

Cho đến nay, chúng ta đã nói về cách giảm điện năng của Arduino, nhưng chúng ta vẫn chưa nói về lý do tại sao nó sử dụng điện năng như vậy. Bên trong ATmega328P, có một loạt các mạch hoạt động cùng nhau để chuyển tải công việc khỏi bộ xử lý và mỗi mạch này đều tiêu thụ một lượng điện năng nhất định. Ví dụ, hàm analogWrite() của Arduino không yêu cầu bộ xử lý tạo tín hiệu PWM bằng cách tự đếm các chu kỳ xung nhịp. Thay vào đó, Arduino sử dụng một trong các bộ đếm thời gian tích hợp để đếm các chu kỳ xung nhịp và gửi yêu cầu ngắt đến bộ xử lý. Từ đó, bộ xử lý dừng những gì nó đang làm và xử lý ngắt bằng cách chuyển trạng thái của chân. Bằng cách chuyển tải một số công việc, bộ vi điều khiển có thể thực hiện nhiều việc cùng một lúc. Một số mạch khác được tích hợp vào ATmega328P bao gồm:

  • 3 bộ hẹn giờ
  • Bộ hẹn giờ giám sát
  • Phát hiện mất điện
  • Chuyển đổi tín hiệu tương tự sang tín hiệu số

Mỗi thành phần độc lập này đều cần nguồn điện để hoạt động và trừ khi bạn tắt chúng theo cách thủ công, chúng sẽ tiếp tục tiêu thụ điện. Phát hiện mất điện sẽ chủ động theo dõi điện áp hệ thống để đảm bảo điện áp không giảm xuống dưới ngưỡng. Nếu có, bộ điều khiển sẽ tắt nguồn cho đến khi điện áp tăng lên trên ngưỡng đó. Bộ chuyển đổi tín hiệu tương tự sang tín hiệu số (ADC) hoạt động đúng như tên gọi của nó, nó lấy điện áp tương tự (có thể là bất kỳ giá trị nào từ 0V đến VCC) và chuyển đổi thành giá trị số mà bộ vi điều khiển có thể sử dụng (0-1023 đối với bộ chuyển đổi 10 bit). Nếu dự án của bạn không cần sử dụng ADC, việc tắt nó sẽ cắt giảm đáng kể lượng điện tiêu thụ.

Tải xuống thư viện công suất thấp

Thư viện này cho phép bạn thiết lập thời gian để vào chế độ ngủ, từ vài mili giây, cho đến vô thời hạn. Nó cũng cho phép bạn chỉ định những phần nào của vi điều khiển cần vô hiệu hóa, khiến nó trở thành một thư viện khá mạnh mẽ và linh hoạt cho nhu cầu công suất thấp của bạn.

Trong ví dụ đầu tiên này, chúng ta hãy tải bản phác thảo bên dưới lên Arduino của chúng ta, đang chạy ở mức 5V ở 16MHz. Để xem cần bao nhiêu dòng điện ở chế độ ngủ, tôi đang sử dụng Arduino cơ bản bằng cách sử dụng ATmega328P trên một bảng mạch để giảm thiểu dòng điện tôi đang sử dụng.

#include "LowPower.h"

void setup()
{
  pinMode(13,OUTPUT);
}

void loop() 
{
  digitalWrite(13,HIGH);
  delay(2000);
  digitalWrite(13,LOW);
  LowPower.powerDown(SLEEP_2S, ADC_OFF, BOD_OFF);
}

Trong bản phác thảo này, Arduino nhấp nháy đèn LED trong hai giây và sau đó tắt nguồn trong hai giây, và trong thời gian đó, ADC và phát hiện brown-out (BOD) bị vô hiệu hóa. Khi tắt nguồn, dòng điện của Arduino giảm từ 14mA xuống chỉ còn 6uA! Nếu chúng ta sử dụng một số thủ thuật tiết kiệm điện khác từ các phần trước, chúng ta có thể thấy trong bảng bên dưới mức thấp nhất mà chúng ta có thể giảm dòng điện khi ngủ.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Win a Raspberry Pi!

Answer 5 questions for your chance to win!
Question 1

What color is the sky?

Tìm kiếm bằng danh mục

Chọn danh mục