V питания Atmega328P

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

  1. AlexVS

    AlexVS Гик

    После общения со всевозможными Arduino решил поработать с голой Atmega328P.
    По даташиту у нее напряжение питания 1,8 - 5,5 В. Т.е. контроллер будет стабильно работать при любом напряжении из этого диапозона?
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    При низких напряжениях будет работать только на маленьких частотах, в даташите таблица есть на эту тему.
     
  3. AlexVS

    AlexVS Гик

    На это я обратил внимание.
     
  4. AlexVS

    AlexVS Гик

    Ну вот, все получилось.
    Сделал Light - сенсор с питанием от CR2450, дополнительно установил DS18B20, запитав его от ноги контроллера.
    В режиме сна потребление 14 мкА, в режиме снятия показаний с датчиков 3 - 4 мА, период раз в 3 мин., в режиме передачи - 16-18 мА, период раз в 10 мин.
    Код (Text):
    #include <LowPower.h>
    #include <SPI.h>
    #include <RF24Network.h>
    #include <RF24.h>        
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <Wire.h>
    #include <BH1750.h>
    #include "ClassAVG.h"

    #define pinPowerSensor 4    //Питание сенсоров подключаем к Pin 4
    #define ONE_WIRE_BUS 3
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    BH1750 Light;
    RF24 radio(/*ce*/ 9, /*cs*/ 10);
    RF24Network network(radio);
    // Адрес узла
    uint16_t this_node = 02;
    // Адрес основного сенсора, куда  сливаем показания
    uint16_t main_node = 0;
    // Номер канала
    const int Chanel = 11;
    int ReadCount;
    int iSend    = 3;    // Интервал отправки показаний
    int WaitCount = 24;  // Количество циклов сна по 8 сек.
    bool allowSend = false; //признак разрешения на отправку
    AVG vAVG(3);
    AVG tAVG(3);
    AVG lAVG(3);
    struct StreetMeteoSensor
    {
      char    ID[5];    //ИД устойства
      unsigned long UpTime;
      int  T;          //Температура
      long  L;          //Освещенность  (Lx)
      int  V;          //уровень заряда батарейки (mV)
    };
    struct StreetMeteoSensor sensor;
    RF24NetworkHeader header(main_node, 'I');
    ////////////////////////////////////////////
    #define DEBUG_MODE    0
    ////////////////////////////////////////////

    void setup(void)
    {
        if (DEBUG_MODE)
      {
        Serial.begin(115200);
        Serial.println("-- START --");
        WaitCount = 5;
      }
      for (int i = 1; i < 15; i++)
      {
        pinMode(i, OUTPUT);
        digitalWrite(i,LOW);
      }
      digitalWrite(pinPowerSensor,HIGH);
      char ID[5] = "LTS1";
      memcpy(sensor.ID, ID, 5);
      ReadCount = iSend;
      SPI.begin();
      delay(500);
      radio.begin();
      network.begin( Chanel, this_node );
      sensors.begin();
      Light.begin(BH1750_ONE_TIME_HIGH_RES_MODE);
      delay(500);
      radio.powerDown();  
      digitalWrite(pinPowerSensor,LOW);
      Light.configure(BH1750_POWER_DOWN);
      if (DEBUG_MODE)  Serial.println("-- End SETUP --");
    }

    void loop(void)
    {
    if (DEBUG_MODE) Serial.println("data read...");
      /////////////////////////////////////////////////////////////
      Light.configure(BH1750_POWER_ON);                    // Включаем сенсор
      Light.configure(BH1750_ONE_TIME_HIGH_RES_MODE);    // Устанавливаем режим измерений
      digitalWrite(pinPowerSensor,HIGH);                  // Подаем питание на DS18B20
      sensors.setResolution(TEMP_9_BIT);
      /////////////////////////////////////////////////////////////
      delay(250); // при меньшей задержке - глючит
      /////////////////////////////////////////////////////////////
      sensors.requestTemperatures();
      int T = sensors.getTempCByIndex(0);
      digitalWrite(pinPowerSensor,LOW);  // Отключаем питанеи DS18B20
      long L = Light.readLightLevel();  //Режим ONE_TIME автоматически отключает питание
      int V = readVcc();
      /////////////////////////////////////////////////////////////
      int tt = tAVG.Get();
      int vv = vAVG.Get();
      if (0 != L || 0 != lAVG.Get() || T < tt || T > tt || V < vv-90/*90mV*/)
      {
        tAVG.Set(T);
        lAVG.Set(L);
        vAVG.Set(V);
        allowSend = true;    //Есть что отправить - Взведем флаг
      }
      ReadCount++;      
      /////////////////////////////////////////////////////////////
      if ( ReadCount >= iSend && allowSend )
      {
        // Отправка данных на базовый узел
        ReadCount = 0;
        allowSend = false;
        radio.powerUp();
        delay(50);
        sensor.T = tAVG.Get();
        sensor.L = lAVG.Get();
        sensor.V = vAVG.Get();  
        sensor.UpTime = millis()/1000;  
        network.write(header,&sensor,sizeof(sensor));
        radio.powerDown();
      }  
      sleep();
    }
    // Переводим в режим низкого энергопотребления
    void sleep()
    {
      if (DEBUG_MODE) {Serial.println("----- SLEEP -----");Serial.flush();}
      for (int i = 0; i < WaitCount; i++)
      {
        LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
      }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Измерение напряжения питания
    int readVcc()
    {
      int result;
      ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
      delay(75); // Wait for Vref to settle
      ADCSRA |= _BV(ADSC); // Start conversion
      while (bit_is_set(ADCSRA,ADSC)); // measuring
      result = ADCL;
      result |= ADCH<<8;
      result =  1125300L / result; // (Kvcc * 1023.0 * 1000) (in mV);
      return result;
    }
    20150910_163109.jpg 20150910_162626.jpg
     
    Motoped и Tomasina нравится это.
  5. Motoped

    Motoped Нуб

    А сколько он потреблял в режиме сна на ардуине. А то у меня ардуино про мини с отпаянными светодиодами и не как не могу добиться потребления во сне меньше 3.41ма. Регулятор тоже отключен. И вроде на про мини больше и кушать нечему.
     
  6. AlexVS

    AlexVS Гик

    На Pro Mini 8MHz - потребление в режиме сна было ~160мкА
     
  7. Motoped

    Motoped Нуб

    Тогда не понимаю почему он у меня так жрет. в активном режиме до 11ма. (но мне это все равно не важный параметр ) это при одном DHT22 и DS18B20 и передатчик L01+ а когда засыпает 3.41ма в режиме сна снимается питание с этих устройств (Питание от пина. ) Влияет ли напряжение питания 3.3в или 5в. на ток. Или там разницы нет. У меня все запитано от 3.3в.Заранее извиняюсь если вопрос глупый?
     
  8. AlexVS

    AlexVS Гик

    При 5в я не пробовал.
    Попробуйте отключить все, оставьте только При Мини, замерьте ток в режиме пустого цикла, затем дайте команду LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF), естественно в цикле или с параметром SLEEP_FOREVER и сново замерьте потребляемый ток. Дальше по ситуации.