питание и выключение ардуины

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

Реализовал резервное питание от ионистора 1Ф5.5В 

Задача - при отключении питания сохранить настройки и текущие данные на СД

Ионистора его хватает на 15-30 секунд работы, после чего ардуина секунд 15 еще дергается в конвульсиях...

есть контроль напряжения питания

Соответственно, если напряжение ниже 4В выполняются действия по сохранению данных

на напряжении 3.8В МК перестает работать

 

----

Вопросы:

1) как лучше реализовать цепи питания, чтобы по завершению сохранения данных, МК отключался не дожидаясь полного разряда ионистора

2) как включить МК в таком случае заново при появлении питания, если на момент выключения, заряда ионистора было еще достаточно для рабы мк? Тоесть чтобы включени было при напряжении питания более 4.5В

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ELITE пишет:

на напряжении 3.8В МК перестает работать

С какого перепугу? Ну, разве что только лично у Вас, т.к. наверняка у Вас опять нечестный китайский даташит и "С" такой же. У нормальных людей и при 2,5 ещё работает.

ELITE пишет:

1) как лучше реализовать цепи питания, чтобы по завершению сохранения данных, МК отключался не дожидаясь полного разряда ионистора

Покажите как они у Вас сейчас реализованы.

Тогда будет о чм говорить, обсудать как и что менять. А пока говорить не о чем.

ELITE пишет:

2) как включить МК в таком случае заново при появлении питания, если на момент выключения, заряда ионистора было еще достаточно для рабы мк? Тоесть чтобы включени было при напряжении питания более 4.5В

Опять же, будет схема - будет о чём говорить. Нет схемы - говорить не очем.

В общем, схему в студию!

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А где в этой схеме 

ELITE пишет:

есть контроль напряжения питания

Чисто программно? Было бы любопытно посмотреть как Вы это делаете, т.к. с Вашими познаниями, там может быть нетривиальное решение :)

Выключение, когда "все дела закончены" несложно, а вот включить после этого "взад", когда питание появилось, боюсь без аппаратных доделок не обойдётся.

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

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

контроль напряжений аппаратный классический

делитель 2.2к и 10к

сетап

  pinMode(PWR, INPUT);
  analogReference(INTERNAL); 
 
луп

int pwr_val = analogRead(PWR); 

 

ну и дальше по коду просто смотрю значение pwr_val 

при таком делителе вышло 850 = 5В , мк отключается при 3.8 по тестеру и при значении в логе 550 примерно (последнее что на сд записать успевает)

зачем надо - тк мой проект подразумевает работу в машине от прикуривателя - то возможны непредсказуемые отключения питания различной длительности

если питание возобновлено быстро (заводка двигателя, отошол штекер прикуривателя) - то ионистор вытягивает всё, в том числе и индикатор с жпс приемником порядка 10 сек - то всё нормально, если дольше - то значит было отключение питания или чтото более серьезное (обрыв провода, дтп и тд) - то надо именно завершиться корретно и отключиться

да, сделать аппаратный разряд ионистора былобы более правильным после отключения, но при этом при подаче питания, надо сразу же и разрядную цепь отключить

при этом ионистор нельзя разрядить путем КЗ на доли секунды - его назо коротить как минимум на 5-7 секунд для полного разряда (хотябы менее 2.5В)

и да, щас 328й мк, а будет смт32 - а там питание ниже , надо это тоже учесть

----

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

long readVcc() {
    // Read 1.1V reference against AVcc
    // set the reference to Vcc and the measurement to the internal 1.1V reference
  #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
  #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
  #else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  #endif  
  
    delay(2); // Wait for Vref to settle
    ADCSRA |= _BV(ADSC); // Start conversion
    while (bit_is_set(ADCSRA,ADSC)); // measuring
  
    uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH  
    uint8_t high = ADCH; // unlocks both
  
    long result = (high<<8) | low;
  
    result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
    return result; // Vcc in millivolts
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

ELITE пишет:

2) как включить МК в таком случае заново при появлении питания, если на момент выключения, заряда ионистора было еще достаточно для рабы мк? Тоесть чтобы включени было при напряжении питания более 4.5В

BODLEVEL = 100, Vcc = 4,3V. Фузами (для 328). Следующий 2,7V.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

хотелось бы максимально простое решение, которое будет универсальным для любых МК как для атмега, тек и для СТМ

и если не затруднит, пожалуста ответы немного развернутее, я еще плохо знаю многие аспекты работы с ардуиной

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

bwn пишет:

ELITE пишет:

2) как включить МК в таком случае заново при появлении питания, если на момент выключения, заряда ионистора было еще достаточно для рабы мк? Тоесть чтобы включени было при напряжении питания более 4.5В

BODLEVEL = 100, Vcc = 4,3V. Фузами (для 328). Следующий 2,7V.

ну это мне только мешать будет наверное его отключить лучше вовсе

BODEN = 1 

//и да, почему BODLEVEL = 100?? пишут вроде BODLEVEL = 1 для 2.7В

bwn
Offline
Зарегистрирован: 25.08.2014

FUSE калькулятор. При снижении питания ниже заданного порога МК прекращает свою деятельность (аналогично RESET к LOW). 

p/s поправил ссылку, вроде работает.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

bwn пишет:

FUSE калькулятор. При снижении питания ниже заданного порога МК прекращает свою деятельность (аналогично RESET к LOW). 

p/s поправил ссылку, вроде работает.

с этим понятно вариантом

шить как тут http://arduino.ru/forum/programmirovanie/fuse-bity#comment-6011

---

но это не универсальный метод, да и при смене МК надо новый также перепрошивать... чо не очень удобно

bwn
Offline
Зарегистрирован: 25.08.2014

Тогда какую то наружную схему мастырить, наверно. Может что поумнее подскажут.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

да, по любому ионистор доразряжать придется 1 пин на управление  выводить

 

bwn
Offline
Зарегистрирован: 25.08.2014

Только не понимаю, зачем доразряжать ионистор. Подключили его через ключ, питание просело, записываем данные и делаем себе харакири выключением ключа.  ИМХО.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

вот условная схема, что мне пришла на вскидку в голову

при отсутствии питания оба ключа закрыты

при подаче питания, через R2 притягивается Т2 в закрытое состояние, пин управления пока нетрален и не влияет на работу

Загружается МК и подает на пин управления 1 - открывает Т1, подавая питания на ионистор, а также дополнительно подтягивает Т2 в закрытом состоянии

Как только пропало питания (по контролю опустилось ниже установленного) - на пин управления подается 0 - что закрывает Т1 и открывает Т2...

 

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