ATtiny85 güç tüketimi iki kat bekleniyor


9

Pili bitirmek için ATTiny85 almaya çalışıyorum. 16.384 MHz'lik bir kristalden saatte 8'e bölünmüş sigorta seti ile çalıştım. Vcc 3.3 volttur. Veri sayfasındaki Şekil 22-7, boşta ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();), yaklaşık 300 uA çekmesi gerektiğini söylüyor . Aslında, 850 µA gibi daha fazla çizim yaptığını görüyorum. Güç tüketiminin neden iki kat beklendiğini anlayamıyorum. 25 ms'de bir kesmek için yapılandırdığım timer0 dışında PRR'deki her şeyi kapattım. Bu yüzden zamanının büyük çoğunluğunu hala zamanlayıcıların sayılmasını istediğim göz önüne alındığında yapabileceğim en iyi şey boşta durumda geçirmelidir.

Sigortalar 0x7f, 0xdf, 0xff'dir.

İşte bu test için çalıştırdığı kod:

#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
Karşılaştırıcıyı öldürdün mü?
Ignacio Vazquez-Abrams

1
Jeelabs'ýn yaptığı hilelere bir baktýn mý? Buraya bakınız (en altta okumaya başlayın): jeelabs.org/tag/lowpower
RJR

1
@RJR Bir göz attım ve maalesef bir sürü hilesi çalışmayacak çünkü zamanlayıcıyı çalıştırmaya devam etmem gerektiğinden sadece SLEEP_MODE_IDLE kullanabilirim. Bu uygulama bir saattir.
nsayer

1
Bu bir saatse, dahili osilatörün çalışmasını ve bekçi köpeği kesintisini ateşlemek için zamanlayıcı 2'de bir saat kristalinin kullanılmasını önerebilir miyim? Daha sonra derin uyku kullanabilirsiniz. Ben de bu konuda bir jeelabs blog yazısı var sanırım.
RJR

1
Gördüğüm tüm googling harici bir RTC modülü kullandıklarını gösteriyor. Eğer bir RTC'niz varsa, evet, bekçi köpeği ve dahili osilatörü kullanabilirsiniz, çünkü CPU saati önemli değildir. Ancak bu durumda kristalin doğruluğunu istiyorum. Ve ayrıca, bu bir ATTiny85 - zamanlayıcı 2, sadece 0 ve 1 yok ve zamanlayıcı 1, zamanlayıcı 0'dan daha fazla güç harcar. Bir kristali ATTiny'ye nasıl bağlayacağınızı bilmiyorum sistem saati dışındaki ekstra harici bileşenler.
nsayer

Yanıtlar:


6

Veri sayfasındaki Şekil 22-7'ye göre bunun sadece 300µA çizmesi gerektiğini söylüyorsunuz, ancak bu grafik saat bölümü olmadan operasyon için geçerli çekimi gösteriyor . 16MHz'de çalışan bir kristal osilatör, 2MHz'de çalışandan daha fazla akım çekmeye bağlıdır ve 3 aşamalı bölücü biraz daha ekleyecektir. Soru - daha ne kadar ?

Veri sayfası ayrıca boşta akımın saati bölerek azaltılabileceğini, ancak yine de ne kadar azaltılacağını söylemez . 3.3V hattının ekstrapolasyonu, normalde 16.4MHz'de yaklaşık 1.5mA çekeceğini ve 850µA'nın önemli bir azalma olduğunu göstermektedir - ancak daha az mı olmalıdır?

Geldiğiniz kartlarda daha düşük frekanslı bir kristal kullanamıyorsanız, yapabileceğiniz hiçbir şey olmayabilir. Ancak, devre üzerinde bir devre tahtasındayken, sorunun gerçekten olup olmadığını görmek için en azından 2MHz bir kristal deneyebilirsiniz.

resim açıklamasını buraya girin


Tamam. Isıracağım. Bugün mağazaya gideceğim ve 2 MHz'lik bir kristal alacağım ve saati bölmek için çipi tekrar birleştireceğim ve kontrol edeceğim.
nsayer

Diğer bir zorluk, 2 ^ x kristal frekansına duyulan ihtiyaçtır. Mağazaya gittim ve 4.096 MHz'lik bir tane buldum, ancak 1.024 ve 2.048'i bulmak zor. Ancak 2 ^ x saat kullanmamak, ikinci bir kesintinin kesirleri ile sonuçlanan bir reçete ve OCR0A değeri seçmeyi zorlaştırır. Ancak, 8.192 MHz 16'ya bölündüğünde önemli bir güç tasarrufu sağlarsa, 16.384'ün üzerinde 32'ye bölünmesinden kesinlikle memnun olurum.
nsayer

2
4.096 MHz'lik bir kristal ve 8 CPU saat değeri ile şimdi 450 µA çekiyor.
nsayer

Birkaç yıl geç, ama neden bir RTC almıyor ve PPS kullanmıyor, işlemciyi zor uyuyor ve sadece kesinti ile uyanıyor.
HilarieAK

3

O çipte de benzer bir sorun yaşadım. Güç tüketimi beklenenden% 30 daha fazlaydı.

Sorunlar GPIO kullanılmadı!

Giriş olarak yapılandırılmış ve solda kayar. Açık tanımlı bir giriş durumunun olmaması, GPIO sürücüsünün belirtilenden çok daha fazla tüketmesine neden oldu.

Cevap, pull-up'ları etkinleştirmek veya kullanılmayan pinleri çıkış olarak yapılandırmaktı.

Pimlerin doğru ayarlandığından emin misiniz? Kodunuzda öyle görünüyor, ama kontrol ettiniz mi?


Kahretsin. Eğer pinMode(P_UNUSED, INPUT_PULLUP);o zaman, yeterince WTF değil mi?
nsayer

Evet, ama bazen bu yeterli olmaz. Örneğin, programladığınız yöne bakılmaksızın varsayılan olarak ADC girişi veya analog giriş olan pinleriniz olabilir. Orada, önce ikincil işlevi devre dışı bırakmanız gerekir. "Kontrol ederek" demek istediğim buydu.
Blup1980

Bu bir ATTiny85. 6 pim vardır, ancak 3 tanesi RESET ve iki xtal pimdir. Bunlardan ikisi çıktı, biri P_UNUSED. ADC'nin tamamı açıkça kapatılmıştır. Diğer 3 pimdeki INPUT_PULLUP hilesini deneyeceğim, ancak hiçbir şey değiştirmeyeceğinden şüpheleniyorum. Tiny45 için, güç tüketimi nedeniyle xtal pinleri OUTPUT'a ayarlamamaktan söz eden bir hata var.
nsayer

pinMode(3, INPUT_PULLUP);4 ve 5 için aynı ekleme ve hiçbir şey yapmadı.
nsayer

2

Bunu ayrı bir proje için eklemek istiyorum, bu soruyu sordum ve cevap bu soruyu da önemli ölçüde etkiledi. temizleme ADCSRA, atıl tüketimi, şekil 22-6'nın 500 kHz bölünmüş sistem saat hızında yaklaşık 100 µA alması gerektiğini söylediği şeye indirdi ve bu kristal frekansı değil, bölünmüş saat frekansı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.