Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Борьба за микроамперы
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
ivainc1789
В текущей программе реализован элементарный счетчик секунд на базе таймера2 и часы на его основе. Хотелось бы добиться уменьшения потребления и сделать так, чтобы в sleep mode микроконтроллер просыпался 1 раз в 8 сек (или реже?), а при нажатии пользователем на клавишу просыпался и автоматически корректировал счет времени и показывал его пользователю в формате HH:MM:SS. При этом пользователь не должен заметить самого переключения (по индикации секунд).
Сходу мне удалось только при wake up ждать пока наступит переполнение от таймера, прибавлять 8 сек и только потом переключаться в режим 1 раз в сек используя OC2A. Ясно, что пользователь максимум в течение 8 сек видит что ЧАСЫ ОСТАНОВИЛИСЬ ))). Это плохо. Учитывая, что индикация времени задача типовая может кто-нибудь поделится идеями?
Интересно, почему прескалер таймера2 имеет такой "небольшой" предделитель? Ведь при тактировании от 32.768kHz можно пробуждать контроллер не реже 1 раза в 8 сек. Стоит ли заморачиваться, если потребуется раз в минуту? И вообще заметно ли увеличится при этом жизнь батареи? Количественно оценить не смог...
rx3apf
ivainc1789 Для начала - что выбрано в качестве индикатора ? Потому как обычно индикатор и лимитирует энергопотребление, а прерывания Timer2 - это копейки, при частоте прерываний 16 Hz это порядка пары uA (@3.6V, RC-тактирование), сам осциллятор жрет существенно больше. А вот индикатор со столь малым потреблением - уже непросто (разве что речь о микроконтроллерах с поддержкой сегментных LCD). Да, и за какой бюджет энергопотребления боремся ?
ivainc1789
rx3apf Индикатор у меня LCD WH-1202 но я его отрубаю (как и вообще все перед уходом в спячку). Устройство используется пару раз в неделю, поэтому микропотребление важно... При пробуждении необходимо отображать время с точностью до 1 сек. Питается устройство от двух элементов AAA. Также на борту сс1100, 1wire, клава, пьезоизлучатель. Стабилизатор импульсный L6920 от STM. В принципе я достиг неплохих показателей по потреблению, если выключить часы, то амперметр VC9808 показывает в спячке 38 мкА (верится с трудом, уж очень мало). Работа часов в течение недели в режиме пробуждения MCU 1раз/сек кажется достойной борьбы за использование режима 1раз/8сек или реже. Мне кажется оптимально 1раз/мин. Но... может это нецелесообразно?
rx3apf
Цитата(ivainc1789 @ Dec 15 2009, 00:14) *
Питается устройство от двух элементов AAA. Также на борту сс1100, 1wire, клава, пьезоизлучатель. Стабилизатор импульсный L6920 от STM.

Пардон, а на кой черт там импульсный стабилизатор ? Ради индикатора и 1-wire ? Если ради индикатора, то TIC107 и забыть про проблему питания.
Цитата
В принципе я достиг неплохих показателей по потреблению, если выключить часы, то амперметр VC9808 показывает в спячке 38 мкА (верится с трудом, уж очень мало).

Многовато, вообще-то, если речь идет о экономии. Впрочем, года три от алкалиновых AAA должно работать.
Цитата
Работа часов в течение недели в режиме пробуждения MCU 1раз/сек кажется достойной борьбы за использование режима 1раз/8сек или реже. Мне кажется оптимально 1раз/мин. Но... может это нецелесообразно?

Достижимые цифры я уже привел, даже при 16-Hz прерывании это всего лишь пара uA (осциллятор жрет в разы больше). Но все это меньше упомянутых 38 uA.

Для примера я приведу цифры потребления моих приборов - ~25 uA @3.6V, ATmega8/168 (для 168 - экономичнее) @3.69 MHz, CC1100 с ежесекундным опросом, частота прерываний переполнения таймера - 16 Hz (опрос датчиков).

Радикального снижения энергопотребления (если нужно лишь сохранить ход часов) можно применением специализированных чипов RTC, освободив процессор от этого (и вообще чтобы просыпался лишь по клавиатуре).
SasaVitebsk
Вы можете при просыпании пересчитывать на ходу значения таймера и переинициализировать на прерывания 1с. Причём я делаю даже проще. Можно по другому таймеру сделать прерывания 1с (точность не очень важна, главное чтобы близко было) при просыпании высчитывать значение, не корректируя сам RTC, а только для индикации. Ну а при прерывании от RTC, корректировать это значение.

Для уменьшения можно действительно поставить RTC внешний типа ds1307 к примеру. CR2032 на пару лет хватит. А то и больше - я не смотрел. Стоимость китайских аналогов - меньше 1$.
ILYAUL
Цитата(SasaVitebsk @ Dec 15 2009, 03:18) *
Для уменьшения можно действительно поставить RTC внешний типа ds1307 к примеру.

Так да уж DS1337 и просыпаться по будильнику можно хоть раз в год и сорость записи чтения... клиент ничего и не заметит
ivainc1789
Цитата
Пардон, а на кой черт там импульсный стабилизатор ?
То есть как? Вкл/выкл нагрузок просаживают питание! А нагрузки-то нехилые: что сс1100, что подсветка (LED) LCD. Как вы обходитесь без стабилизатора, если применяете сс1100??? У меня сделано так, что пока батарея свежая - стабилизатор выключен, как только при сильной нагрузке ее напряжение снизится до 2V стаб. включается и уже не откл. в sleep/wakeup. Далее, первое же прерывание от L6920(~LBO) (Vbat = 1.2V) и предупреждаем пользователя "батарея разряжена". Далее, первый же сброс по BOD 1v8 - и попадаем в замкнутый цикл "замените батарею". ИМХО такой подход обеспечит более длит работу от батарей чем вариант без стабилизатора...
Цитата
Вы можете при просыпании пересчитывать на ходу значения таймера и переинициализировать на прерывания 1с.
Об этом то и речь - как это сделать получше. Только нужно учесть, что мало перейти при просыпании в режим 1с, нужно еще и правильно зайти при засыпании в режим 8с. Причем ждать пока окончатся текущие 8с не хотелось бы... Вообщем, наверное тут достаточно использовать вроде только прерывание OC2A, его должно хватить. Остальные процедуры коррекции можно расположить в основной программе. Щас попробую...
Цитата
Для уменьшения можно действительно поставить RTC внешний типа ds1307 к примеру. CR2032 на пару лет хватит.
Это уже изврат в данном контексте. Уже есть две батарейки AAA и мощные потребители.

Сейчас вот подумал: если сс1100 находится в PWD, то стоит ли его это состояние "обновлять" стробом при каждом пробуждении MCU когда нужны только часы (wakeup 1раз в 8 сек)? Для обработки строба сс1100 должен проснуться? Нет ли здесь ресурса для экономии? Но появляется риск, что, например, в грозу сс1100 может сбойнуть сам по себе, перейти в состояние IDLE и разрядить батарею...
SasaVitebsk
Цитата(ivainc1789 @ Dec 15 2009, 20:37) *
Об этом то и речь - как это сделать получше. Только нужно учесть, что мало перейти при просыпании в режим 1с, нужно еще и правильно зайти при засыпании в режим 8с. Причем ждать пока окончатся текущие 8с не хотелось бы... Вообщем, наверное тут достаточно использовать вроде только прерывание OC2A, его должно хватить. Остальные процедуры коррекции можно расположить в основной программе. Щас попробую...


Я немного попроще решение предложил. Представте, что помимо прерывания от RTC(Timer2) вы инициируете прерывание с периодом 1с (Timer0 к примеру). Оно работает только при просыпании и при просыпании пересчитываете текущее время. Именно по этому прерыванию вы и отображаете врямя на индикаторе.

Просто при работе с внешними часами придётся городить что-то подобное. Я, например, DS перечитываю раз в минуту, и по нему корректирую внутренний таймер.
rx3apf
Цитата(ivainc1789 @ Dec 15 2009, 19:37) *
То есть как? Вкл/выкл нагрузок просаживают питание! А нагрузки-то нехилые: что сс1100, что подсветка (LED) LCD. Как вы обходитесь без стабилизатора, если применяете сс1100???

1100 вместе с процессором при максимальной мощности на TX - до 30 mA, я использую литий-тиониловую батарею с довольно большим внутренним сопротивлением, но проблем по причине просадки не испытываю. Правда, супервизор на 2.9V оказался "великоват". А пара алкалиновых батарей - это уж по крайней мере 2.5V даже когда на грани издыхания, а у 1100 нижняя граница питания - 1.8V. Это с запасом. Вот подсветка LED - да, штука прожорливая. Если, конечно, использовать дешевые модули с желто-зеленой подсветкой...
Цитата
У меня сделано так, что пока батарея свежая - стабилизатор выключен, как только при сильной нагрузке ее напряжение снизится до 2V стаб. включается и уже не откл. в sleep/wakeup. Далее, первое же прерывание от L6920(~LBO) (Vbat = 1.2V) и предупреждаем пользователя "батарея разряжена". Далее, первый же сброс по BOD 1v8 - и попадаем в замкнутый цикл "замените батарею". ИМХО такой подход обеспечит более длит работу от батарей чем вариант без стабилизатора...

Соглашусь, пожалуй. Решение вполне разумное.
Цитата
Об этом то и речь - как это сделать получше. Только нужно учесть, что мало перейти при просыпании в режим 1с, нужно еще и правильно зайти при засыпании в режим 8с. Причем ждать пока окончатся текущие 8с не хотелось бы... Вообщем, наверное тут достаточно использовать вроде только прерывание OC2A, его должно хватить. Остальные процедуры коррекции можно расположить в основной программе. Щас попробую...

Проснувшись по внешнему событию, вполне можно вытащить содержимое таймера с разрешением 1/32 sec. А дальше никто не мешает вести отсчет по границе секунды (по компаратору таймера), не перенастраивая прескалер таймера (1024). И обновлять показание на индикаторе раз в секунду.
Цитата
Сейчас вот подумал: если сс1100 находится в PWD, то стоит ли его это состояние "обновлять" стробом при каждом пробуждении MCU когда нужны только часы (wakeup 1раз в 8 сек)? Для обработки строба сс1100 должен проснуться? Нет ли здесь ресурса для экономии?

Для обработки строба - да, должен проснуться. Это довольно быстро (~40 uS), но если это не требуется прибору - то зачем ?
Цитата
Но появляется риск, что, например, в грозу сс1100 может сбойнуть сам по себе, перейти в состояние IDLE и разрядить батарею...

Сам по себе - вряд ли. Но у меня с "высоковольтным" супервизором была проблема, когда просадка из-за передачи сбрасывала супервизор, а трансивер оставался на передаче, и батарейки были такие, что ЭДС оставалась слишком низкой для "реанимации". На всякий случай пришлось ввести ключ по питанию трансивера...
ivainc1789
Нет, все же есть проблема с часами на AVR. Корректировку я сделал правильно и все работает. Но столкнулся теперь с проблемой слишком "резкого" пробуждения микроконтроллера из спячки и связанной с этим просадкой в цепи его питания при отключенном имп. преобразователе L6920. Просадка столь существенная при полуразряженных элементах ААА, что BOD(1v8) срабатывает запросто. Ясно, что имп. преобразователь по питанию отключать нельзя. Вторая проблема - это его включение при пробуждении, приводящее снова к просадке по питанию...
Потребление устройства с ходом часов и вкл. преобразователем составляет около 50мкА, что в принципе приемлемо, но на будущее становится ясно: использование отдельной ИС часов/календаря крайне желательно...
SasaVitebsk
Есть проблема и при засыпании. Всё это уменьшает срок работы от батареи.
Но всётаки при ежедневном включении-выключении мега48 от CR2032 около года жила.

Но неустойчивость, плохая повторяемость и прочие проблемы привели меня к необходимости отказаться от меги. Использую внешние часы. Всётаки удобнее.

MSP430 для этих целей (по общим отзывам) значительнее удобнее. Я думал, разрекламированная PicoPower что-то изменит, - ан нет судя по вашим отзывам.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.