การใช้พลังงาน ATtiny85 คาดว่าจะเป็นสองเท่า


9

ฉันกำลังพยายามใช้ ATTiny85 เพื่อให้แบตเตอรี่หมด ฉันได้โอเวอร์คล็อกจากคริสตัล 16.384 MHz ด้วยชุดฟิวส์หารด้วย 8 Vcc คือ 3.3 โวลต์ รูปที่ 22-7 ในแผ่นข้อมูลบอกว่าที่ idle ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();) ควรวาดประมาณ 300 µA ในความเป็นจริงฉันเห็นมันวาดขึ้นเช่น 850 µA ฉันไม่สามารถเข้าใจได้ว่าทำไมการใช้พลังงานจึงเป็นสองเท่า ฉันได้ปิดทุกอย่างใน PRR ยกเว้นตัวจับเวลา 0 ซึ่งฉันได้กำหนดค่าให้ขัดจังหวะทุก ๆ 25 มิลลิวินาที ดังนั้นจึงควรใช้เวลาส่วนใหญ่ในสถานะว่างซึ่งเป็นสิ่งที่ดีที่สุดที่ฉันสามารถทำได้เนื่องจากฉันยังต้องการให้ตัวนับนับ

ฟิวส์คือ 0x7f, 0xdf, 0xff

นี่คือรหัสที่ใช้สำหรับการทดสอบนี้:

#include <Arduino.h>
#include <EEPROM.h>
#include <avr/sleep.h>
#include <avr/power.h>

#define P0 0
#define P1 1
#define P_UNUSED 2

ISR(TIMER0_COMPA_vect) {
  // do nothing - just wake up
}

void setup() {
  power_adc_disable();
  power_usi_disable();
  power_timer1_disable();
  //PRR = _BV(PRADC) | _BV(PRTIM1) | _BV(PRUSI); // everything off but timer 0.
  TCCR0A = _BV(WGM01); // mode 2 - CTC
  TCCR0B = _BV(CS02) | _BV(CS00); // prescale = 1024
  // xtal freq = 16.384 MHz.
  // CPU freq = 16.384 MHz / 8 = 2.048 MHz
  // count freq = 2.048 MHz / 1024 = 2000 Hz
  OCR0A = 50; // 25 msec per irq
  TIMSK = _BV(OCIE0A); // OCR0A interrupt only.

  set_sleep_mode(SLEEP_MODE_IDLE);

  pinMode(P_UNUSED, INPUT_PULLUP);
  pinMode(P0, OUTPUT);
  pinMode(P1, OUTPUT);
  digitalWrite(P0, LOW);
  digitalWrite(P1, LOW);

  while(1) { sleep_mode(); }
}
void loop() {}

1
คุณฆ่าตัวเปรียบเทียบหรือไม่
Ignacio Vazquez-Abrams

1
คุณได้ดูเทคนิคบางอย่างที่คน jeelabs ทำหรือไม่? ดูที่นี่ (เริ่มอ่านที่ด้านล่าง): jeelabs.org/tag/lowpower
RJR

1
@RJR ฉันลองดูและน่าเสียดายที่กลอุบายของพวกเขาจำนวนมากไม่สามารถทำงานได้เพราะฉันสามารถใช้ SLEEP_MODE_IDLE ได้เท่านั้นเพราะฉันต้องการให้ตัวจับเวลาทำงานต่อไป แอปพลิเคชั่นนี้เป็นนาฬิกา
nsayer

1
หากเป็นนาฬิกาฉันสามารถแนะนำให้ปิดออสซิลเลเตอร์ภายในและใช้นาฬิกาคริสตัลบนตัวจับเวลา 2 เพื่อไล่จ้องจับผิดสุนัขเฝ้าบ้านหรือไม่? จากนั้นคุณสามารถใช้การนอนหลับสนิท ฉันคิดว่ามี jeelabs บล็อกโพสต์เกี่ยวกับที่เช่นกัน
RJR

1
googling ทั้งหมดที่ฉันเห็นแสดงให้เห็นว่าพวกเขากำลังใช้โมดูล RTC ภายนอก หากคุณมี RTC คุณสามารถใช้ watchdog และ oscillator ภายในได้เพราะนาฬิกา CPU ไม่สำคัญ ในกรณีนี้ฉันต้องการความแม่นยำของคริสตัล และนี่คือ ATTiny85 - ไม่มีตัวจับเวลา 2 เพียงแค่ 0 และ 1 และตัวจับเวลา 1 ใช้ลำดับความสำคัญมากกว่าพลังงานตัวจับเวลา 0 ฉันไม่รู้ว่าคุณจะติดคริสตัลถึง ATTiny ได้อย่างไรโดยไม่ คอมโพเนนต์ภายนอกเพิ่มเติมใด ๆ นอกเหนือจากเป็นนาฬิกาของระบบ
nsayer

คำตอบ:


6

คุณบอกว่าตามรูปที่ 22-7 ในแผ่นข้อมูลมันควรวาด 300µA เท่านั้น แต่กราฟนั้นแสดงการวาดปัจจุบันสำหรับการทำงานโดยไม่มีการแบ่งนาฬิกา คริสตัลออสซิลเลเตอร์ที่ทำงานที่ 16MHz ถูกผูกไว้เพื่อดึงกระแสมากกว่าหนึ่งที่ทำงานที่ 2MHz และตัวแบ่ง 3 ระดับจะเพิ่มขึ้นอีกเล็กน้อย คำถามคือ - มีอะไรอีกมาก

แผ่นข้อมูลยังแสดงให้เห็นว่าสามารถลดการใช้งานปัจจุบันโดยการแบ่งนาฬิกาลง แต่อีกครั้งมันไม่ได้บอกว่ามันจะลดลงเท่าใด การประมาณเส้น 3.3V แสดงให้เห็นว่าปกติแล้วมันจะวาดประมาณ 1.5mA ที่ 16.4MHz และ 850µA ลดลงอย่างมีนัยสำคัญ - แต่ควรน้อยกว่านี้ไหม?

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

ป้อนคำอธิบายรูปภาพที่นี่


ตกลง. ฉันจะกัด ฉันจะไปที่ร้านวันนี้และรับผลึก 2 MHz และหลอมรวมชิปใหม่โดยไม่มีการแบ่งนาฬิกาและตรวจสอบ
nsayer

ปัญหาอีกประการหนึ่งคือความต้องการความถี่คริสตัล 2 ^ x ฉันไปที่ร้านแล้วพบหนึ่ง 4.096 MHz แต่ 1.024 และ 2.048 หายาก แต่การไม่ใช้นาฬิกา 2 ^ x ทำให้เป็นการยากที่จะเลือกค่า prescale และ OCR0A ที่ส่งผลให้เกิดการขัดจังหวะแม้แต่วินาทีของการขัดจังหวะครั้งที่สอง แต่ถ้า 8.192 MHz หารด้วย 16 จะช่วยประหยัดพลังงานได้อย่างมีนัยสำคัญแน่นอนว่าฉันจะมีความสุขมากกว่านั้นด้วย 16.384 หารด้วย 32
nsayer

2
ด้วยคริสตัล 4.096 MHz ในสถานที่และค่า CPU clock prescale เท่ากับ 8 ตอนนี้จะดึงรอบ 450 µA
nsayer

ไม่กี่ปีที่ผ่านมา แต่ทำไมไม่ซื้อ RTC และใช้มันเป็น PPS ตัวประมวลผลที่หลับยากและมีเพียงการขัดจังหวะเท่านั้น
HilarieAK

3

ฉันมีปัญหาคล้ายกันกับชิปนั้น การใช้พลังงานมากกว่าที่คาดไว้ 30%

ปัญหาไม่ได้ใช้ GPIO!

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

คำตอบคือการเปิดใช้งาน pull-ups หรือกำหนดค่าพินที่ไม่ได้ใช้เป็นเอาต์พุต

คุณแน่ใจหรือไม่ว่าตั้งพินถูกต้อง? ดูเหมือนว่าในรหัสของคุณ แต่คุณได้ตรวจสอบ?


อึ ถ้าpinMode(P_UNUSED, INPUT_PULLUP);ยังไม่พอ WTF?
nsayer

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

นี่คือ ATTiny85 มีหมุด 6 อัน แต่มี 3 อันคือ RESET และหมุด xtal สองอัน สองรายการเป็นเอาต์พุตและอีกหนึ่งคือ P_UNUSED ADC ทั้งหมดได้รับการขับเคลื่อนอย่างชัดเจน ฉันจะลองใช้เคล็ดลับ INPUT_PULLUP บนอีก 3 พิน แต่ฉันคิดว่ามันจะไม่เปลี่ยนแปลงอะไรเลย มีข้อผิดพลาดสำหรับ Tiny45 ที่พูดถึงการไม่ตั้งค่าหมุด xtal เป็น OUTPUT เนื่องจากการใช้พลังงาน
nsayer

การเพิ่มpinMode(3, INPUT_PULLUP);และเหมือนกันสำหรับ 4 และ 5 ไม่ได้ทำอะไรเลย
nsayer

1

ฉันต้องการเพิ่มเรื่องนั้นสำหรับโครงการแยกต่างหากฉันถามคำถามนี้และคำตอบก็มีผลกระทบกับคำถามนี้เช่นกัน การล้างADCSRAนำการบริโภคที่ไม่ได้ใช้งานมาสู่รูปที่ 22-6 บอกว่าควรใช้ประมาณ 100 µA ที่อัตรานาฬิการะบบที่แบ่ง 500 kHz - และนั่นคือความถี่สัญญาณนาฬิกาที่ถูกโพสต์หารไม่ใช่ความถี่คริสตัล

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