Прощу помощи в измерений питания Лити-Ионн (своего питания)

Тема в разделе "Arduino & Shields", создана пользователем Proger_xxx, 6 окт 2016.

  1. Proger_xxx

    Proger_xxx Нуб

    Имеется с зарубежного сайта скетч для ардуины. Как использовать (а именно сравнения) в роли аналогового компаратора (if - else например). А вот и сам скетч с опорным напряжением 1,1 вольта:

    Код (C++):

    void setup(void)
      {
      Serial.begin(115200);
      }
       
    void loop(void)
      {
      Serial.println (getBandgap ());
      delay(1000);
      }

    const long InternalReferenceVoltage = 1062;  // Adjust this value to your board's specific internal BG voltage
    // Code courtesy of "Coding Badly" and "Retrolefty" from the Arduino forum
    // results are Vcc * 100
    // So for example, 5V would be 500.
    int getBandgap ()
      {
      // REFS0 : Selects AVcc external reference
      // MUX3 MUX2 MUX1 : Selects 1.1V (VBG)
       ADMUX = bit (REFS0) | bit (MUX3) | bit (MUX2) | bit (MUX1);
       ADCSRA |= bit( ADSC );  // start conversion
       while (ADCSRA & bit (ADSC))
         { }  // wait for conversion to complete
       int results = (((InternalReferenceVoltage * 1024) / ADC) + 5) / 10;
       return results;
      } // end of getBandgap
    .А сам проект будет питаться с Лити-Иона на 4,2 вольта. То есть нужна логика при понижение 4,2 вольта светодиод нормал должен загореться. А если ниже 3,2 вольта красный светодиод
     
  2. rkit

    rkit Гуру

    Нужно сделать схему делителя напряжения, чтобы 4.2 делилось до 1.1. В гугле есть инструкции, как это делается.
    Потом, пользуясь этим скетчем, узнать, какое значение будет на 3.2 вольтах, и записать его в if-else.
     
  3. Proger_xxx

    Proger_xxx Нуб

    Пробовал либо целых 1023 либо 0
     
  4. rkit

    rkit Гуру

    Значит где-то ошибка.
     
  5. Airbus

    Airbus Радиохулиган Модератор

    Зачем так сложно?Делитель не нужен напряжение ведь меньше 5 вольт?Просто analog read переводим в вольты и потом с помощью if - else что то делаем (или не делаем).и кстати зачем там Serial.begin?Да ещё на такой скорости?
     
  6. Airbus

    Airbus Радиохулиган Модератор

    Что то типа такого-нашёл в закромах Родины
    Код (C++):
    const byte maxVoltage =5;// максимально возможное измеряемое напряжение
    int led = 13;
    void setup()
    {
    pinMode(led, OUTPUT);
    }

    void loop()
    {
      float voltage = map(analogRead(A1),0,1060,0,maxVoltage*100)/100.0; //переводим в вольты
      if(voltage<2.8) blink();// если меньше 2,8 мигаем 13 пином
    }

    void blink()
    {
      digitalWrite(led, HIGH);   // вкл
      delay(1000);               // пауза
      digitalWrite(led, LOW);    // выкл
      delay(1000);               // пауза
    }
    Можно переделать под Ваши нужды
     
  7. rkit

    rkit Гуру

    И питание тоже меньше пяти вольт. Не получится измерить напряжение, отталкиваясь от него самого.
     
  8. Radius

    Radius Гик

    Если нужно измерять напряжение своего питания, то опорное напряжение нужно обязательно брать от внутреннего опорника, это 1,1 В. Резистивным делителем напряжение питания нужно понизить до этого напряжения. Можно взять например 240 и 820 кОм. Тогда на 240 кОм получим напряжение чуть меньше одного вольта.
     
  9. 9xA59kK

    9xA59kK Гик

    Есть пример использования внутреннего ИОН и больше ничего не нужно для определения напряжения на аккумуляторе Li-ion 4.2В. В статье приведен код ,на ATtiny85, абзац "Измерение напряжения питания". Я его использовал точно в таком же виде для ATtiny85(собирал фонарик налобный) и не требуется никаких делителей, так устроен контроллер. Это я к тому что и на ATmege328 тоже можно так же измерять напряжение используя внутренне опорное напряжение без всяких дополнительных делителей.
    Не помню где я читал ,но если так использовать контроллер, то напряжение питания будет связано с одним из каналов АЦП. Из примера этой статьи, вы всегда будете знать какое сейчас напряжение на аккумуляторе
    ...........
    ...........
    result = 1125300L / result; // 1125300 = 1.1*1023*1000
    return result; // Vcc в милливольтах


    но код надо будет доработать немного( хотя может и так заработает) для Ардуино УНО и ей подобной.
    ps\ Я пробовал и с UNO так измерять напряжение, отлично работает. Код примера для UNO найти не смог, если найду выложу.
    Интернет вам в помощь.
     
    Последнее редактирование: 7 окт 2016
  10. Radius

    Radius Гик

    Любое АЦП измеряет напряжение относительно опорного напряжения, то есть диапазон измерения АЦП от 0В до Uопоры. Если подать на вход АЦП напряжение больше опорного, то АЦП всегда будет выдавать максимальное значение (Uопоры). Поэтому входное напряжение резистивным делителем нужно вогнать в диапазон 0...Uопоры.
     
  11. 9xA59kK

    9xA59kK Гик

    На вход ацп в данном примере, что я привел выше, ничего подавать не надо.
     
  12. Radius

    Radius Гик

    В вашем примере (см. код) обычное измерение напряжения АЦП с использованием встроенного ИОН. Непонятно как без делителя измерять напряжения выше напряжения опоры.
     
  13. 9xA59kK

    9xA59kK Гик

    Вообще есть описание в даташите про измерение внутреннего опорного напряжения на многих МК.
    И вот относительно подробное описание, или вот еще, как это происходит.

    ps\ Чаще пользуйтесь поисковиком интернета.
     
    Последнее редактирование: 8 окт 2016
  14. Radius

    Radius Гик

    Теперь понял. Измеряется опрное напряжение 1,1в относительно Vcc, далее вычисляется само значение Vcc.