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

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Родился
Сообщения: 14
Зарегистрирован: Пн авг 28, 2017 12:31:32

Сообщение 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.
Реклама
Родился
Сообщения: 14
Зарегистрирован: Пн авг 28, 2017 12:31:32

Сообщение Anton991 »

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

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

p.s. если ставить ограничительный высокоомный резистор, то на ноге контролера напряжение не падает до нуля и контролер не просыпается.
ds3231.JPG
(56.59 КБ) 526 скачиваний
Реклама
Друг Кота
Аватара пользователя
Сообщения: 17071
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

Что за нога там у DS - INT? В даташите, который я глянул, никакого резистора, один голый сток, и ток утечки не более одного микроампера, так что там хоть мегом ставьте на подтяжку.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Родился
Сообщения: 14
Зарегистрирован: Пн авг 28, 2017 12:31:32

Сообщение Anton991 »

нога SQW, я замерил мультиметром сопротивление после установки будильника, до срабатывания будильника 10кОм после 40 Ом примерно.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 17071
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

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

На каждый РКН
Найдётся VPN.
Реклама
Родился
Сообщения: 14
Зарегистрирован: Пн авг 28, 2017 12:31:32

Сообщение Anton991 »

Хорошо попробую посмотреть, плата типовая
61BBRnUvY9L._SL1200_.jpg
(110.3 КБ) 599 скачиваний
Реклама
Друг Кота
Аватара пользователя
Сообщения: 17071
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

Перед отпайкой её бы в УЗ ванну... возможно, отмывкой и ограничится.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Родился
Сообщения: 14
Зарегистрирован: Пн авг 28, 2017 12:31:32

Сообщение Anton991 »

Попробовал поставить другой модуль DS3231, такая же ситуация. Буду искать сопротивление на плате. Интересно только, для чего его поставили почему не поставили мегаОмы, может это необходимо для корректной работы?
Друг Кота
Аватара пользователя
Сообщения: 17071
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

Совершенно непонятно, зачем вообще тянуть выход вниз резистором, когда то же самое делает сток. Я понимаю, если бы к питанию притягивали. Но вы его сначала найдите. Может быть, это просто партия микросхем с брачком.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Родился
Сообщения: 14
Зарегистрирован: Пн авг 28, 2017 12:31:32

Сообщение 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 ток сохранялся. Вот что я понять не могу.
Друг Кота
Аватара пользователя
Сообщения: 17071
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

Питание заведено на ноги контроллера, а резистор подключен к VCC? Не в этом ли дело? Видимо, при прямом запитывании контроллера пять вольт на VCC НЕ появляется - это проверьте первым делом.
И хрюкотали зелюки,
Как мюмзики в мове.

На каждый РКН
Найдётся VPN.
Родился
Сообщения: 14
Зарегистрирован: Пн авг 28, 2017 12:31:32

Сообщение Anton991 »

В спящем режиме VCC DS3231 подключено к ноге контролера, которая находиться в режиме INPUT, а на сколько я помню в этом режиме нога подятгивается к земле очень большим сопротивлением, и ток утечки должен практически отсутствовать
Друг Кота
Аватара пользователя
Сообщения: 17071
Зарегистрирован: Пт мар 30, 2012 05:17:29
Откуда: Екатеринбург

Сообщение mickbell »

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

На каждый РКН
Найдётся VPN.
Ответить

Вернуться в «Теория»