Автономные устройства на базе Atmega328
- Войдите на сайт для отправки комментариев
Добрый вечер! Есть устройство на базе меги328. Ключевое то - что оно автономное, подразумевается питание от батарейки типа cr2450 или 77. Работает все как надо, как только становится возможным, сразу же уходит в крепкий сон, потребляя меньше 1 мка. Как уже стало ясно, мега питается от 3-х вольт, в результате чего снижена тактовая частота до 8 Мгц. Ход работы устройства такой: работает без перерыва в активном режиме, потребляя со всей нагрузкой 7 мА. Из них 3 мА уходят на работу самого микроконтроллера. Если трогать его перестали - сразу же спать. Но вот в чем вопрос. При таком потреблении такой батарейки в лучшем случае хватит на 140 часов непрерывной работы(активный режим). Частоту меньше 8 МГц не сделать, так как скетч немаленький, и занимается выводом времени за сегментный индикатор с помощью динамической индикации, которая ниже 8 Мгц начинает заметно моргать + есть датчики, которые должны все же опрашиваться как можно быстрее, чтобы не пропустить ничего. В перспективе, заменить сегментный LED индикатор на сегментный LCD приведет к потреблению в районе 3.5 мА (если 3 под мегу остаются). Но вот эти вот 3.5 мА от самого микроконтроллера - как ножом по сердцу. Есть ли пути с этим как-то бороться? Может другие модели из линейки avr (dip-8 не пойдет, портов мало)? Я лично имел дело только с 328, собственно к вам и обращаюсь, может что подскажете. По поводу LCD тоже хотел бы услышать от вас. Есть ли шанс его запустить стабильно, использую скажем частоту в 1 МГц у микроконтроллера. В таком случае тут уже не будет той динамической индикации, для которой важно быстро обновляться. Опять же, допускаю, что глупый вопрос, однако у меня с LCD первый опыт знакомства, нету еще на руках, чтобы проверить самостоятельно, только едет. А прикинуть надо. Хочется услышать ваше мнение. Спасибо.
я вижу только один путь - отказываться от динамической индикации. C динамикой никакого энергосбережения не добится - мало того что контроллер спать не может, так еще и LCD потребляет куда больше, чем в статическом режиме.
Если управлять сегментами через сдвиговые регистры, а ардуину отправлять в сон - ток можно уменьшить примерно раз в 10
1 мка!? Это в книгу рекордов Гиннеса. Невозможность динамической индикации при 1 мгц? 1 МИЛЛИОН операций в секунду... Как всё запущено.
Green, наверное, раз ты отвечаешь, ты должен знать, что в режиме сна можно добиться потребления в районе 0.1 мкА. Не понятно, чем тебя удивляет 1 мкА. По поводу индикации. В коде ведь не только динамическая индикация. Как я уже писал, также происходит опрос датчиков. Более того, есть примитивное меню выбора на двух кнопках, которое также тратит на себя время выполнения. Вот в связи со всем этим при 1 МГц экран начинает мерцать очень заметно. Хочется услышать предложения полезные
B707, а можно немного подробнее. Сегментные LCD ведь и так по-иному управляются. Вот у меня должно выводиться время, причём частота обновления должна быть равна 1 сотой секунды, так как сотые как раз самый младший разряд для вывода. То есть ты предлагаешь делать так: записывать в драйвер LCD команду вывести время, допустим, 01.25 (секунды.десятые/сотые), и ложимся спать на 10 миллисекунд? А далее выводим 01.26 и опять повторяем?
Грин прав. Цифра 0.1 просто показывает, что вы абсолютно не в теме. Смотрим табличку ниже. Да, там есть строчка со значением 0.1 мкA Но это дипслип с полностью выключенной периферией. А просыпаться вы как будете? Для вашего случая абсолютный предел - вторая снизу строчка, 4 мкА. Так что никаких 1 мкА у вас быть не может.
Все это требует затрат приборного времени, ничтожного по сравнению с индикацией. Простите. но ваши рассуждения наводят на мысль, что в программировании вы разбираетесь не очень. Так что скорее всего, экран мерцает вовсе не от того, что МК не справляется, а из-за криво написанного кода...
не зная назначения устройства и не видя скетча, сложно что то советовать. Напоминает карманный датчик какого либо газа/дыма и/или других физических величин. Если подразумевается работа в полях, то такие вещи делают заряжаемыми, т е ночью зарядил весь день/смену отработал. На что может не хватить 140 часов непрерывной работы?
если вы делаете секундомер с выводом сотых, то думаю никакой сон ни на каком дисплее вам не поможет.С другой стороны, непонятно, разве для секундомера 140 часов работы от батарейки - мало? Даже в знаменитой гонке Ле ман всего 24 часа. что вы там собрались отсчитывать с такой точностью?
Минимум, который мне удалось получить. Всё отключено, кроме WDT, частота 8 Мгц от внутреннего RC, питание один 18650
ТС кудат пропал, опять не так помогаем :)))
TC никуда не пропал! Просто нету возможности постоянно присутствовать на форуме. По поводу навыков и опыта я ни на что не претендую! Фактически, эта вещь - мой первый немаленький проект. И, что естественно, говорить о полностью оптимизированном коде пока что не приходится. Поэтому и обращаюсь к вам. А теперь по делу.
Ключевым у устройства все равно остаётся достижение наибольшего времени автономной работы. Спрашивали про 140 часов - это конечно неплохо, но вот 500 - было бы просто превосходно. Теперь про потребление в режиме сна: естественно, режим Power-Down mode + отключение АЦП+отключение BOD. Выход из сна с помощью прерывания по кнопке. При прямом измерении амперметром показывает меньше одного микроампера. А вот, кому интересно, видео для демонстрации, начиная с 10:30 по ссылке https://www.youtube.com/watch?v=urLSDi7SD8M&list=PL0JWuCHXfJ2zjHiHtHUO2AjGQ1pP4Bzab&index=3&t=798s&ab_channel=KevinDarrah . Я ваши советы буду пробовать учесть. Поиграюсь с динамической индикацией, как вы сказали, которой 1 МГц будет более чем предостаточно. В случае неудачи отпишусь, приложу код и выслушаю ваши наставления. Спасибо.
Westwood, вы наверное не поняли, зачем мерять что то 140 или 500 часов я могу понять, но автономное устройство которое меняет это в никуда - зачем? Никто не будет смотреть на дисплей час или два......
Andycat, я вас пытаюсь понять. Но дело в том, что вот это вот ключевое у этого устройства. Просто есть таймер четырехразрядный, измеряющий время между двумя срабатываниями датчиков, и вот просто необходимо сделать так, чтобы этот таймер в режиме вывода цифр на экран работал как можно дольше. Возможно, вам кажется это совершенно бесполезным. Но стоит одна цель: Оптимизировать так,чтобы его непрерывная работа была максимально долгой.
Rtc + МК, срабатывает от двух импульсов и прекрасно измеряет время между ними. Отображение в момент импульсов. Все.....при умелой реализации на пол года батарейки точно хватит. Но тема не раскрыта : нахрена отображать время таймера в течении кучи часов?
Теперь про потребление в режиме сна: естественно, режим Power-Down mode + отключение АЦП+отключение BOD. Выход из сна с помощью прерывания по кнопке. При прямом измерении амперметром показывает меньше одного микроампера.
это все замечательно, но если МК просыпается по кнопке - каким образом вы собрались обеспечить обновление картинки на экране с частотой 100 Гц ? Сон с периодическим просыпанием, насколько я знаю - можно организовать только через WDT - а это, возвращаемся к таблице выше - потребление 4 мкА,
Именно об этом я и писал вам ранее - режим с потреблением менее 1 мкА есть, но задествовать вы его не сможете, для вашего случая минимум - это 4 мкА
Ну или может я чего не понял. с удовольствием выслушаю поправки
Andycat, тем временем благодаря вашим советам и советам уважаемого b707 мне удалось добиться небольшого успеха. За что вам спасибо. Согласен, глаз у меня еще не набит. Неправильно игрался я с понижением частоты. Теперь понизил до 1 Мгц, по итогу получил полное потребление всего устройства в среднем 2 мА (так как на LED индикатор постоянно выводятся разные цифры, в зависимости от того, сколько сегментов зажжено). Появилось паразитное свечение сегментов, но удалось справится корректировкой кода. Теперь, используя cr2077, например, можно надеяться на 400-450 часов думаю. Надо проверить на практике. Говоря о том, что вас так сильно неймёт, а именно о том, зачем надо столько работать таймеру, отвечаю: задача в том, чтобы как можно дольше это устройство функционировало без замены элемента питания, вот и все. Никто не собирается на него смотреть по 10 часов каждый день. Условно в день по часу применения по назначению, и тогда хватит на год. Это ли не здорово.
это все замечательно, но если МК просыпается по кнопке - каким образом вы собрались обеспечить обновление картинки на экране с частотой 100 Гц ? Сон с периодическим просыпанием, насколько я знаю - можно организовать только через WDT - а это, возвращаемся к таблице выше - потребление 4 мкА,
Я так понял, что устройство спит с выключенным wdt до нажатия кнопки. Потребляет при этом меньше 1мкА - ок. А вот после пробуждения начинается активный режим работы устройства и речь об уходе в сон уже не идёт, потому что надо опрашивать какие-то датчики и обновлять дисплей.
Если уйти от динамического обновления индикаторов, то можно попробовать уводить МК в сон на 16мс и просыпаться по WDT. Устроит ли ТС такая частота опроса датчиков? Но в любом случае МК жрет 3мА из общих 7, т.е. серьезно сэкономить на нем не получится.
b707, возможно мы с вами друг друга не поняли. Дисплей работает только тогда, когда устройство не спит, как бы это было неочевидно. То есть, скажем, таймер отсчитывает время и выводит на экран - то устройство в сон не уходит в этом процессе. Затем остановили таймер, через 15 секунд он сам уйдет в сон до следующего пробуждения по кнопке с помощью прерывания. А про это я уже выше сказал, как удалось добиться меньше 1 мка, и даже видео привёл.
VladimirTsibrov, спасибо за совет! Но вот выше вашего сообщения разместил новые показания. Всё же удалось добиться в среднем потребления 2 мА.
b707, возможно мы с вами друг друга не поняли. Дисплей работает только тогда, когда устройство не спит, как бы это было неочевидно. То есть, скажем, таймер отсчитывает время и выводит на экран - то устройство в сон не уходит в этом процессе. Затем остановили таймер, через 15 секунд он сам уйдет в сон до следующего пробуждения по кнопке с помощью прерывания.
нафига тогда сон, если устройство не нужно? - выключайте его и все
Избавиться от лишних кнопок. Одной достаточно, которая для управления.
Избавиться от лишних кнопок. Одной достаточно, которая для управления.
Tак и питание включать можно этой же кнопкой.
Установлена тактовая кнопка, с помощью которой осуществляется управление секундомером. А также на ней висит функция ухода в сон. Под включением питания вы имеете в виду замыкание цепи это кнопкой?
Под включением я имею ввиду включение МК по нажатию этой кнопкой. Ею так же можно управлять секундомером и выключать МК если там есть пара независимых контактов. Ну еще потребуется транзистор и несколько резисторов.
Asam, спасибо за идею! Но тем не менее, насколько эффективнее может быть ваша реализация? Токи утечки присутствуют в любом транзисторе, и в принципе любой новый электронный прибор будет увеличивать токопотребление. Не понятно насколько они будут меньше, чем в данном режиме сейчас при токе во сне примерно в 0.3 мкА.
Уважаемые господа, тем не менее, появился к Вам новый вопрос. Ниже приведен код данного устройства. Я постарался максимально все подписать комментариями. Вопрос вот в чем. Некорректно работает функция micros. При выставлении длительности одной сотой секунды (переменная TIME_2) по какой-то причине первые 60 секунд отсчитываются быстрее, чем все следующее время. То есть в сравнении с эталонным временем на первых 60 секундах данный таймер ускоряется, обгоняя эталонное время на 5 секунд, а затем, когда начинается заполнение минут, начинает отставать примерно на 5 секунд за каждую минуту. Атмега тактируется 1 МГц внутрений RC-генератор. Питание 3 В. Смущает такое странное поведение, что сначала ускорение, а затем замедление. Понятно, что при понижении частоты уменьшается и точность работы. Хотелось бы услышать ваше мнение,с чем это может быть связано. Спасибо!
PS один из первых больших кодов, поэтому буду рад принять уважительную критику, без наездов. Спасибо!
Green, спасибо за информацию! Приму к сведению. По поводу вот этого вкл/выкл битов в регистрах, не расшифровал, так как полагаю, что не они являются причиной проблемы, которую я описал. Добавлю туда комментарии.
По поводу вот этого вкл/выкл битов в регистрах, не расшифровал, так как полагаю, что не они являются причиной проблемы, которую я описал.
Добавил комментарии. Я ведь писал об этом.
При внутреннем RC генераторе и тем более 1мгц тактовой даже не пытайтесь выловить правильное время. Выше же писали - МК со спящим режимом и rtc - оптимально для вашей задачи.
Andycat, спасибо, не сразу обратил внимание. Пойду копать в этом направлении.
Динамическую индикацию лучше всего вешать на прерывания таймера. И работает стабильнее и код гораздо компактнее получается.
Зато без прерывания меньше проблем.)
ТС, я бы посоветовал вставить вывод n в case1 и включить "показать отметки времени" в мониторе порта. Таким образом вы проконтролируете время и кол-во приращений секундного счётчика. Потому что +/- 5 сек в минуту не должно быть ни от какого генератора.
Зато без прерывания меньше проблем.)
Проблемы с прерываниями от таймера? Ну это надо очень кривые руки иметь.
Именно такие они у начинающих. Да и volatile забывают многие.
Кстати, ТС, впишите volatile в 44 строку.)
По-хорошему бы вообще использовать ATOMIC_BLOCK при работе с counter
Green, спасибо за указание на ошибки! Попробую промониторить изменение счётчика. Но вот сейчас в то же время крепко уцепился за идею использовать rtc.
крепко уцепился за идею использовать rtc.
Это должна быть не идея, а заученное однажды, как отче наш, решение. Там, где нужно мерить какое-нибудь время - хоть 1307 да поставь, оно много не съест. (Но лучше 3231, не намного дороже, а точность - мммм, на годы забудешь, что такое часы подводить)
DetSimen, да, это я уже усвоил. По поводу микросхемы - на руках 1302 есть. Привлекает очень низкое заявленное энергопотребление в 300 нА. А про точность - то максимального высокого класса точности ставить нет необходимости, так как замеряются относительно короткие промежутки времени, и класса точности у 1302 с заявленным отклонением 5 секунд в сутки по сути более чем достаточно
Только не понятно зачем тут RTC, если нужен таймер - просто счётчик времени.
Только не понятно зачем тут RTC
У ей прерывания есть, с достаточной точностью, чтоб интервалы щитать. :)
Ну если так, тогда да.) Но всё равно миллис проще считать.) И на 100 минутах погрешности быть не должно.
Ну если так, тогда да.) Но всё равно миллис проще считать.) И на 100 минутах погрешности быть не должно.
В режиме PowerDown, с.ка, всё по другому происходит. :) Поэтому, я - за RTC с прерываньями.
Я тоже за 3231, главное 3231SN, ибо 3231M как раз точностью не отличается. Опять же, у нее есть встроенная возможность батарейного питания, и можно разнести задачи. :)
Я тоже за 3231, главное 3231SN, ибо 3231M как раз точностью не отличается. Опять же, у нее есть встроенная возможность батарейного питания, и можно разнести задачи. :)
Знать бы где эти SN брать... А то кетайцы фотки выставляют с 3231SN, а присылают с 3231M
А никто не имел опыта работы с MCP7940N? RTC если что
А никто не имел опыта работы с MCP7940N? RTC если что
А что конкретно интересует? Он от внешнего кварца работает и точность от кварца зависит. Там программный трим есть если кварц стабильный, но частота немного отличается. На модули, обычно, дешевые керамические резонаторы ставят, а они туда-сюда плавают и трим не поможет.
В режиме PowerDown, с.ка, всё по другому происходит. :) Поэтому, я - за RTC с прерываньями.
Не катит.) У ТС подсчёт времени идёт только в активном режиме, с индикацией.
Знать бы где эти SN брать... А то кетайцы фотки выставляют с 3231SN, а присылают с 3231M
В Дипе есть, в Электронщике есть, в Платане пишут срок 5 дней. Не Китаем единым. :)