Высокое потребление тока ATmega328p

Тема в разделе "Микроконтроллеры AVR", создана пользователем vi.k, 7 мар 2015.

  1. vi.k

    vi.k Нуб

    Столкнулся со странной проблемой. В наличии несколько xduino Uno. Все с Китая. Делаю проект, где важна экономия (термодатчик и радиоканал). Ожидаю потребление меньше 1 мА в режиме ожидания (опрос каждые 8 секунд, в остальное время POWERDOWN и WATCHDOG). С Nano довёл до 6.7 мА в режиме сна (около 3 мА берёт светодиод POW). Дошёл, наконец, до замены Nano ATmeg'ой на внутреннем кварце, ожидая увидеть суперезультаты. Но попал впросак - 80 мА в режиме сна на пяти вольтах питания! Дальше интересней - при 4.5 В питания потребление резко падает до 60 мА. А вот при 3 В получаем то, что и требовалось. (Правда озвучить точный результат не могу - оба имеющихся в наличии мультиметра начинают одинаково глючить - в режиме 20 мА показывают 0.01, а в режиме 2000 мкА показывают 1200. Уж как-то сильно отличаются данные?! Видимо, сильное влияние самого мультиметра? Предполагаю, что второй вариант более правдоподобен, т.е. 1.2 мА.)

    Замерял также отдельно в составе Uno (питание к Vin и Gnd) - там показывает при тех же условиях 30 мА! А вот другая дешёвая китайская xduino Uno, где чип НЕ в DIP-корпусе, с тем же скетчем показывает как и Nano - около 6 мА.

    Все замеры делал и без какой-либо обвязки, и в готовом проекте - результат одинаков.

    Но что может быть за прикол на 5 вольтах? Китайская подделка ATmega328p? Или какая-то неучтённая мной особенность?

    Скетч для тестов простой. Может из тех, кто уверен в оригинальности своей Arduino или ATmeg'и проверит?

    Код (Text):
    #include "LowPower.h"

    boolean led = false;

    void setup()
    {
      pinMode(13, OUTPUT);
    }

    void loop()
    {
      digitalWrite(13, led ? HIGH : LOW);
      led = !led;

      LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF);
    }
     
    Спасибо!
     
  2. altex

    altex Гик

    А вы как питаете устройство?
    Чтобы получить максимум экономии нужно питать через +5В и GND, но с UNO даже в этом случае ещё будет впустую сливаться энергия на стабилизатор +3.3В.
     
  3. vi.k

    vi.k Нуб

    Ну, оптимизироать Uno по энергозатратам мне даже не приходило в голову. Это как-то жестоко всё-таки. Даже Nano у меня тут только в качестве тестов.

    Мне нужная чистая ATmega. С ней одной голой и проблема. А вот как раз, когда ATmega стоит внутри Uno, амперметр показывает 30 мА, питаясь от 9В. А когда стоит отдельно, без какой-либо обвязки, выдаёт 80 мА, питаясь от 5В (AVCC и GND). С моей точки зрения это какой-то бред. Т.е. винить Uno тут как раз не приходится. Но может я где-то чего-то не понимаю и не учитываю? Мне надо как-то решить проблему, потому что в проекте я собирался питать от одной батарейки АА через повышающий преобразователь на 5В, либо от трёх АА напрямую (рабочий диапазон устройства - 3.0-5.5В). А такой расклад по затратам портит всю картину. Это всего на пару дней работы устройства. Жду ещё партию ATmega328 - проверю на них. Хотя они тоже с Китая. Адекватного теста не получится. Ну а пока буду ориентироваться на 3В (от кроны через понижающий преобразователь). Просто крона мне совсем не нравится - и запас энергии небольшой, и в наших краях они могут спокойно исчезнуть из магазинов (деревня вдали от цивилизации).

    Надо ещё потестить. Никак в голове не умещается - что здесь не так?

    Ну а кто-нибудь может просто свою итальянскую Arduino Uno потестить амперметром на этом скетче? Сколько покажет?
     
  4. altex

    altex Гик

    с выключенным светодиодом 30.3мА
    со включеным светодиодом 32.5мА
     
  5. altex

    altex Гик

    Я всё равно не понял, как вы питали atmega. Я бы на вашем месте попробовал запитать atmega от 3 батареек (или 4 аккумуляторов) формата АА, и при этом подключил бы GND и VCC (как минимум). Возможно ещё подключил бы AVCC к VCC.
     
  6. vi.k

    vi.k Нуб

    Спасибо. Та же картина. Я писал наверху, что другая UNO с чипом ATmega328p-AU (не знаю точно, как корпус называется - маленький, квадратный, 32 ножки) показала 6 мА.

    Нет держателя для трёх батареек (заказал, идут почтой. У нас тут только так - сходить в ближайший магазин не получится :) ), поэтому на них не проверял. Но сейчас попытаюсь что-нибудь смастерить. Подключал от импульсного блока питания (в Амперке брал) к AVCC, так как от VCC не запустилась. Это я всё методом тыка, к сожалению, а надо бы в даташит залезть - выяснить, чем они отличаются.

    Но в общем, буду разбираться сейчас, где я что намудрил. Спасибо.
     
  7. vi.k

    vi.k Нуб

    Всё, разобрался! Сам виноват!

    Первый раз, когда подключал, запитал только через VCC, но почему-то atmega не запустилась. (Сейчас уже не понимаю - почему? Делаю тоже самое, и всё работает!) И я не долго думая (и не смотря в даташит) запитал через AVCC. Чип заработал, но и выдал те самые и 80 мА, и 60 мА. (Ну а это оказалось питание для АЦП! А я через него питал весь чип :) "Шарик, ты балбес" (c).) Запитал нормально через VCC и AVCC и всё пошло на ура!

    Результат лучше, чем я ожидал. В режиме сна:
    +5 В - 7 мкА;
    +3 В - 4 мкА.
    :D Ну вот, случилось мне счастье. Теперь можно и в проект.

    Благодарю за помощь. Заставили головой работать и читать, наконец-то, даташит :)
     
  8. Sevast

    Sevast Нуб

    Здравствуйте.
    Я очень мало разбираюсь в Ардуинах, по этому прошу помощи у Гуру.
    У меня простой скейч. ШД крутит 5 секунд и простой 55 секунд. Эти 55 секунд Ардуино жрет 25мА, что не есть хорошо. Ардуино НАНО. Как уменьшить потребление?
    Мой скейч. Что не так делаю, подскажите пожалуйста.

    Код (C++):
    #include <LowPower.h>
    #include <CustomStepper.h>            // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V
    CustomStepper stepper(8, 9, 10, 11);  // Указываем пины, к которым подключен драйвер шагового двигателя

    int example = 1;                      // Переменная, отвечающая за смену режимов
    void setup()
    {
      stepper.setRPM(10);                 // Кол-во оборотов в минуту
      stepper.setSPR(4096);               // Кол-во шагов на полный оборот.
    }

    void loop()
    {
       {
        LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // Enter power down state for 8 s with ADC and BOD module disabled
      }
          if (stepper.isDone() and example == 1)
      {
        delay(55000);    
        example = 2;
      }
      if (stepper.isDone() and example == 2)
      {
        stepper.setDirection(CW);                
        stepper.rotateDegrees(216);                 // Поворот вала в градусах
        example = 1;
        }
        stepper.run();                  
    }
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    войти в спячку, просыпаться раз в полсекунды и смотреть сколько прошло времени. Если меньше 55 сек, то спать дальше.
     
  10. Sevast

    Sevast Нуб

    Как это реализовать? Может есть готовые решения?
     
  11. Tomasina

    Tomasina Сушитель лампочек Модератор

    смотреть примеры, которые должны быть к библиотеке LowPower, которая у вас используется.
    Если там примеров нет, это займет больше времени - придется гуглить "LowPower Arduino examples".
     
  12. parovoZZ

    parovoZZ Гуру

    Отличный тутор
    http://www.gammon.com.au/power

    По нему тренировался на 328 камне. Во время сна с подключенными nRF, 18b20 у меня что-то меньше микроампера. От двух АА с замером температуры и выходом в эфир раз в десять секунд - пошёл четвертый месяц, напруга на батарейках - 2.88В. Но там всё жестко - если нужна пауза (между командами на замер температуры и её получением, например), то в сон. Пробуждаем nRF из сна - а сами в сон.