เมื่อพูดถึงอุปกรณ์อิเล็กทรอนิกส์พกพา คุณสมบัติที่สำคัญที่สุดประการหนึ่งคือการยืดอายุการใช้งานแบตเตอรี่
เมื่อพูดถึงอุปกรณ์อิเล็กทรอนิกส์พกพา คุณสมบัติที่สำคัญที่สุดประการหนึ่งคือการยืดอายุการใช้งานแบตเตอรี่ 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 ได้แก่:
ส่วนประกอบอิสระแต่ละชิ้นเหล่านี้ต้องใช้พลังงานในการทำงาน และจะยังคงใช้พลังงานต่อไป หากคุณไม่ปิดมันด้วยตนเอง การตรวจจับไฟฟ้าดับจะตรวจสอบแรงดันไฟฟ้าของระบบอย่างจริงจังเพื่อให้แน่ใจว่าแรงดันไฟฟ้าจะไม่ลดลงต่ำกว่าเกณฑ์ หากเป็นเช่นนั้น ตัวควบคุมจะปิดลงจนกว่าแรงดันไฟฟ้าจะสูงเกินเกณฑ์นั้น ตัวแปลงแอนะล็อกเป็นดิจิทัล (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! หากเราใช้เคล็ดลับประหยัดพลังงานอื่นๆ ในหัวข้อก่อนหน้านี้ เราก็จะเห็นได้จากตารางด้านล่างนี้ว่าเราสามารถลดกระแสไฟขณะนอนหลับได้ต่ำสุดเท่าไร