การลดการใช้พลังงานของ Arduino

เมื่อพูดถึงอุปกรณ์อิเล็กทรอนิกส์พกพา คุณสมบัติที่สำคัญที่สุดประการหนึ่งคือการยืดอายุการใช้งานแบตเตอรี่

การลดการใช้พลังงานของ Arduino

เมื่อพูดถึงอุปกรณ์อิเล็กทรอนิกส์พกพา คุณสมบัติที่สำคัญที่สุดประการหนึ่งคือการยืดอายุการใช้งานแบตเตอรี่ ATmega328P ที่ใช้กับบอร์ดยอดนิยม เช่น SparkFun RedBoard, Arduino Uno และ Pro Mini นั้นกินพลังงานค่อนข้างมาก RedBoard และ Arduino Uno กินไฟขั้นต่ำประมาณ 15mA ซึ่งอาจฟังดูไม่มาก แต่จากที่คุณจะเห็นในบทช่วยสอนนี้ เราก็สามารถลดปริมาณไฟลงได้อย่างมากโดยใช้เคล็ดลับเพียงไม่กี่อย่าง ในบทช่วยสอนนี้ เราจะดูว่าเราสามารถลดกระแสไฟฟ้าที่จ่ายให้ต่ำกว่า 10uA ได้หรือไม่โดยใช้เคล็ดลับด้านฮาร์ดแวร์และซอฟต์แวร์บางประการ

ถอดฮาร์ดแวร์เพิ่มเติมออก

วงจรรวม (IC) ทุกตัวต้องใช้แหล่งจ่ายไฟในการทำงาน การลดจำนวน IC ที่จำเป็นสามารถช่วยให้คุณประหยัดพลังงานได้บ้าง Arduino Uno และ RedBoard ทั้งคู่มีสะพาน USB ที่แปลงสัญญาณ USB ให้เป็นสัญญาณที่เครื่องส่งสัญญาณตัวรับแบบอะซิงโครนัสสากล (UART) ของ Arduino สามารถใช้ได้ FT231x ที่ใช้กับ RedBoard กินไฟเพียงประมาณ 10mA เท่านั้น เพียงแค่เปลี่ยน SparkFun RedBoard ด้วย Pro Mini 5V คุณไม่เพียงแต่ประหยัดพื้นที่ทางกายภาพได้มาก แต่ยังสามารถลดกระแสไฟฟ้าที่จ่ายจาก 15mA เหลือเพียงแค่ 4mA ได้อีกด้วย

ถอดตัวควบคุมเชิงเส้นออก

ตัวควบคุมเชิงเส้นเป็นสิ่งที่ดี มีราคาถูกและสามารถควบคุมแรงดันไฟฟ้าสูงให้เป็นแรงดันไฟฟ้าต่ำได้ด้วยขาเพียง 3 ขา (Vin, Vout ถึงกราวด์) อย่างไรก็ตาม ข้อเสียของตัวควบคุมเชิงเส้นก็คือ อาจร้อนขึ้นได้มากเมื่อมีความแตกต่างระหว่างแรงดันไฟฟ้าขาเข้าและขาออกมาก หรือหากคุณใช้กระแสไฟฟ้ามากเกินไป คุณสามารถคำนวณได้ว่าสูญเสียไฟฟ้าไปเท่าใดในรูปของความร้อน โดยใช้สมการง่ายๆ ดังนี้

เสีย = (วิน - วุท) * ไอ

โดยตัวควบคุมเชิงเส้น กระแสอินพุตจะเท่ากับกระแสเอาต์พุต ตัวควบคุมเชิงเส้นมีประสิทธิภาพสูงสุดเพียงประมาณ 70% เท่านั้น ยิ่งใช้กระแสมาก ประสิทธิภาพก็ยิ่งลดลง

โดยไม่ต้องลงรายละเอียด แหล่งจ่ายไฟแบบสวิตช์โหมดมีประสิทธิภาพมากกว่ามาก เนื่องจากกระแสไฟฟ้าอินพุตไม่จำเป็นต้องเท่ากับกระแสไฟฟ้าเอาต์พุต สำหรับโหลดน้ำหนักเบา คุณจะพบตัวควบคุมสวิตช์ที่มีประสิทธิภาพสูงกว่า 90% ด้วยเครื่องควบคุมแรงดันไฟฟ้าแบบสวิตชิ่ง คุณไม่เพียงแต่จะลดแรงดันไฟฟ้าขาเข้า (โดยใช้บัคคอนเวอร์เตอร์) ได้เท่านั้น แต่ยังสามารถเพิ่มแรงดันไฟฟ้า (โดยใช้บูสต์คอนเวอร์เตอร์) ได้อีกด้วย ไอซีอื่นๆ เช่น TPS61200 ที่ใช้ใน PowerCell เหมาะอย่างยิ่งกับการใช้งานที่ใช้พลังงานจากแบตเตอรี่ เนื่องจากสามารถลดแรงดันไฟแบตเตอรี่หรือเพิ่มแรงดันไฟแบตเตอรี่ได้อย่างมีประสิทธิภาพ!

การลดแรงดันไฟฟ้า

วิธีที่ง่ายที่สุดวิธีหนึ่งในการลดกระแสไฟฟ้าคือการลดแรงดันไฟฟ้าที่คุณจ่ายให้กับ Arduino เพียงลดแรงดันไฟจาก 5V เหลือ 3.3V กระแสไฟก็จะลดลงจาก ~4mA เหลือ ~1mA!

อย่างไรก็ตาม การลดแรงดันไฟฟ้าก็มีข้อเสียเช่นกัน การลดแรงดันไฟฟ้าของระบบมากเกินไปโดยไม่ลดความเร็วสัญญาณนาฬิกาอาจทำให้ไมโครคอนโทรลเลอร์เริ่มทำงานผิดปกติ RedBoard, Uno และ Pro Mini 5V ล้วนใช้คริสตัล 16MHz เมื่อดูจากแผ่นข้อมูล 328P เราจะเห็นได้ว่าที่ 3.3V ความถี่สูงสุดที่แนะนำคือประมาณ 13MHz ความสัมพันธ์ระหว่างความเร็วสัญญาณนาฬิกาและแรงดันไฟฟ้าของระบบคือสาเหตุที่ 3.3V Pro Mini ของเราจึงใช้สัญญาณนาฬิกา 8MHz แทนที่จะเป็น 16MHz

หมายเหตุ: โปรดทราบว่าบางครั้งฉันจะรัน ATmega328P ที่ความถี่ 16MHz ในขณะที่ใช้พลังงาน 3.3V และไม่มีปัญหาใดๆ แต่ผลลัพธ์ของคุณอาจแตกต่างกันไป เราขอแนะนำว่าคุณไม่ควรใช้ไมโครคอนโทรลเลอร์นอกเหนือจากข้อกำหนดที่ระบุไว้ในแผ่นข้อมูล

ด้านล่างนี้ฉันได้สร้างกราฟที่แสดงให้เห็นว่าเพียงลดแรงดันไฟฟ้าก็สามารถลดการใช้พลังงานของ Arduino ได้อย่างมาก สำหรับการทดสอบของฉัน ฉันได้อัปโหลดภาพร่างเปล่าไปยัง 328P ที่ทำงานที่ความถี่ 1MHz

ลดความเร็วสัญญาณนาฬิกา

สำหรับโครงการที่ Arduino ไม่จำเป็นต้องดำเนินการคำสั่งจำนวนมากในช่วงเวลาสั้นๆ หรือสำหรับโครงการที่เวลาไม่ใช่ปัญหา การลดความเร็วสัญญาณนาฬิกาของไมโครคอนโทรลเลอร์จะสามารถลดกระแสไฟฟ้าจ่ายได้ไม่กี่มิลลิแอมป์ ตัวอย่างเช่น การรัน Arduino ที่ 5V และลดความเร็วสัญญาณนาฬิกาจาก 16MHz เหลือเพียงแค่ 8MHz จะสามารถลดกระแสไฟที่ต้องการจาก 12mA เหลือ ~8.5mA ได้

เพื่อให้เข้าใจความสัมพันธ์ระหว่างความเร็วสัญญาณนาฬิกาและไมโครคอนโทรลเลอร์ได้ดีขึ้น ลองดูแผนภูมิด้านล่างนี้

อย่างที่คุณเห็น การลดความเร็วสัญญาณนาฬิกาสามารถเพิ่มอายุการใช้งานแบตเตอรี่ได้สามเท่า แน่นอนว่า ข้อแลกเปลี่ยนก็คือ คุณจะไม่สามารถดำเนินการคำสั่งต่างๆ ได้มากเท่าที่ต้องการต่อวินาที และสำหรับแอปพลิเคชันบางตัว โซลูชันนี้ก็ไม่ใช่ทางเลือก

ประหยัดพลังงานด้วยซอฟต์แวร์

จนถึงตอนนี้เราได้พูดคุยกันถึงวิธีที่ Arduino ใช้พลังงานน้อยลง แต่เราไม่ได้พูดถึงว่าทำไมมันจึงใช้พลังงานมากขนาดนั้น ภายใน ATmega328P มีชุดวงจรที่ทำงานร่วมกันเพื่อถ่ายโอนงานจากโปรเซสเซอร์ และวงจรแต่ละวงจรเหล่านี้จะใช้พลังงานในปริมาณหนึ่ง ตัวอย่างเช่น ฟังก์ชัน analogWrite() ของ Arduino ไม่ต้องการให้โปรเซสเซอร์สร้างสัญญาณ PWM ด้วยการนับรอบสัญญาณนาฬิกาเอง แทนที่จะทำเช่นนั้น Arduino จะใช้ตัวจับเวลาในตัวตัวใดตัวหนึ่งในการนับรอบสัญญาณนาฬิกาและส่งคำขอขัดจังหวะไปยังโปรเซสเซอร์ จากนั้นโปรเซสเซอร์จะหยุดสิ่งที่กำลังทำอยู่และจัดการการขัดจังหวะโดยการสลับสถานะของพิน การลดภาระงานบางส่วนช่วยให้ไมโครคอนโทรลเลอร์สามารถทำงานหลายอย่างได้ในคราวเดียว วงจรอื่นๆ ที่รวมอยู่ใน ATmega328P ได้แก่:

  • 3 ตัวจับเวลา
  • การตรวจสอบการจับเวลา
  • การตรวจจับไฟฟ้าขัดข้อง
  • แปลงสัญญาณอนาล็อกเป็นสัญญาณดิจิตอล

ส่วนประกอบอิสระแต่ละชิ้นเหล่านี้ต้องใช้พลังงานในการทำงาน และจะยังคงใช้พลังงานต่อไป หากคุณไม่ปิดมันด้วยตนเอง การตรวจจับไฟฟ้าดับจะตรวจสอบแรงดันไฟฟ้าของระบบอย่างจริงจังเพื่อให้แน่ใจว่าแรงดันไฟฟ้าจะไม่ลดลงต่ำกว่าเกณฑ์ หากเป็นเช่นนั้น ตัวควบคุมจะปิดลงจนกว่าแรงดันไฟฟ้าจะสูงเกินเกณฑ์นั้น ตัวแปลงแอนะล็อกเป็นดิจิทัล (ADC) ทำงานตามที่ชื่อบ่งบอก นั่นคือ นำแรงดันไฟฟ้าแอนะล็อก (ซึ่งสามารถเป็นค่าใดก็ได้ตั้งแต่ 0V ถึง VCC) มาแปลงให้เป็นค่าดิจิทัลที่ไมโครคอนโทรลเลอร์สามารถใช้ได้ (0-1023 สำหรับตัวแปลง 10 บิต) หากโครงการของคุณไม่จำเป็นต้องใช้ ADC การปิด ADC จะช่วยลดการใช้พลังงานได้อย่างมาก

ดาวน์โหลดไลบรารีพลังงานต่ำ

ไลบรารีนี้ช่วยให้คุณตั้งเวลาเข้าสู่โหมดสลีปได้ ตั้งแต่ไม่กี่มิลลิวินาทีไปจนถึงไม่จำกัดเวลา นอกจากนี้ยังช่วยให้คุณระบุได้ว่าส่วนใดของไมโครคอนโทรลเลอร์ที่จะปิดใช้งาน ทำให้เป็นไลบรารีที่มีประสิทธิภาพและยืดหยุ่นพอสมควรสำหรับความต้องการพลังงานต่ำของคุณ

ในตัวอย่างแรกนี้ เราจะอัปโหลดภาพร่างด้านล่างนี้ไปยัง Arduino ซึ่งทำงานที่ 5V และ 16MHz เพื่อดูว่าต้องใช้กระแสไฟเท่าใดในโหมดสลีป ฉันใช้ Arduino พื้นฐานโดยใช้ ATmega328P บนแผงทดลองเพื่อลดกระแสไฟที่ฉันใช้

#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);
}

ในภาพร่างนี้ Arduino จะทำให้ LED กะพริบเป็นเวลาสองวินาที จากนั้นจึงปิดเครื่องเป็นเวลาสองวินาที ระหว่างเวลาดังกล่าว ADC และการตรวจจับไฟตก (BOD) จะถูกปิดใช้งาน เมื่อปิดเครื่อง กระแสไฟของ Arduino จะลดลงจาก 14mA เหลือเพียง 6uA! หากเราใช้เคล็ดลับประหยัดพลังงานอื่นๆ ในหัวข้อก่อนหน้านี้ เราก็จะเห็นได้จากตารางด้านล่างนี้ว่าเราสามารถลดกระแสไฟขณะนอนหลับได้ต่ำสุดเท่าไร

การลดการใช้พลังงานของ Arduino

เมื่อพูดถึงอุปกรณ์อิเล็กทรอนิกส์พกพา คุณสมบัติที่สำคัญที่สุดประการหนึ่งคือการยืดอายุการใช้งานแบตเตอรี่

นักเขียนบทความ
by 
นักเขียนบทความ
การลดการใช้พลังงานของ Arduino

การลดการใช้พลังงานของ Arduino

เมื่อพูดถึงอุปกรณ์อิเล็กทรอนิกส์พกพา คุณสมบัติที่สำคัญที่สุดประการหนึ่งคือการยืดอายุการใช้งานแบตเตอรี่

เมื่อพูดถึงอุปกรณ์อิเล็กทรอนิกส์พกพา คุณสมบัติที่สำคัญที่สุดประการหนึ่งคือการยืดอายุการใช้งานแบตเตอรี่ ATmega328P ที่ใช้กับบอร์ดยอดนิยม เช่น SparkFun RedBoard, Arduino Uno และ Pro Mini นั้นกินพลังงานค่อนข้างมาก RedBoard และ Arduino Uno กินไฟขั้นต่ำประมาณ 15mA ซึ่งอาจฟังดูไม่มาก แต่จากที่คุณจะเห็นในบทช่วยสอนนี้ เราก็สามารถลดปริมาณไฟลงได้อย่างมากโดยใช้เคล็ดลับเพียงไม่กี่อย่าง ในบทช่วยสอนนี้ เราจะดูว่าเราสามารถลดกระแสไฟฟ้าที่จ่ายให้ต่ำกว่า 10uA ได้หรือไม่โดยใช้เคล็ดลับด้านฮาร์ดแวร์และซอฟต์แวร์บางประการ

ถอดฮาร์ดแวร์เพิ่มเติมออก

วงจรรวม (IC) ทุกตัวต้องใช้แหล่งจ่ายไฟในการทำงาน การลดจำนวน IC ที่จำเป็นสามารถช่วยให้คุณประหยัดพลังงานได้บ้าง Arduino Uno และ RedBoard ทั้งคู่มีสะพาน USB ที่แปลงสัญญาณ USB ให้เป็นสัญญาณที่เครื่องส่งสัญญาณตัวรับแบบอะซิงโครนัสสากล (UART) ของ Arduino สามารถใช้ได้ FT231x ที่ใช้กับ RedBoard กินไฟเพียงประมาณ 10mA เท่านั้น เพียงแค่เปลี่ยน SparkFun RedBoard ด้วย Pro Mini 5V คุณไม่เพียงแต่ประหยัดพื้นที่ทางกายภาพได้มาก แต่ยังสามารถลดกระแสไฟฟ้าที่จ่ายจาก 15mA เหลือเพียงแค่ 4mA ได้อีกด้วย

ถอดตัวควบคุมเชิงเส้นออก

ตัวควบคุมเชิงเส้นเป็นสิ่งที่ดี มีราคาถูกและสามารถควบคุมแรงดันไฟฟ้าสูงให้เป็นแรงดันไฟฟ้าต่ำได้ด้วยขาเพียง 3 ขา (Vin, Vout ถึงกราวด์) อย่างไรก็ตาม ข้อเสียของตัวควบคุมเชิงเส้นก็คือ อาจร้อนขึ้นได้มากเมื่อมีความแตกต่างระหว่างแรงดันไฟฟ้าขาเข้าและขาออกมาก หรือหากคุณใช้กระแสไฟฟ้ามากเกินไป คุณสามารถคำนวณได้ว่าสูญเสียไฟฟ้าไปเท่าใดในรูปของความร้อน โดยใช้สมการง่ายๆ ดังนี้

เสีย = (วิน - วุท) * ไอ

โดยตัวควบคุมเชิงเส้น กระแสอินพุตจะเท่ากับกระแสเอาต์พุต ตัวควบคุมเชิงเส้นมีประสิทธิภาพสูงสุดเพียงประมาณ 70% เท่านั้น ยิ่งใช้กระแสมาก ประสิทธิภาพก็ยิ่งลดลง

โดยไม่ต้องลงรายละเอียด แหล่งจ่ายไฟแบบสวิตช์โหมดมีประสิทธิภาพมากกว่ามาก เนื่องจากกระแสไฟฟ้าอินพุตไม่จำเป็นต้องเท่ากับกระแสไฟฟ้าเอาต์พุต สำหรับโหลดน้ำหนักเบา คุณจะพบตัวควบคุมสวิตช์ที่มีประสิทธิภาพสูงกว่า 90% ด้วยเครื่องควบคุมแรงดันไฟฟ้าแบบสวิตชิ่ง คุณไม่เพียงแต่จะลดแรงดันไฟฟ้าขาเข้า (โดยใช้บัคคอนเวอร์เตอร์) ได้เท่านั้น แต่ยังสามารถเพิ่มแรงดันไฟฟ้า (โดยใช้บูสต์คอนเวอร์เตอร์) ได้อีกด้วย ไอซีอื่นๆ เช่น TPS61200 ที่ใช้ใน PowerCell เหมาะอย่างยิ่งกับการใช้งานที่ใช้พลังงานจากแบตเตอรี่ เนื่องจากสามารถลดแรงดันไฟแบตเตอรี่หรือเพิ่มแรงดันไฟแบตเตอรี่ได้อย่างมีประสิทธิภาพ!

การลดแรงดันไฟฟ้า

วิธีที่ง่ายที่สุดวิธีหนึ่งในการลดกระแสไฟฟ้าคือการลดแรงดันไฟฟ้าที่คุณจ่ายให้กับ Arduino เพียงลดแรงดันไฟจาก 5V เหลือ 3.3V กระแสไฟก็จะลดลงจาก ~4mA เหลือ ~1mA!

อย่างไรก็ตาม การลดแรงดันไฟฟ้าก็มีข้อเสียเช่นกัน การลดแรงดันไฟฟ้าของระบบมากเกินไปโดยไม่ลดความเร็วสัญญาณนาฬิกาอาจทำให้ไมโครคอนโทรลเลอร์เริ่มทำงานผิดปกติ RedBoard, Uno และ Pro Mini 5V ล้วนใช้คริสตัล 16MHz เมื่อดูจากแผ่นข้อมูล 328P เราจะเห็นได้ว่าที่ 3.3V ความถี่สูงสุดที่แนะนำคือประมาณ 13MHz ความสัมพันธ์ระหว่างความเร็วสัญญาณนาฬิกาและแรงดันไฟฟ้าของระบบคือสาเหตุที่ 3.3V Pro Mini ของเราจึงใช้สัญญาณนาฬิกา 8MHz แทนที่จะเป็น 16MHz

หมายเหตุ: โปรดทราบว่าบางครั้งฉันจะรัน ATmega328P ที่ความถี่ 16MHz ในขณะที่ใช้พลังงาน 3.3V และไม่มีปัญหาใดๆ แต่ผลลัพธ์ของคุณอาจแตกต่างกันไป เราขอแนะนำว่าคุณไม่ควรใช้ไมโครคอนโทรลเลอร์นอกเหนือจากข้อกำหนดที่ระบุไว้ในแผ่นข้อมูล

ด้านล่างนี้ฉันได้สร้างกราฟที่แสดงให้เห็นว่าเพียงลดแรงดันไฟฟ้าก็สามารถลดการใช้พลังงานของ Arduino ได้อย่างมาก สำหรับการทดสอบของฉัน ฉันได้อัปโหลดภาพร่างเปล่าไปยัง 328P ที่ทำงานที่ความถี่ 1MHz

ลดความเร็วสัญญาณนาฬิกา

สำหรับโครงการที่ Arduino ไม่จำเป็นต้องดำเนินการคำสั่งจำนวนมากในช่วงเวลาสั้นๆ หรือสำหรับโครงการที่เวลาไม่ใช่ปัญหา การลดความเร็วสัญญาณนาฬิกาของไมโครคอนโทรลเลอร์จะสามารถลดกระแสไฟฟ้าจ่ายได้ไม่กี่มิลลิแอมป์ ตัวอย่างเช่น การรัน Arduino ที่ 5V และลดความเร็วสัญญาณนาฬิกาจาก 16MHz เหลือเพียงแค่ 8MHz จะสามารถลดกระแสไฟที่ต้องการจาก 12mA เหลือ ~8.5mA ได้

เพื่อให้เข้าใจความสัมพันธ์ระหว่างความเร็วสัญญาณนาฬิกาและไมโครคอนโทรลเลอร์ได้ดีขึ้น ลองดูแผนภูมิด้านล่างนี้

อย่างที่คุณเห็น การลดความเร็วสัญญาณนาฬิกาสามารถเพิ่มอายุการใช้งานแบตเตอรี่ได้สามเท่า แน่นอนว่า ข้อแลกเปลี่ยนก็คือ คุณจะไม่สามารถดำเนินการคำสั่งต่างๆ ได้มากเท่าที่ต้องการต่อวินาที และสำหรับแอปพลิเคชันบางตัว โซลูชันนี้ก็ไม่ใช่ทางเลือก

ประหยัดพลังงานด้วยซอฟต์แวร์

จนถึงตอนนี้เราได้พูดคุยกันถึงวิธีที่ Arduino ใช้พลังงานน้อยลง แต่เราไม่ได้พูดถึงว่าทำไมมันจึงใช้พลังงานมากขนาดนั้น ภายใน ATmega328P มีชุดวงจรที่ทำงานร่วมกันเพื่อถ่ายโอนงานจากโปรเซสเซอร์ และวงจรแต่ละวงจรเหล่านี้จะใช้พลังงานในปริมาณหนึ่ง ตัวอย่างเช่น ฟังก์ชัน analogWrite() ของ Arduino ไม่ต้องการให้โปรเซสเซอร์สร้างสัญญาณ PWM ด้วยการนับรอบสัญญาณนาฬิกาเอง แทนที่จะทำเช่นนั้น Arduino จะใช้ตัวจับเวลาในตัวตัวใดตัวหนึ่งในการนับรอบสัญญาณนาฬิกาและส่งคำขอขัดจังหวะไปยังโปรเซสเซอร์ จากนั้นโปรเซสเซอร์จะหยุดสิ่งที่กำลังทำอยู่และจัดการการขัดจังหวะโดยการสลับสถานะของพิน การลดภาระงานบางส่วนช่วยให้ไมโครคอนโทรลเลอร์สามารถทำงานหลายอย่างได้ในคราวเดียว วงจรอื่นๆ ที่รวมอยู่ใน ATmega328P ได้แก่:

  • 3 ตัวจับเวลา
  • การตรวจสอบการจับเวลา
  • การตรวจจับไฟฟ้าขัดข้อง
  • แปลงสัญญาณอนาล็อกเป็นสัญญาณดิจิตอล

ส่วนประกอบอิสระแต่ละชิ้นเหล่านี้ต้องใช้พลังงานในการทำงาน และจะยังคงใช้พลังงานต่อไป หากคุณไม่ปิดมันด้วยตนเอง การตรวจจับไฟฟ้าดับจะตรวจสอบแรงดันไฟฟ้าของระบบอย่างจริงจังเพื่อให้แน่ใจว่าแรงดันไฟฟ้าจะไม่ลดลงต่ำกว่าเกณฑ์ หากเป็นเช่นนั้น ตัวควบคุมจะปิดลงจนกว่าแรงดันไฟฟ้าจะสูงเกินเกณฑ์นั้น ตัวแปลงแอนะล็อกเป็นดิจิทัล (ADC) ทำงานตามที่ชื่อบ่งบอก นั่นคือ นำแรงดันไฟฟ้าแอนะล็อก (ซึ่งสามารถเป็นค่าใดก็ได้ตั้งแต่ 0V ถึง VCC) มาแปลงให้เป็นค่าดิจิทัลที่ไมโครคอนโทรลเลอร์สามารถใช้ได้ (0-1023 สำหรับตัวแปลง 10 บิต) หากโครงการของคุณไม่จำเป็นต้องใช้ ADC การปิด ADC จะช่วยลดการใช้พลังงานได้อย่างมาก

ดาวน์โหลดไลบรารีพลังงานต่ำ

ไลบรารีนี้ช่วยให้คุณตั้งเวลาเข้าสู่โหมดสลีปได้ ตั้งแต่ไม่กี่มิลลิวินาทีไปจนถึงไม่จำกัดเวลา นอกจากนี้ยังช่วยให้คุณระบุได้ว่าส่วนใดของไมโครคอนโทรลเลอร์ที่จะปิดใช้งาน ทำให้เป็นไลบรารีที่มีประสิทธิภาพและยืดหยุ่นพอสมควรสำหรับความต้องการพลังงานต่ำของคุณ

ในตัวอย่างแรกนี้ เราจะอัปโหลดภาพร่างด้านล่างนี้ไปยัง Arduino ซึ่งทำงานที่ 5V และ 16MHz เพื่อดูว่าต้องใช้กระแสไฟเท่าใดในโหมดสลีป ฉันใช้ Arduino พื้นฐานโดยใช้ ATmega328P บนแผงทดลองเพื่อลดกระแสไฟที่ฉันใช้

#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);
}

ในภาพร่างนี้ Arduino จะทำให้ LED กะพริบเป็นเวลาสองวินาที จากนั้นจึงปิดเครื่องเป็นเวลาสองวินาที ระหว่างเวลาดังกล่าว ADC และการตรวจจับไฟตก (BOD) จะถูกปิดใช้งาน เมื่อปิดเครื่อง กระแสไฟของ Arduino จะลดลงจาก 14mA เหลือเพียง 6uA! หากเราใช้เคล็ดลับประหยัดพลังงานอื่นๆ ในหัวข้อก่อนหน้านี้ เราก็จะเห็นได้จากตารางด้านล่างนี้ว่าเราสามารถลดกระแสไฟขณะนอนหลับได้ต่ำสุดเท่าไร

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.

การลดการใช้พลังงานของ Arduino

การลดการใช้พลังงานของ Arduino

เมื่อพูดถึงอุปกรณ์อิเล็กทรอนิกส์พกพา คุณสมบัติที่สำคัญที่สุดประการหนึ่งคือการยืดอายุการใช้งานแบตเตอรี่

Lorem ipsum dolor amet consectetur adipiscing elit tortor massa arcu non.

เมื่อพูดถึงอุปกรณ์อิเล็กทรอนิกส์พกพา คุณสมบัติที่สำคัญที่สุดประการหนึ่งคือการยืดอายุการใช้งานแบตเตอรี่ ATmega328P ที่ใช้กับบอร์ดยอดนิยม เช่น SparkFun RedBoard, Arduino Uno และ Pro Mini นั้นกินพลังงานค่อนข้างมาก RedBoard และ Arduino Uno กินไฟขั้นต่ำประมาณ 15mA ซึ่งอาจฟังดูไม่มาก แต่จากที่คุณจะเห็นในบทช่วยสอนนี้ เราก็สามารถลดปริมาณไฟลงได้อย่างมากโดยใช้เคล็ดลับเพียงไม่กี่อย่าง ในบทช่วยสอนนี้ เราจะดูว่าเราสามารถลดกระแสไฟฟ้าที่จ่ายให้ต่ำกว่า 10uA ได้หรือไม่โดยใช้เคล็ดลับด้านฮาร์ดแวร์และซอฟต์แวร์บางประการ

ถอดฮาร์ดแวร์เพิ่มเติมออก

วงจรรวม (IC) ทุกตัวต้องใช้แหล่งจ่ายไฟในการทำงาน การลดจำนวน IC ที่จำเป็นสามารถช่วยให้คุณประหยัดพลังงานได้บ้าง Arduino Uno และ RedBoard ทั้งคู่มีสะพาน USB ที่แปลงสัญญาณ USB ให้เป็นสัญญาณที่เครื่องส่งสัญญาณตัวรับแบบอะซิงโครนัสสากล (UART) ของ Arduino สามารถใช้ได้ FT231x ที่ใช้กับ RedBoard กินไฟเพียงประมาณ 10mA เท่านั้น เพียงแค่เปลี่ยน SparkFun RedBoard ด้วย Pro Mini 5V คุณไม่เพียงแต่ประหยัดพื้นที่ทางกายภาพได้มาก แต่ยังสามารถลดกระแสไฟฟ้าที่จ่ายจาก 15mA เหลือเพียงแค่ 4mA ได้อีกด้วย

ถอดตัวควบคุมเชิงเส้นออก

ตัวควบคุมเชิงเส้นเป็นสิ่งที่ดี มีราคาถูกและสามารถควบคุมแรงดันไฟฟ้าสูงให้เป็นแรงดันไฟฟ้าต่ำได้ด้วยขาเพียง 3 ขา (Vin, Vout ถึงกราวด์) อย่างไรก็ตาม ข้อเสียของตัวควบคุมเชิงเส้นก็คือ อาจร้อนขึ้นได้มากเมื่อมีความแตกต่างระหว่างแรงดันไฟฟ้าขาเข้าและขาออกมาก หรือหากคุณใช้กระแสไฟฟ้ามากเกินไป คุณสามารถคำนวณได้ว่าสูญเสียไฟฟ้าไปเท่าใดในรูปของความร้อน โดยใช้สมการง่ายๆ ดังนี้

เสีย = (วิน - วุท) * ไอ

โดยตัวควบคุมเชิงเส้น กระแสอินพุตจะเท่ากับกระแสเอาต์พุต ตัวควบคุมเชิงเส้นมีประสิทธิภาพสูงสุดเพียงประมาณ 70% เท่านั้น ยิ่งใช้กระแสมาก ประสิทธิภาพก็ยิ่งลดลง

โดยไม่ต้องลงรายละเอียด แหล่งจ่ายไฟแบบสวิตช์โหมดมีประสิทธิภาพมากกว่ามาก เนื่องจากกระแสไฟฟ้าอินพุตไม่จำเป็นต้องเท่ากับกระแสไฟฟ้าเอาต์พุต สำหรับโหลดน้ำหนักเบา คุณจะพบตัวควบคุมสวิตช์ที่มีประสิทธิภาพสูงกว่า 90% ด้วยเครื่องควบคุมแรงดันไฟฟ้าแบบสวิตชิ่ง คุณไม่เพียงแต่จะลดแรงดันไฟฟ้าขาเข้า (โดยใช้บัคคอนเวอร์เตอร์) ได้เท่านั้น แต่ยังสามารถเพิ่มแรงดันไฟฟ้า (โดยใช้บูสต์คอนเวอร์เตอร์) ได้อีกด้วย ไอซีอื่นๆ เช่น TPS61200 ที่ใช้ใน PowerCell เหมาะอย่างยิ่งกับการใช้งานที่ใช้พลังงานจากแบตเตอรี่ เนื่องจากสามารถลดแรงดันไฟแบตเตอรี่หรือเพิ่มแรงดันไฟแบตเตอรี่ได้อย่างมีประสิทธิภาพ!

การลดแรงดันไฟฟ้า

วิธีที่ง่ายที่สุดวิธีหนึ่งในการลดกระแสไฟฟ้าคือการลดแรงดันไฟฟ้าที่คุณจ่ายให้กับ Arduino เพียงลดแรงดันไฟจาก 5V เหลือ 3.3V กระแสไฟก็จะลดลงจาก ~4mA เหลือ ~1mA!

อย่างไรก็ตาม การลดแรงดันไฟฟ้าก็มีข้อเสียเช่นกัน การลดแรงดันไฟฟ้าของระบบมากเกินไปโดยไม่ลดความเร็วสัญญาณนาฬิกาอาจทำให้ไมโครคอนโทรลเลอร์เริ่มทำงานผิดปกติ RedBoard, Uno และ Pro Mini 5V ล้วนใช้คริสตัล 16MHz เมื่อดูจากแผ่นข้อมูล 328P เราจะเห็นได้ว่าที่ 3.3V ความถี่สูงสุดที่แนะนำคือประมาณ 13MHz ความสัมพันธ์ระหว่างความเร็วสัญญาณนาฬิกาและแรงดันไฟฟ้าของระบบคือสาเหตุที่ 3.3V Pro Mini ของเราจึงใช้สัญญาณนาฬิกา 8MHz แทนที่จะเป็น 16MHz

หมายเหตุ: โปรดทราบว่าบางครั้งฉันจะรัน ATmega328P ที่ความถี่ 16MHz ในขณะที่ใช้พลังงาน 3.3V และไม่มีปัญหาใดๆ แต่ผลลัพธ์ของคุณอาจแตกต่างกันไป เราขอแนะนำว่าคุณไม่ควรใช้ไมโครคอนโทรลเลอร์นอกเหนือจากข้อกำหนดที่ระบุไว้ในแผ่นข้อมูล

ด้านล่างนี้ฉันได้สร้างกราฟที่แสดงให้เห็นว่าเพียงลดแรงดันไฟฟ้าก็สามารถลดการใช้พลังงานของ Arduino ได้อย่างมาก สำหรับการทดสอบของฉัน ฉันได้อัปโหลดภาพร่างเปล่าไปยัง 328P ที่ทำงานที่ความถี่ 1MHz

ลดความเร็วสัญญาณนาฬิกา

สำหรับโครงการที่ Arduino ไม่จำเป็นต้องดำเนินการคำสั่งจำนวนมากในช่วงเวลาสั้นๆ หรือสำหรับโครงการที่เวลาไม่ใช่ปัญหา การลดความเร็วสัญญาณนาฬิกาของไมโครคอนโทรลเลอร์จะสามารถลดกระแสไฟฟ้าจ่ายได้ไม่กี่มิลลิแอมป์ ตัวอย่างเช่น การรัน Arduino ที่ 5V และลดความเร็วสัญญาณนาฬิกาจาก 16MHz เหลือเพียงแค่ 8MHz จะสามารถลดกระแสไฟที่ต้องการจาก 12mA เหลือ ~8.5mA ได้

เพื่อให้เข้าใจความสัมพันธ์ระหว่างความเร็วสัญญาณนาฬิกาและไมโครคอนโทรลเลอร์ได้ดีขึ้น ลองดูแผนภูมิด้านล่างนี้

อย่างที่คุณเห็น การลดความเร็วสัญญาณนาฬิกาสามารถเพิ่มอายุการใช้งานแบตเตอรี่ได้สามเท่า แน่นอนว่า ข้อแลกเปลี่ยนก็คือ คุณจะไม่สามารถดำเนินการคำสั่งต่างๆ ได้มากเท่าที่ต้องการต่อวินาที และสำหรับแอปพลิเคชันบางตัว โซลูชันนี้ก็ไม่ใช่ทางเลือก

ประหยัดพลังงานด้วยซอฟต์แวร์

จนถึงตอนนี้เราได้พูดคุยกันถึงวิธีที่ Arduino ใช้พลังงานน้อยลง แต่เราไม่ได้พูดถึงว่าทำไมมันจึงใช้พลังงานมากขนาดนั้น ภายใน ATmega328P มีชุดวงจรที่ทำงานร่วมกันเพื่อถ่ายโอนงานจากโปรเซสเซอร์ และวงจรแต่ละวงจรเหล่านี้จะใช้พลังงานในปริมาณหนึ่ง ตัวอย่างเช่น ฟังก์ชัน analogWrite() ของ Arduino ไม่ต้องการให้โปรเซสเซอร์สร้างสัญญาณ PWM ด้วยการนับรอบสัญญาณนาฬิกาเอง แทนที่จะทำเช่นนั้น Arduino จะใช้ตัวจับเวลาในตัวตัวใดตัวหนึ่งในการนับรอบสัญญาณนาฬิกาและส่งคำขอขัดจังหวะไปยังโปรเซสเซอร์ จากนั้นโปรเซสเซอร์จะหยุดสิ่งที่กำลังทำอยู่และจัดการการขัดจังหวะโดยการสลับสถานะของพิน การลดภาระงานบางส่วนช่วยให้ไมโครคอนโทรลเลอร์สามารถทำงานหลายอย่างได้ในคราวเดียว วงจรอื่นๆ ที่รวมอยู่ใน ATmega328P ได้แก่:

  • 3 ตัวจับเวลา
  • การตรวจสอบการจับเวลา
  • การตรวจจับไฟฟ้าขัดข้อง
  • แปลงสัญญาณอนาล็อกเป็นสัญญาณดิจิตอล

ส่วนประกอบอิสระแต่ละชิ้นเหล่านี้ต้องใช้พลังงานในการทำงาน และจะยังคงใช้พลังงานต่อไป หากคุณไม่ปิดมันด้วยตนเอง การตรวจจับไฟฟ้าดับจะตรวจสอบแรงดันไฟฟ้าของระบบอย่างจริงจังเพื่อให้แน่ใจว่าแรงดันไฟฟ้าจะไม่ลดลงต่ำกว่าเกณฑ์ หากเป็นเช่นนั้น ตัวควบคุมจะปิดลงจนกว่าแรงดันไฟฟ้าจะสูงเกินเกณฑ์นั้น ตัวแปลงแอนะล็อกเป็นดิจิทัล (ADC) ทำงานตามที่ชื่อบ่งบอก นั่นคือ นำแรงดันไฟฟ้าแอนะล็อก (ซึ่งสามารถเป็นค่าใดก็ได้ตั้งแต่ 0V ถึง VCC) มาแปลงให้เป็นค่าดิจิทัลที่ไมโครคอนโทรลเลอร์สามารถใช้ได้ (0-1023 สำหรับตัวแปลง 10 บิต) หากโครงการของคุณไม่จำเป็นต้องใช้ ADC การปิด ADC จะช่วยลดการใช้พลังงานได้อย่างมาก

ดาวน์โหลดไลบรารีพลังงานต่ำ

ไลบรารีนี้ช่วยให้คุณตั้งเวลาเข้าสู่โหมดสลีปได้ ตั้งแต่ไม่กี่มิลลิวินาทีไปจนถึงไม่จำกัดเวลา นอกจากนี้ยังช่วยให้คุณระบุได้ว่าส่วนใดของไมโครคอนโทรลเลอร์ที่จะปิดใช้งาน ทำให้เป็นไลบรารีที่มีประสิทธิภาพและยืดหยุ่นพอสมควรสำหรับความต้องการพลังงานต่ำของคุณ

ในตัวอย่างแรกนี้ เราจะอัปโหลดภาพร่างด้านล่างนี้ไปยัง Arduino ซึ่งทำงานที่ 5V และ 16MHz เพื่อดูว่าต้องใช้กระแสไฟเท่าใดในโหมดสลีป ฉันใช้ Arduino พื้นฐานโดยใช้ ATmega328P บนแผงทดลองเพื่อลดกระแสไฟที่ฉันใช้

#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);
}

ในภาพร่างนี้ Arduino จะทำให้ LED กะพริบเป็นเวลาสองวินาที จากนั้นจึงปิดเครื่องเป็นเวลาสองวินาที ระหว่างเวลาดังกล่าว ADC และการตรวจจับไฟตก (BOD) จะถูกปิดใช้งาน เมื่อปิดเครื่อง กระแสไฟของ Arduino จะลดลงจาก 14mA เหลือเพียง 6uA! หากเราใช้เคล็ดลับประหยัดพลังงานอื่นๆ ในหัวข้อก่อนหน้านี้ เราก็จะเห็นได้จากตารางด้านล่างนี้ว่าเราสามารถลดกระแสไฟขณะนอนหลับได้ต่ำสุดเท่าไร