Страница 1 из 1

Энергоэффективный режим работы arduino с DS3231

Добавлено: Пт окт 27, 2017 14:15:33
Anton991
Планируется, что Arduino pro mini обвешаная дачтиками, питающаяся от батареек будет производить измерения 1 раз в час, слать их по радио и засыпать, через час по будильнику DS3231 просыпаться повотрять то же самое. Все вроде работает, но есть одно НО, которое все портит. Потребление в режиме сна 300 мкА!

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

То есть если arduino спит без подключенной линий SQW часов потребление 30-40 мкА (что устраивает). Но если подключить линию SQW к пину 2 ( который в режиме INPUT_PULLUP и еще подтянут к питанию 5кОм) то паразитный ток 250мкА все портит. (То есть в SQW при режиме ожидания висит резюк 10кОм перед землей, в момент срабатывания будильника сопротивление убирается и коротится на землю, что пробуждает контролер). Если в линию еще последовательное ставить резистр, то ток уменьшается но arduino уже не просыпается.

Ниже код урезанный именно та часть которая отвечает за сон и пробуждение (так то линия запитки и дачтиков висит на одной из ног дуины, перед сном они переводятся в состояние INPUT, что посзволило снизить с единиц мА до десятков мкА).
Спойлер#include <DS3231.h>
#include <Wire.h>
#include <LowPower.h>
#include <avr/sleep.h>
#include <avr/power.h>
#include <SPI.h>
#include <Streaming.h>


#define wakePin 2

DS3231 clock;
RTCDateTime dt;

void setup() {
pinMode(wakePin, INPUT_PULLUP);
clock.begin();
clock.enableOutput(false);
clock.armAlarm1(false);
clock.armAlarm2(false);
clock.clearAlarm1();
clock.clearAlarm2();
}

void loop() {

setSleepTimer(1);
sleepNow();
}
}

void wakeUp()
{
// Just a handler for the pin interrupt.
}

void setSleepTimer(int mins) {
uint8_t hours = mins / 60;
uint8_t mins_left = mins - hours * 60;
dt = clock.getDateTime();
uint8_t hnow = dt.hour;
uint8_t mnow = dt.minute;
uint8_t sec = dt.second;
mnow += mins_left;
if (mnow >= 60) {
mnow -= 60;
hnow += 1;
}
hnow += hours;
if (hnow > 23) {
hnow -= 24;
}
clock.setAlarm1(0, hnow, mnow, sec, DS3231_MATCH_H_M_S);
}


void sleepNow() {
ADCSRA = 0;
power_all_disable();
attachInterrupt(0, wakeUp, LOW);

PINs_to_sleep();

LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
sleep_enable();
sleep_mode();
sleep_disable();
power_all_enable();
detachInterrupt(0);

PINs_to_work();

delay(100);
}
Подскажите как можно устранить ток по линии SQW.

Как уменьшить потребление тока в линии прерывания AVR

Добавлено: Пт окт 27, 2017 15:13:38
Anton991
Контроллер  AVR 328P  (на борту arduino pro mini ) работает в энергоээфективном режиме, то есть большую часть времени спит, просыпается по внешнему прерыванию делает дела и снова засыпает . На рисунке справа нога контролера (в режиме INPUT_PULLUP) которая реагирует на внешнее прерывание. Внешний прерыватель слева DS3231 (приблизительная схема скорее всего, там вместо резисторов транзистор, но вооьбщем в закрытом состоянии сопротивление поярдка 10 кОм в открытом при срабатывании прерывания 30-40 Ом). 

Проблема в том, что даже в закрытом состоянии при сопротивлении через 10кОм утекает порядка 250 мкА, что критично. вопрос, что можно добавить в схему между прерывателем и контролером, чтобы снизить ток во время сна, желательно до нуля.  может какую схему с транзистором? Главное чтоб в момент срабатывание S1 на ноге контролера появлялся уровень близкий к GND.

p.s. если ставить ограничительный высокоомный резистор, то на ноге контролера напряжение не падает до нуля и контролер не просыпается.
ds3231.JPG
(56.59 КБ) 526 скачиваний

Re: Как уменьшить потребление

Добавлено: Пт окт 27, 2017 15:31:47
mickbell
Что за нога там у DS - INT? В даташите, который я глянул, никакого резистора, один голый сток, и ток утечки не более одного микроампера, так что там хоть мегом ставьте на подтяжку.

Re: Как уменьшить потребление тока в линии прерывания AVR

Добавлено: Пт окт 27, 2017 15:48:54
Anton991
нога SQW, я замерил мультиметром сопротивление после установки будильника, до срабатывания будильника 10кОм после 40 Ом примерно.

Re: Как уменьшить потребление тока в линии прерывания AVR

Добавлено: Пт окт 27, 2017 16:27:34
mickbell
Ну да, INT/SQW, она и есть. Откуда там могли взяться 10 кОм? Попробуйте поднять ногу и ещё раз промерить. Возможно, утечка по плате, а не внутри микросхемы. Повторюсь, по даташиту ток утечки в эту ногу (пока закрыт выходной мосфет) не более 1 мкА.

Re: Как уменьшить потребление тока в линии прерывания AVR

Добавлено: Пт окт 27, 2017 16:32:36
Anton991
Хорошо попробую посмотреть, плата типовая
61BBRnUvY9L._SL1200_.jpg
(110.3 КБ) 599 скачиваний

Re: Как уменьшить потребление тока в линии прерывания AVR

Добавлено: Пт окт 27, 2017 16:34:47
mickbell
Перед отпайкой её бы в УЗ ванну... возможно, отмывкой и ограничится.

Re: Как уменьшить потребление тока в линии прерывания AVR

Добавлено: Пн окт 30, 2017 08:15:38
Anton991
Попробовал поставить другой модуль DS3231, такая же ситуация. Буду искать сопротивление на плате. Интересно только, для чего его поставили почему не поставили мегаОмы, может это необходимо для корректной работы?

Re: Как уменьшить потребление тока в линии прерывания AVR

Добавлено: Пн окт 30, 2017 09:11:03
mickbell
Совершенно непонятно, зачем вообще тянуть выход вниз резистором, когда то же самое делает сток. Я понимаю, если бы к питанию притягивали. Но вы его сначала найдите. Может быть, это просто партия микросхем с брачком.

Re: Как уменьшить потребление тока в линии прерывания AVR

Добавлено: Пн окт 30, 2017 10:01:49
Anton991
Проблема решена, только я не совсем понимаю почему так. Попробую подробно расписать возможно кому-то пригодиться:

1) Arduino Pro mini обвязана датчиками 3 из которых подключены по OneWire а три напрямую к аналоговым входам A0,1,2. Подключен радиомодуль по интефейсу SPI. И подключены часы DS3231 по I2C.

2) Так как устройство должно работать очень энергоэффективно, условно говоря закопано в землю на пару лет. То питание датчиков и часов заведены на ножки контролера а не на общую шину VCC. питание датчиков 8 нога, питание часов 5 (в принципе можно их и на одну их суммарное потребление около 3 мА), питание радио модуля от общей шины VCC, так как опытным путем измерено, что он в покое абсолютно ничего не потребляет ну возможно от 0 до 1 мкА.

3) pro mini единолично в спящем режиме потребляет от 10 до 20 мкА, потребление наверное зависит от прошивки, но от чего именно в скетче я точно сказать не могу.

4) Часы подключены вот так:
Изображение
5)Мне пригодилась вот эта схемка самого модуля
Изображение


на ней видно что SQW подтянута 4.7 кОм (сборка резисторов RP1) к VCC, я решил попробовать обрезать эту дорожку и вместо 4.7кОм поставить сопротивление по более. Поставил и о чудо проблема решилась, потребление с 300 мкА упало до 20 мкА, и будильник срабатывает и пробуждает arduino.

Вывод: каким то образом ток рассеивался на этом RP1, хотя он подтягивает к линии VCC.

p.s до этого когда искал место утечки, ток исчезал когда я отключал от часов линии SQW или GND, но при отключении линии VCC ток сохранялся. Вот что я понять не могу.

Re: Как уменьшить потребление тока в линии прерывания AVR

Добавлено: Пн окт 30, 2017 10:14:30
mickbell
Питание заведено на ноги контроллера, а резистор подключен к VCC? Не в этом ли дело? Видимо, при прямом запитывании контроллера пять вольт на VCC НЕ появляется - это проверьте первым делом.

Re: Как уменьшить потребление тока в линии прерывания AVR

Добавлено: Пн окт 30, 2017 10:24:17
Anton991
В спящем режиме VCC DS3231 подключено к ноге контролера, которая находиться в режиме INPUT, а на сколько я помню в этом режиме нога подятгивается к земле очень большим сопротивлением, и ток утечки должен практически отсутствовать

Re: Как уменьшить потребление тока в линии прерывания AVR

Добавлено: Пн окт 30, 2017 10:34:56
mickbell
Я имею в виду этот внешний резистор номиналом 4.7 кОм, который подключен к цепи VCC. Если цепь VCC не соединена с питанием, а на ней есть какие-то другие устройства - например, стабилизатор питания VCC, то получается, что если на линии INT/SQW единица, поданная через внутренний или внешний резистор подтяжки к питанию контроллера, то вот он, путь тока утечки:
плюс питания - внешняя или внутренняя подтяжка - резистор номиналом 4.7 кОм - незадействованный стабилизатор питания VCC - общий провод.
Вы бы нарисовали полную принципиальную схему, на которой и контроллер, и DS3231, и прочие девайсы - и всё стало бы понятно, а то приходится догадываться.