Контроль заряда резервной батареи для МЕГИ

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

dr.lmg пишет:

Вот ссылка на зарядник.

Батарея у меня LiFePO4 (12 В / 1,3 А/ч).

Хочу поправить доктора имиджа - 12В можно получить из 6 банок свинцовых по 2В или 10 банок никеля по 1.2В. ВСЕ!

Элемент ЛиФеПо дает 3.3В - и ни при каких ухищрениях 12 В получить нельзя.

ЛиИон и ЛиПо - 3.6-3.7В

https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BA%D0%BA%D1%83%D0%BC%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80

 

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

at0mix, в данном случае за что купил - за то продал. Параметры смотрел в спецификации на батарейку. Как до дачи доберусь, вскрою контроллер и погляжу, что на самой батарее написано.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Оживлю темку..

Схему в итоге я собрал, поставил правда АКБ свинцовый. Литиевый к моменту запуска отработал положенные 4 года и почил. Из-за сложностей контроля заряда-разряди литиевой АКБ поставил простой свинцовый. Он еще и к температурам не требователен.

Ну суть не в этом. Столкнулся с другой задачей: при падении напряжения питания контрллера ниже 4 в. он начинает перезагружаться и заново запускаться. Есть какой-то правильный способ увести его в сон или отключить до появления стабильных 5в. на питание?

obuhanoe
Offline
Зарегистрирован: 18.05.2016

dr.lmg пишет:

Оживлю темку..

Схему в итоге я собрал, поставил правда АКБ свинцовый. Литиевый к моменту запуска отработал положенные 4 года и почил. Из-за сложностей контроля заряда-разряди литиевой АКБ поставил простой свинцовый. Он еще и к температурам не требователен.

Ну суть не в этом. Столкнулся с другой задачей: при падении напряжения питания контрллера ниже 4 в. он начинает перезагружаться и заново запускаться. Есть какой-то правильный способ увести его в сон или отключить до появления стабильных 5в. на питание?

Добрый день.

Подскажите Вы нашли решение проблемы, что бы не перезагружался Микроконтроллер?

Спасибо.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Решение вроде нашел, а вот как его реализовать - пока не совсем.

Можно уводить контроллер в сон. И затем пробуждать по прерыванию. Вот в сон я его уводить научился, а как пробудить, пока не пойму :) Даже не то, чтобы "не пойму".. Как обойтись штатными средствами, не задействуя реле. С помощью реле коммутацию понятно как можно сделать. А мне нужно, чтобы при понижении напряжения до определенного уровня, ардуина уходила в сон, а затем, при появлении напряжения вновь просыпалась. При этом напряжение на ноге, которая настроена на прерывание, имеется в процессе нормальной работы, пропадает лишь когда ардуину нужно увести в сон, и затем, как только напряжение появилось (на этой же ноге), ардуина должна проснуться. Вот как это сделать без реле - пока не допетрил.  Скетч дома, как доберусь - выложу.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

dr.lmg, думаете спящему МК питание совсем по барабану? Он так же глюканет как и не спящий.   В меге есть встроенная фишка - супервайзер питания, браун-аут. Когда питание проседает ниже запрограммированного уровня (по умолчанию в ардуино уно -2,7вольта) супервайзер прижимает ресет к земле. Соответссно мк потребляет крохи, при 4 вольтах -примерно 1,5ма. При 1,8 в -примерно 100мкА. Так что ничего делать не  нужно, всё уже предусмотрено производителем.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

dimax, дело не в питании. Нужно лишь, чтобы мега корректно заснула, и когда питание восстановилось - так же корректно проснулась.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

dr.lmg, так что вы ей предлагаете спать, без питания? Она отключится и всё. Хотя бы 2 вольта должно быть что б не отрубилась.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

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

Скетч для ухода в сон и просыпания я взял отсюда: http://arduino.ru/forum/obshchii/spyashchii-rezhim#comment-54855 с небольшими допилами под свой скетч.

По сути у меня вызов sleepNow() происходит из функции контроля разряда батареи. Достигли по напряжению определенного минимума - уходим в сон, и слушаем прерывания на 2 ноге по высокому сигналу. Однако на высокий сигнал она не реагирует, а вот почему - не пойму.

// Подключаем библиотеки

// управление питанием контроллера (спящий режим)
#include <avr/sleep.h>
int wakePin = 2;            // пин для ухода / выхода спящего режима
int sleepStatus = 0;        // Переменная для хранения статуса (спим, проснулись)
int LedPin=13;                   // Светодиод


void wakeUpNow()        // Прерывание сработает после пробуждения
{
  if (sleepStatus)               // Если мы спали,
  {
    sleep_disable();             // то первое, что нужно сделать после просыпания - выключить спящий режим
    digitalWrite(LedPin, HIGH);  // Включаем светодиод
    sleepStatus = 0;             // В переменную заносим статус бодрствования
    
  }
//  else
//    {
//      Serial.println("Timer: Entering Sleep mode");
//      delay(1000);     // Этот делэй необходим, чтоб функция sleep не вызывала ошибку по Serial
//      sleepNow();     // Вызов функции sleep() для засыпания
//    }


  // Код, который здесь выполнится перед возвращением в цикл loop()
  // Таймеы и код, использующий таймеры (serial.print и др...) здесь не будет работать
  // Также мы не должны выполнять какие-то спец. функции здесь,
  // Т.к. здесь мы просто просыпаемся
}

void setup() {

  // задаем пин для контроля внешнего питания для режима сна
  pinMode(wakePin, INPUT); 
  digitalWrite(wakePin, LOW); 

  // Используем прерывание 0 (pin 2) для выполнения функции wakeUpNow (прерывание вызывается только при смене значения на порту с LOW на HIGH - подтянуть на ногу 2 на 5в.)
  attachInterrupt(0, wakeUpNow, RISING);  

}

void sleepNow()         // Функция увода ардуины в спячку.
{
  digitalWrite(LedPin, LOW);             // Выключаем светодиод
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);   // Здесь устанавливается режим сна
  sleep_enable();                        // Включаем sleep-бит в регистре mcucr. Теперь возможен слип 

  //attachInterrupt(0,wakeUpNow, LOW);     // Используем прерывание 0 (pin 2) для выполнения функции wakeUpNow при появлении низкого уровня на пине 2

  //count = 0;                             // Обнуляем счетчик прошедших секунд
  sleepStatus = 1;                       // В переменную заносим статус сна

  sleep_mode();                          // Здесь устройство перейдет в режим сна!!!
  // -----------------------------------------------ПОСЛЕ ПРОСЫПАНИЯ ВЫПОЛНЕНИЕ КОДА ПРОДОЛЖИТСЯ ОТСЮДА!!!
                     
  //sleep_disable();                       // Первое, что нужно сделать после просыпания - выключить спящий режим
  //detachInterrupt(0);                    // Выключаем прерывание - при нормальном режиме wakeUpNow() не будет вызываться
}

void loop() {

// здесь выполняется всякий код и проверка на разряд батареи
if ((pwr_AC < 4) && (step_pwr_ACC == 4)) 
    {
      msgSMS = msgSMS + "!!! pwr ACC: Battery is DISCHARGED (" + String(pwr_AC) + "v)\r\n";  
      ++step_pwr_ACC; 
      goSMS(); 
      EndSMS();
      ST_RL_Power = false; // выключаем все реле
      goRelay();
      sleepNow();     // Вызов функции sleep() для засыпания
      }
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

dr.lmg, а что собссно к 2 ноге подключено?

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

+5 в. с делителя по внешнему питанию.

dr.lmg
dr.lmg аватар
Offline
Зарегистрирован: 07.01.2016

Коллеги, какие есть мнения? Без реле, имея изначально высокий уровень на второй ноге, который при отключении внешнего питания практически падает в ноль, уходить в сон (не задействуя на это прерывания), а пробуждать именно при появлении высокого сигнала (возобновление внешнего питания) по прерыванию на второй ноге.

arduinec
Offline
Зарегистрирован: 01.09.2015

Если питание и прерывание подаются одновременно, то Ардуина не замечает, что произошло прерывание. Нужно сделать задержку между подачей питания и сигналом прерывания.