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() {}
Odpowiedzi:
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.
źródło
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ś?
źródło
pinMode(P_UNUSED, INPUT_PULLUP);
to nie wystarczy, to WTF?pinMode(3, INPUT_PULLUP);
i to samo dla 4 i 5 nic nie dało.Chciałbym dodać, że w przypadku oddzielnego projektu zadałem to pytanie , a odpowiedź dramatycznie wpłynęła również na to pytanie. wyczyszczenie
ADCSRA
sprowadził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.źródło