ฉันจะทำให้ atmega328 ของฉันทำงานเป็นเวลาหนึ่งปีด้วยแบตเตอรี่ได้อย่างไร


51

สถานการณ์

ฉันได้สร้างล็อคประตูอิเล็กทรอนิกส์ที่ดีสำหรับห้องพักหอพักของฉัน ปัจจุบันเป็น Arduino Diecimila ที่มี servo [un] ล็อคประตู มันมีปุ่มกดตัวเลขที่มีปุ่ม 3x4 และ 5 LED (2 ชุดคู่และ LED เดียว) มันยังทำงานบนเครื่องชาร์จโทรศัพท์มือถือ

ตอนนี้ฉันได้ออกแบบใหม่เพื่อให้ทำงานบน Arduino แบบสแตนด์อโลน (ATmega328) แต่ต้องการให้มันทำงานบนแบตเตอรี่ AA หรือแม้กระทั่งแบตเตอรี่ขนาด 9V

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

คำถามที่ 1

เมื่อมีการกดปุ่มในช่วงเวลาไม่กี่มิลลิวินาทีที่บอร์ดหลับจะมีการ "จดจำ" / "ถือ" ไว้จนกว่ามันจะออกจากโหมดสลีปแล้วจะถูกเลือกเป็นการกดปุ่มหรือไม่?

อะไรจะเป็นวิธีที่ดีที่สุดในการจัดการกับการกดปุ่มนี้ในโหมดสลีป ฉันสามารถเขียนโค้ดเพื่อให้ปลุกเมื่อมีการใช้งานปุ่มหรือฉันต้องปล่อยให้โหมดนอนหลับเช่น 10m.s ในทุก ๆ วง?

คำถามที่ 2

ฉันจะเข้าใกล้คณิตศาสตร์ในการคำนวณว่าต้องใช้แบตเตอรี่ AA จำนวนเท่าใดเพื่อเรียกใช้อุปกรณ์นี้เป็นเวลา 10 เดือน

นอกจากนี้ฉันไม่ทราบวิธีการวัดการใช้พลังงานเฉลี่ยต่อนาทีหรืออย่างนั้นเนื่องจากมันสลับอย่างรวดเร็วเป็นต้น

อุปกรณ์

อุปกรณ์ล็อคประตูของฉัน

คำตอบ:


35

Atmega328 มีโหมดประหยัดพลังงานหกโหมดเรียงลำดับจากน้อยไปหามาก (ยอดการใช้ในปัจจุบันโดยประมาณจากโพสต์ฟอรัมนี้ ):

  • 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

การอ้างอิงคำถามเดิม:

ฉันคิดว่าฉันสามารถsleepโทรหาบางครั้งภายในวิธีลูป "

คุณจะต้องใช้sleep_cpu()หลังจากตั้งค่าโหมดสลีปที่คุณต้องการจากรายการด้านบน Arduino สนามเด็กเล่นมีการโพสต์ที่มีประโยชน์เกี่ยวกับเรื่องนี้

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

การประหยัดพลังงานเพิ่มเติมสามารถทำได้ผ่านขั้นตอนต่อไปนี้:

  • ใช้ออสซิลเลเตอร์ภายในของไมโครคอนโทรลเลอร์และอัตราสัญญาณนาฬิกาต่ำ (8MHz แทน 16) - แต่ให้แน่ใจว่ารหัสที่เกี่ยวข้องกับเวลาและเวลายังคงทำงานตามที่คาดไว้ อาจจำเป็นต้องใช้เวอร์ชันอื่นของ bootloader
  • หลีกเลี่ยงการเปิดไฟ LED เป็นเวลานานหากแอปพลิเคชันใช้ การใช้แฟลชคู่อย่างรวดเร็วหรือสองเท่าในช่วงเวลาสั้น ๆ (0.05 วินาทีเปิด, ปิด 0.5 วินาที) โดยมีช่องว่างระหว่างวินาทีทำให้มั่นใจได้ว่ามีข้อบ่งชี้ที่สังเกตเห็นได้ชัดเจนโดยใช้พลังงานน้อยที่สุด
  • ใช้ตัวควบคุมการเปลี่ยนแทนตัวแบบเชิงเส้นหากจำเป็นต้องใช้ตัวควบคุม
  • เรียกใช้ไมโครคอนโทรลเลอร์ที่แรงดันไฟฟ้าต่ำหากรองรับ 3.0 โวลต์ (เช่น CR2032 ลิเธียมเซลล์ไม่จำเป็นต้องมีตัวควบคุม) หรือ 3.3 โวลต์แทน 5 โวลต์
  • ทำตามคำแนะนำในแผ่นข้อมูลสำหรับการตั้งค่าขาเข้าและขาออกที่ไม่ได้ใช้สำหรับการสิ้นเปลืองพลังงานขั้นต่ำ

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

ข้อมูลอ้างอิงที่มีประโยชน์บางประการ:


จากประสบการณ์ของฉันใน SLEEP_MODE_PWR_DOWN คุณสามารถนำมันลงไปที่ 0.1uA ถึง 6.0uA หากคุณฉลาดเกี่ยวกับการปิดทุกสิ่งเล็ก ๆ น้อย ๆ (เช่นการตรวจจับสีน้ำตาล) ฉันได้สร้างงานสร้างที่ใช้น้อยกว่า 60uA ซึ่งใช้เวลานาน 3-5 ปีกับชุดแบตเตอรี่อัลคาไลน์ขนาด AA
Tim Eckel

@ TimEckel ฉันคลั่งไคล้การแสดงสถานะด้วยไฟ LED - นั่นกินงบประมาณพลังงานเหมือนมันหมดสไตล์
Anindo Ghosh

3
มันไม่จำเป็นต้อง ใช้ไฟ LED กำลังสูงที่มีความต้านทานสูง จะใช้เศษส่วนของ mA แทนมากกว่า 20 mA นอกจากนี้ยังแฟลช LED แสดงสถานะเป็นเวลา 5-15 ms ทุกสองสามวินาทีแทนที่จะเปิดอย่างต่อเนื่อง ฉันมี LED แสดงสถานะราคาถูกสลัวที่ใช้ 30 mA ฉันเปลี่ยนเป็น LED พลังงานสูงพร้อมตัวต้านทาน 3.3k Ohm ที่ฉันแฟลชเป็นเวลา 15 มิลลิวินาทีทุกๆ 8 วินาที เปลี่ยนจาก 30 mA เป็น 2.9 uA ของกระแสเฉลี่ย 1/1000 ของกำลัง!
Tim Eckel

4
@TimEckel คุณไม่เข้าใจขอบเขตของความหลงใหลในแสงไฟกะพริบของฉัน :-D ไม่ใช่ว่าฉันต้องการลดความเข้มฉันชอบสิ่งเล็ก ๆ เหล่านี้ที่เปล่งประกายราวกับเปลวไฟแห่งฮาเดส เมื่อทราบอย่างจริงจังมากขึ้น: ฉันรู้ถึงเทคนิคเล็ก ๆ น้อย ๆ เหล่านี้และในความเป็นจริงก็มีบางอย่างของฉันเองซึ่งเพิ่มผลกระทบการเตือนภัยด้วยภาพในขณะที่ลดพลังงานผ่านไฟ LED ความคิดเห็นก่อนหน้านั้น ( เพียงบางส่วน ) โดยสังเขปเพื่อไปกับคำถาม LED ที่สนุกมากมายที่ฉันตอบรอบ ๆ ที่นี่
Anindo Ghosh

3
ฉันวัดการใช้พลังงานของ ATMega328P ที่แรงดันไฟฟ้าและความถี่ที่แตกต่างกันและทำให้แผนภูมินี้docs.google.com/spreadsheets/d/…
Cano64

19

ตอนนี้ฉันมี Arduino Pro Mini บนโต๊ะทำงานซึ่งเพิ่งหมดแบตเตอรี AA 2 ก้อนและสามารถใช้งานได้นานกว่าหนึ่งปีถ้าจำเป็น

มีสามด้านของการออกแบบที่ได้รับสิ่งนี้

1. ควบคุมที่แตกต่างกัน

ฉันใช้เครื่องปรับเพิ่มแรงดัน LTC3525 มันมีกระแสไฟฟ้าต่ำนิ่งมาก (7uA) และมีประสิทธิภาพสูง (> 90% @ 0.2mA) สิ่งที่คล้ายกับบอร์ด sparkfun นี้https://www.sparkfun.com/products/8999ควรทำงานที่คล้ายกัน ตรวจสอบให้แน่ใจว่าได้เชื่อมต่อกับขา 5V บน Arduino ไม่ใช่ VIN เพื่อไม่ให้ใช้ตัวควบคุม Arduino

2. ผู้ดูแล

สัดส่วนเวลาที่อุปกรณ์ใช้งานจะมีขนาดเล็ก สำหรับเวลาที่เหลืออุปกรณ์ควรนอนหลับใน SLEEP_MODE_POWER_DOWN คุณสามารถฐานกิจวัตรนอนหลับของคุณปิดห้องสมุดพลังงานต่ำ Rocketscreem ตามลิงค์นั้นคุณควรจะสามารถลดระดับลงเป็น 1.7uA ด้วย ADC, BOD และ WDT และในโหมดปิดเครื่อง

3. การขัดจังหวะ

อีกครึ่งหนึ่งของการนอนหลับนั้นถูกขัดจังหวะเพื่อปลุกให้ตื่นขึ้น ในโหมดปิดเครื่องขณะนอนหลับระดับการขัดจังหวะในการจับคู่ INT1 และ INT2, TWI เท่านั้นและ WDT จะปลุกให้ทำงาน ดังนั้นคุณต้องมีปุ่มเชื่อมต่อกับทั้ง INT1 หรือ INT2 เพื่อให้การกดปุ่มนั้นจะปลุก

อย่างอื่น:

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

แก้ไข:

วิธีการหนึ่งที่อาจใช้งานได้คือการใช้ไลบรารี่ Low Power ข้างต้นและสลีปเป็นเวลา 60ms ทุกลูปด้วยตัวจับเวลาจ้องจับผิด เมื่อตื่นขึ้นตรวจสอบการกดปุ่ม ฟังก์ชั่นการโทรจะเป็น

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

14

ความคิดเห็นทั้งหมดเหล่านี้เป็นจุดที่ ฉันต้องการเพิ่มข้อเสนอแนะอีกสองสามข้อ:

1) สำหรับไฟ LED ให้ใช้ไฟเอาต์พุตสูง 20 mA นี่คือตรรกะ ให้บอกว่าคุณต้องการไฟ LED แสดงสถานะสลัวที่กะพริบทุก 8 วินาที คุณไม่ต้องการให้มันสว่างดังนั้นคุณใช้ LED สุ่มบางอัน ปัญหาคือสลัว LED ยังคงใช้ 20 mA (หรือมากกว่า) เพื่อส่งออกเพียง 100 mcd ให้รับ LED ที่มีเอาต์พุตสูงซึ่งยังคงให้คะแนนอยู่ที่ 20 mA แต่สามารถส่งสัญญาณออกได้ 4000 mcd (ดูให้แน่ใจว่าคุณมองมุมเอาท์พุทแล้ว ด้วย LED 4000 mcd นี้คุณสามารถเชื่อมต่อกับตัวต้านทาน 3.3 k ohm และรับแสงประมาณ 100 mcd แต่ใช้น้อยกว่า 1 mA ดังนั้นแทนที่จะใช้ 20 mA สำหรับ LED แสดงสถานะคุณกำลังใช้เศษส่วนของ mA เดียว ฉันมักจะตั้งค่าสถานะไฟแฟลช LED ตรงเวลาเพียง 5-15 มิลลิวินาทีซึ่งสามารถประหยัดพลังงานได้มากหากคุณเคยใช้งานแฟลชในเวลา 100 มิลลิวินาที

2) ตัวควบคุมแรงดันไฟฟ้าที่ฉันเลือกคือ Microchip MCP1700 ใช้กระแสไฟฟ้าเพียง 1.6 µA นิ่งและราคาถูกสุด ๆ (ประมาณ $ 0.30 ในปริมาณเล็กน้อย) ข้อ จำกัด เพียงอย่างเดียวคือแรงดันไฟฟ้าขาเข้าสูงสุดคือ 6 โวลต์ดังนั้นคุณจึงไม่สามารถใช้แบตเตอรี่ 9 โวลต์ได้ แต่มันสมบูรณ์แบบสำหรับแบตเตอรี่ขนาด AA 4 ก้อนเซลล์ LiPo เซลล์เดียวหรือเซลล์เหรียญลิเธียมสองก้อน

3) สำหรับจ่ายไฟให้กับวงจร ATmega ที่มีแบตเตอรี่ขนาด AA 4 ก้อนโดยทั่วไปฉันใช้ไดโอด 1N4001 บน VCC เพื่อลดแรงดันไฟฟ้าสูงสุด 6 โวลต์ของแบตเตอรี่ 4 ก้อนเป็น 5.5 โวลต์ นอกจากนี้ไดโอดยังป้องกัน ATmega จากแรงดันย้อนกลับดังนั้นจึงมีวัตถุประสงค์ที่เป็นประโยชน์สองประการ การทำเช่นนี้ฉันสามารถสร้างวงจรขับเคลื่อนแบตเตอรี่ที่สามารถใช้งานได้เพียง 0.1 µA ขณะนอนหลับเนื่องจากไม่มีตัวควบคุมแรงดันไฟฟ้าที่กินกระแสไฟฟ้าอยู่ตลอดเวลา


8

ฉันทำการทดสอบatmega328P-PU ที่เปลือยเปล่าบน breadboard โดยใช้ห้องสมุด RocketScream LowPower

ใช้ร่างนี้:

#include "LowPower.h"

void setup(){}

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

ด้วยทอง uCurrentฉันวัด 7.25 uA เมื่ออยู่ในโหมดปิดเครื่อง


1
ดี! ฉันจะลองโดยเร็วที่สุด อนุญาตให้เรียกใช้ atmega238 เป็นเวลาหลายปีด้วยแบตเตอรี่ CR2032 หรือไม่
Basj

6

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

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

วิธีที่คุณคำนวณเวลาทำงานสูงสุดตามทฤษฎีสำหรับโหลดก็คือความจุหารด้วยโหลด หากโหลดของคุณคือ 1mA คุณสามารถเรียกใช้เป็น 3400/1 = 3400 ชั่วโมง = 141 วัน = ~ 5 เดือน อย่างไรก็ตามนี่เป็นเพียงค่าสูงสุดทางทฤษฎีเนื่องจากคุณจะเริ่มได้รับแรงดันไฟฟ้าที่สำคัญลดลงประมาณ 65% ในเวลานั้น หากคุณกำลังควบคุมเอาท์พุทคุณจะได้รับเอฟเฟกต์การหลบหนีโดยที่แรงดันไฟฟ้าของแบตเตอรี่ต่ำลงกระแสไฟฟ้าที่สูงขึ้นที่จำเป็นในการรักษาแรงดันไฟฟ้าควบคุมซึ่งจะทำให้แบตเตอรี่หมดเร็วขึ้น ฉันจะแปลกใจถ้าคุณสามารถรับความจุโฆษณาได้มากกว่า 80% ด้วยแรงดันไฟฟ้าสูงพอที่จะเรียกใช้อุปกรณ์ของคุณ

สมมติว่าคุณได้รับ 80% ของเวลานั้นหลังจากการปล่อยแรงดันและความไร้ประสิทธิภาพของตัวควบคุม เราจะสมมติว่าคุณทำงานที่ 3.3 โวลต์จากแบตเตอรี่สามก้อนเป็นชุด สิ่งนี้จะยังคงให้ความจุเท่าเดิม แต่แรงดันไฟฟ้าจะเพียงพอสำหรับตัวควบคุม หากอุปกรณ์ของคุณทำงานที่ 15mA (เป็นการประมาณการที่ค่อนข้างอนุรักษ์นิยม) ตัวเลขจะมีลักษณะดังนี้:

  • ความจุหลังจากประสิทธิภาพ 80% = 3400 * 0.8 = 2720mAh
  • เวลา = 2720/15 = 181 ชั่วโมง = 7.54 วัน

ดังนั้นคุณต้องใช้แบตเตอรี่ลิเธียมประมาณ 144 ชุด (48 ชุดจาก 3) เพื่อใช้งานเป็นเวลาหนึ่งปี ไม่ค่อยดี!

ฉันขอแนะนำให้ใช้แหล่งจ่ายไฟกระแสตรงที่มีการควบคุมจากแหล่งจ่ายไฟหลักแทน สามารถสำรองแบตเตอรี่ได้ซึ่งง่ายต่อการติดตั้งด้วยรีเลย์ SPDT เพียงต่อขดลวดเข้ากับแหล่งจ่ายไฟหลักและมีหน้าสัมผัส "ปิด" เชื่อมต่อกับแบตเตอรี่ เมื่อ DC ล้มเหลวหน้าสัมผัสจะลดลงและใช้แบตเตอรี่แทน


ความฝันไร้สายของฉันถูกบดขยี้;) ขอบคุณสำหรับคำตอบอย่างละเอียด นี่ดูเหมือนจะเป็นตัวเลือกที่ดีที่สุดสำหรับฉันเช่นกัน
LouwHopley

บังเอิญนี้เป็นคำถามเดียวกันกับที่ฉันโพสต์ตัวเองเมื่อออกแบบล็อคประตูอิเล็กทรอนิกส์ แม้จะใช้แบตเตอรี่แบบชาร์จได้ขนาด 10,000mAh ก็ยังไม่คุ้ม จบลงด้วยการใช้เพียงอะแดปเตอร์ 250mA DC และแบตเตอรี่โทรศัพท์มือถือเก่าเป็นตัวสำรอง
พหุนาม

4
ค่าเฉลี่ย 15 mA ฟังดูไม่ค่อยดีนักสำหรับฉัน! 328 สามารถทำงานที่ไมโครตัวเลขตัวเดียวในโหมดสลีปและแน่นอนว่าคุณสามารถหนีไปได้ด้วยการนอนหลับอย่างน้อยกึ่งลึกในหลายครั้ง นอกจากนี้ที่ความถี่ต่ำ (เช่น 0.5 MHz) คุณสามารถเข้าถึงได้ด้วย <1 mA ในโหมดแอคทีฟ แน่นอนว่าต้องมีการเลือกส่วนประกอบอื่น ๆ (ตัวควบคุมแรงดันไฟฟ้า) เพื่อให้เหมาะสมกับลักษณะการใช้พลังงานต่ำ
exscape

4
@ Polynomial ฉันไม่ได้มองแผนผังอย่างใกล้ชิด แต่แน่นอนว่าโครงการสามารถสร้างได้โดยไม่ต้องใช้ "ไฟ LED" หรือคุณสามารถกระพริบตาเพื่อที่จะเปิดเช่นที่ครึ่งความสว่าง (ผ่าน PWM) เพียงพูด 25 มิลลิวินาทีทุก 2 วินาทีเพื่อให้การใช้งานในปัจจุบันจะลดลงถึงเฉลี่ย 0.09 mA แทน 15
exscape

1
Arduino กำลังหิว การสร้างบอร์ดของคุณเองจะแก้ปัญหานี้ Atmega328 ดึง 0.2 mA เมื่อ 32kH และ 0.75 uA ที่โหมดประหยัดพลังงาน
Vorac

4

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

FET ที่มีเกตควบคุมโดยเข็ม I / O จาก arduino เป็นวิธีที่ดีในการทำเช่นนั้น


ฉันมักจะใช้ 2N3904 สำหรับเซ็นเซอร์แต่ละตัวหรืออะไรก็ตามที่เปิด / ปิด หรือถ้าเซ็นเซอร์ใช้พลังงานต่ำและแรงดันไฟฟ้าเดียวกับที่ฉันเรียกใช้ ATmega ฉันเพียงแค่ใช้หมุดโดยตรงเพื่อควบคุมสถานะพลังงาน
ทิม Eckel

1
ใช้ 2n7000 เพื่อใช้พลังงานน้อยกว่า 2n3904 อย่างมากและคุณไม่ต้องการตัวต้านทานพื้นฐาน
John Meacham

3

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

สิ่งที่นับได้คือค่าใช้จ่ายเท่าใดจากการนอนหลับลึกที่สุดเพื่อจัดการกับการขัดจังหวะที่เร็วที่สุดเท่าที่จะเป็นไปได้ (เพราะพลังระเบิดจะสั้นมากแล้ว) และกลับไปนอนอีกครั้ง

ตัวอย่างหนึ่งของตัวควบคุมขนาดเล็กคือMSP430จาก Texas Instruments ในเว็บไซต์ของพวกเขาคุณจะพบบันทึกการใช้งานวิธีการอนุรักษ์พลังงานและการประยุกต์ใช้พลังงานจากการเก็บเกี่ยว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.