Контроль аккумуляторной батареи от которой питается плата Arduino и остальная нагрузка!

Тема в разделе "Силовая электроника", создана пользователем issaom, 10 дек 2016.

  1. Unixon

    Unixon Оракул

    Может тогда стоит поставить ОУ и трансформировать им 10..20V -> 0..5V, а на AREF повесить TL431 (1431) с емкостями... правда придется для ОУ делать шины питания за пределами измеряемого диапазона.
     
  2. Не нужно вам городить никаких дополнительных схем, ОУ, TL431 и прочей зауми. В Ардуино всё есть "с завода".

    Просто используйте внутренне стабилизированное напряжение, но не как опорное, а как эталонное для обратного вычисления реального опорного Vcc. Вот, например, всё расписано подробно: http://tim4dev.com/arduino-secret-true-voltmeter/ или поищите оригинал Scott Daniels Secret Arduino Voltmeter – Measure Battery Voltage, на английском, но там код пограмотнее.

    Проверял для Uno, Mega, 32u - работает.
     
  3. Unixon

    Unixon Оракул

    Вы точно прочитали всю ветку и правильно поняли все, что здесь было написано?
     
  4. Да вроде прочитал.

    Чел хочет измерять напряжение батареи, при этом стабилизируют подачу питания 5V, потом, зачем-то, вешает на эти стабилизированные 5V нагрузку, удивляется неточности показаний, и вешает еще один аппаратный стабилизатор чтобы использовать внешний Vref. Подход странный, вам не кажется?

    На нарисованной схеме достаточно одного стабилизатора, который на вход 5V, и использовать Vcc как Vref.

    По моим экспериментам при, питании Arduino напряжением более 5V Vcc у нее чуточку выше 5V, при питании менее 5V Vcc будет равно Vin. В моём, например, случае, при питании от USB - 4,6В

    Я всего-то утверждаю, что можно использовать заниженное Vcc как Vref, калибровать показания "обратным счетом" через измерение внутреннего источника 1.1В, и получать нормальные показания напряжения без дополнительной аппаратуры.
     
  5. Unixon

    Unixon Оракул

    Ничуть не странный подход, он вынужденный исходя из ограничений задачи. Про 1.1V это очевидное решение, но при использовании встроенного бандгапа там другие проблемы возникают, которые портят точность измерений. Поэтому более правильное решение - использовать полную шкалу напряжений до Vcc и привести измеряемое напряжение к ней не просто пропорционально (делителем), что снижает точность, а со смещением и с меньшим сжатием шкалы, чтобы самый важный диапазон измеряемых напряжений оказался подальше от шин питания и с максимальным разрешением. Это само по себе уменьшает требование к стабильности и точности Vref.
     
  6. VladislavSum

    VladislavSum Нуб

    А что если и правда подключить через делитель (на 5в) напряжение с батареи на Vref а потом с его помощью измерить внутреннее опорное напряжение, предварительно вычислив точное значение внутреннего опорного напряжения?
     
  7. mcureenab

    mcureenab Гик

    Вот о чем я и говорил. В АЦП есть дифференциальный режим измерений, когда он определяет разность напряжений на двух пинах. Мне вот только не понятно, можно на эти пины подать, например опорное напряжение 13 вольт и напряжение с аккумулятора. Или оно ограничено Vcc.
     
  8. Unixon

    Unixon Оракул

    Ограничено.
     
  9. mcureenab

    mcureenab Гик

    Хм. А если это напряжение отвязано от GND. Т.е. там батарейка подключена или устройство, не связанное по GND.
     
  10. VladislavSum

    VladislavSum Нуб

    тогда ты просто сравнить не сможешь, земля общая обязательно
     
  11. issaom

    issaom Нерд

    Как по итогу выяснилось проще всего решить данную задачу на INA219 - наверное в исходный вариант конструкции этот датчик и затолкну....

    ina219_Схема.jpg

    Код:
    Код (C++):
    // библиотека для работы с дисплеем
    #include <LiquidCrystal.h>
    // пины для работы дисплея
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    //библиотека для работы с интерфейсом I2C
    #include <Wire.h>
    //библиотека для работы с датчиком
    #include <Adafruit_INA219.h>
    //создаем экземпляр для работы с датчиком
    Adafruit_INA219 ina219;

    void setup(void)
    {
      ina219.begin();     //инициализируем плату
      lcd.begin(16, 2);   //инициализируем дисплей
      lcd.print("Vbat!");
    }

    void loop(void)
    {
      float busvoltage = 0;
      //функция считывает напряжение между GND и Vin-
      busvoltage = ina219.getBusVoltage_V();
      lcd.setCursor(0, 1);
      //печатаем результат измерения на экране
      lcd.print(busvoltage);
      delay(2000);
    }
    Краткая демонстрация работы: