ATtiny85 zużycie energii oczekiwane podwójnie


9

Staram się, aby ATTiny85 działał na baterii. Mam taktowanie z kryształu 16,384 MHz, z zestawem bezpieczników dzielonych przez 8. Vcc wynosi 3,3 wolta. Rysunek 22-7 w arkuszu danych mówi, że w trybie bezczynności ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();), powinien on pobierać około 300 µA. Widzę, że rysuje bardziej jak 850 µA. Nie mogę zrozumieć, dlaczego zużycie energii jest dwukrotnie większe. Wyłączyłem wszystko w PRR oprócz timera0, który skonfigurowałem tak, aby przerywał co 25 ms. Powinien więc spędzać większość czasu w stanie bezczynności, co jest najlepsze, co mogę zrobić, biorąc pod uwagę, że nadal chcę, aby liczniki się liczyły.

Bezpieczniki to 0x7f, 0xdf, 0xff.

Oto kod, który działa dla tego testu:

#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
Czy zabiłeś komparator?
Ignacio Vazquez-Abrams,

1
Rzuciłeś okiem na niektóre sztuczki, które zrobił facet od jeelabów? Zobacz tutaj (zacznij czytać na dole): jeelabs.org/tag/lowpower
RJR

1
@RJR Rzuciłem okiem i niestety wiele ich sztuczek nie zadziała, ponieważ mogę używać SLEEP_MODE_IDLE, ponieważ muszę utrzymywać stoper w ruchu. Ta aplikacja to zegar.
nsayer

1
Jeśli jest to zegar, czy mogę zasugerować ucieczkę z wewnętrznego oscylatora i użycie kryształu zegarka na zegarze 2 do uruchomienia przerwania watchdoga? Następnie możesz skorzystać z głębokiego snu. Myślę, że gdzieś tam też jest wpis na blogu jeelabs.
RJR

1
Wszystko, co widzę w Google, sugeruje, że używają zewnętrznego modułu RTC. Jeśli masz RTC, to tak, możesz użyć watchdoga i wewnętrznego oscylatora, ponieważ zegar procesora nie jest ważny. W tym przypadku chcę jednak dokładności kryształu. A także, to jest ATTiny85 - nie ma timera 2, tylko 0 i 1, a timer 1 zużywa rząd wielkości więcej mocy niż timer 0. Nie wiem, jak podłączyć kryształ do ATTiny bez wszelkie dodatkowe elementy zewnętrzne inne niż zegar systemowy.
nsayer

Odpowiedzi:


6

Mówisz, że zgodnie z rysunkiem 22-7 w arkuszu danych powinien on pobierać tylko 300µA, ale ten wykres pokazuje aktualny pobór dla operacji bez podziału zegara. Oscylator kwarcowy działający z częstotliwością 16 MHz z pewnością pobiera więcej prądu niż jeden z częstotliwością 2 MHz, a dzielnik 3-stopniowy doda nieco więcej. Pytanie brzmi - o ile więcej?

Arkusz danych sugeruje również, że prąd jałowy można zmniejszyć, dzieląc zegar, ale to znowu nie mówi o ile zostanie zmniejszony. Ekstrapolacja linii 3,3 V sugeruje, że normalnie pobierałaby ona około 1,5 mA przy 16,4 MHz, a 850 μA to znacząca redukcja - ale czy powinna być mniejsza?

Jeśli nie możesz użyć kryształu o niższej częstotliwości na nadchodzących planszach, być może nic nie możesz zrobić. Jednakże, gdy masz obwód na płycie, możesz przynajmniej wypróbować kryształ 2 MHz, aby sprawdzić, czy to naprawdę jest problem.

wprowadź opis zdjęcia tutaj


Ok. Ugryzę. Pójdę dziś do sklepu, wezmę kryształ 2 MHz i ponownie scalę układ, aby nie było podziału zegara, i sprawdzę go.
nsayer

Inną trudnością jest potrzeba 2 ^ x częstotliwości kryształów. Poszedłem do sklepu i znalazłem 4,096 MHz, ale trudno znaleźć 1.024 i 2.048. Ale niestosowanie zegara 2 ^ x utrudnia wybranie wstępnej skali i wartości OCR0A, która powoduje nawet ułamki sekundy przerwania. Ale jeśli 8,192 MHz podzielone przez 16 oszczędza znaczną moc, z pewnością byłbym zadowolony z tego ponad 16,384 podzielonego przez 32.
nsayer

2
Po zainstalowaniu kryształu 4,096 MHz i wstępnej skali zegara procesora wynoszącej 8, teraz pobiera około 450 µA.
nsayer

kilka lat później, ale dlaczego nie kupić RTC i użyć PPS, mocno spać procesor i budzić się tylko po przerwie.
HilarieAK

3

Miałem podobny problem z tym układem. Pobór mocy był o 30% większy niż oczekiwano.

Problemy były nieużywane GPIO!

Zostały skonfigurowane jako dane wejściowe i pozostawione jako zmiennoprzecinkowe. Brak jasno zdefiniowanego stanu wejściowego spowodował, że sterownik GPIO zużywał znacznie więcej niż podano.

Odpowiedzią było włączenie podciągania lub skonfigurowanie nieużywanych pinów jako wyjść.

Czy jesteś pewien, że piny są ustawione poprawnie? Wydaje się, że w twoim kodzie tak jest, ale czy sprawdziłeś?


Cholera. Jeśli pinMode(P_UNUSED, INPUT_PULLUP);to nie wystarczy, to WTF?
nsayer

Tak, ale czasami to nie wystarcza. Na przykład, możesz mieć piny, które są domyślnie wejściem ADC lub wejściem analogowym, niezależnie od zaprogramowanego kierunku. Tam najpierw musisz wyłączyć funkcję dodatkową. Właśnie to miałem na myśli przez „sprawdzanie”.
Blup1980,

To jest ATTiny85. Jest 6 pinów, ale 3 z nich to RESET i dwa xtal. Dwa z nich to wyjścia, a jeden to P_UNUSED. Cały ADC został wyraźnie wyłączony. Wypróbuję sztuczkę INPUT_PULLUP na pozostałych 3 pinach, ale podejrzewam, że nic to nie zmieni. Istnieje błąd dla Tiny45, który mówi o nie ustawianiu pinów xtal na WYJŚCIE z powodu zużycia energii.
nsayer

Dodawanie pinMode(3, INPUT_PULLUP);i to samo dla 4 i 5 nic nie dało.
nsayer

1

Chciałbym dodać, że w przypadku oddzielnego projektu zadałem to pytanie , a odpowiedź dramatycznie wpłynęła również na to pytanie. wyczyszczenie ADCSRAsprowadziło zużycie na biegu jałowym do tego, co mówi rysunek 22-6 - około 100 µA przy podzielnej częstotliwości taktowania systemu 500 kHz - a to podzielona częstotliwość zegara, a nie częstotliwość kryształu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.