ATtiny85 энергопотребление ожидается в два раза

9

Я пытаюсь заставить ATTiny85 работать от батареи. У меня он работает на частоте 16,384 МГц с установленным предохранителем деления на 8. Vcc составляет 3,3 вольт. На рисунке 22-7 в таблице указано, что при холостом ходу ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();) он должен составлять около 300 мкА. На самом деле, я вижу, что это больше похоже на 850 мкА. Я не могу понять, почему энергопотребление ожидается в два раза. Я отключил все в PRR, кроме timer0, который я настраивал на прерывание каждые 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() {}
nsayer
источник
1
Вы убили компаратор?
Игнасио Васкес-Абрамс
1
Вы взглянули на некоторые уловки, которые сделал парень-джилабс? Смотрите здесь (начните читать внизу): jeelabs.org/tag/lowpower
RJR
1
@RJR Я посмотрел, и, к сожалению, многие из их уловок не сработают, потому что я могу использовать только SLEEP_MODE_IDLE, потому что мне нужно, чтобы таймер работал. Это приложение представляет собой часы.
nsayer
1
Если это часы, могу ли я предложить запустить внутренний генератор и использовать кристалл часов на таймере 2 для срабатывания прерывания сторожевого таймера? Затем вы можете использовать глубокий сон. Я думаю, что где-то там тоже есть пост в блоге на jeelabs.
RJR
1
Все, что я вижу, показывает, что они используют внешний модуль RTC. Если у вас есть RTC, тогда, да, вы можете использовать сторожевой таймер и внутренний генератор, потому что тактовая частота процессора не важна. В этом случае, однако, я хочу точность кристалла. Кроме того, это ATTiny85 - здесь нет таймера 2, только 0 и 1, а таймер 1 потребляет на порядок больше энергии, чем таймер 0. Я не знаю, как подключить кристалл к ATTiny без любые дополнительные внешние компоненты, кроме системных часов.
nsayer

Ответы:

6

Вы говорите, что в соответствии с рисунком 22-7 в техническом описании должно быть только 300 мкА, но этот график показывает текущее потребление для работы без деления часов. Кристаллический генератор, работающий на частоте 16 МГц, должен потреблять больше тока, чем генератор, работающий на частоте 2 МГц, а трехступенчатый делитель добавит немного больше. Вопрос - сколько еще?

Лист данных также предполагает, что ток холостого хода можно уменьшить, поделив тактовую частоту вниз, но опять же не говорится, насколько он будет уменьшен. Экстраполяция линии 3,3 В предполагает, что она обычно потребляет около 1,5 мА на частоте 16,4 МГц, а 850 мкА является значительным снижением, но должно ли оно быть меньше?

Если вы не можете использовать низкочастотный кристалл на досках, которые у вас есть, тогда вы ничего не сможете сделать. Однако, хотя у вас есть схема на макете, вы можете по крайней мере попробовать кристалл 2 МГц, чтобы увидеть, действительно ли это проблема.

введите описание изображения здесь

Брюс Эбботт
источник
Хорошо. Я укушу Я пойду сегодня в магазин, возьму кристалл с частотой 2 МГц, перемонтирую чип на отсутствие деления часов и проверим его.
nsayer
Еще одна сложность заключается в необходимости 2 ^ х кристаллических частот. Я пошел в магазин и нашел 4,096 МГц, но 1,024 и 2,048 трудно найти. Но если не использовать 2 ^ x такта, трудно выбрать предварительную шкалу и значение OCR0A, что приводит к четным долям секундных прерываний. Но если бы 8,192 МГц, разделенное на 16, сэкономило бы значительную мощность, я бы, конечно, был бы рад, если бы 16,384, поделенные на 32,
nsayer
2
С установленным кристаллом 4,096 МГц и значением предварительной шкалы тактовой частоты процессора 8 он теперь потребляет около 450 мкА.
nsayer
несколько лет спустя, но почему бы не купить RTC и не использовать его PPS, не спать процессор и заставить его работать только при прерывании.
HilarieAK
3

У меня была похожая проблема с этим чипом. Потребляемая мощность была на 30% больше, чем ожидалось.

В вопросах был неиспользован GPIO!

Они были настроены как входы и оставлены плавающими. Отсутствие четко определенного состояния ввода действительно заставило драйвер GPIO потреблять намного больше, чем указано.

Ответ состоял в том, чтобы включить подтягивания или настроить неиспользуемые контакты в качестве выходов.

Вы уверены, что контакты установлены правильно? В вашем коде это выглядит так, но вы проверили?

Blup1980
источник
Ну дерьмо. Если pinMode(P_UNUSED, INPUT_PULLUP);не достаточно, тогда WTF?
nsayer
Да, но иногда этого недостаточно. Например, у вас могут быть контакты, которые являются входом АЦП или аналоговым входом по умолчанию, независимо от направления, которое вы программируете. Там сначала нужно отключить вторичную функцию. Вот что я имел в виду под «проверкой».
Blup1980
Это ATTiny85. Есть 6 контактов, но 3 из них - СБРОС и два xtal контакта. Два из них являются выходными, а один - P_UNUSED. Весь АЦП был явно отключен. Я попробую трюк INPUT_PULLUP на других 3 выводах, но я подозреваю, что это ничего не изменит. Для Tiny45 существует ошибка, которая говорит о том, что не нужно устанавливать выходные контакты xtal из-за энергопотребления.
nsayer
Добавление pinMode(3, INPUT_PULLUP);и то же для 4 и 5 ничего не делало.
nsayer
1

Я хотел бы добавить, что для отдельного проекта я задал этот вопрос , и ответ также сильно повлиял на этот вопрос. очистка ADCSRAпривела к тому, что потребление в режиме ожидания снизилось до того, что на рис. 22-6 указано, что оно должно принимать - около 100 мкА при частоте системной тактовой частоты 500 кГц - и это тактовая частота после деления, а не частота кристалла.

nsayer
источник