|
|
![]() ![]() |
|
|
![]() ![]() ![]() ![]() |
|
Опции темы | Поиск в этой теме |
![]() ![]() |
![]() ![]() |
|
Ветеран Фонарёвки
|
![]()
Он и не собирается спать, отучил я его от этого
![]() ![]() ![]() ![]() ![]() ![]() А вот вспышка при переходе с режима на режим... хм... надо посмотреть, откуда она берется. Цитата:
![]() ![]() Давайте еще батарейку дюрасел вспомним с индикатором заряда из фольги, которую током разогревает до 80 градусов, и жрет тот индикатор под 100 милиампер ![]() А эта схема хоть и не идеально, но работает, и со своей задачей справляется ![]() |
|
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Ветеран Фонарёвки
Регистрация: 15.02.2010 Последняя активность: 24.08.2019 11:36
Сообщений: 1342
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
![]()
Дык а при чём кнопка к слипу? Слип в данном случае даёт две вещи:
- МК меньше жрёт, т.е. он уходит в спячку после выполнения действительно необходимой работы, до возникновения следующего события, требующего обработки. Чтоб обработать тот же светик, скажем с частотой в 1кГц, необходимо потратить явно не 8000000/1000=8000 тактов. Справится можно и за 1-2 десятка тактов (даже с программной модуляцией всех светиков), и дальше снова жрать 0,2мА (и-то в основном ИОН'ом). Зачем экономить? на АЦП меньше помех, проще фильтровать само питание МК. Можно, к примеру, втулить на его Vcc резистор на 100 Ом, тогда и переполюсовка чипу будет не страшна. Да и жрать индикатор в целом будет боле чем в 2 раза меньше. - Второй момент, это освобождённый от неблагодарной работы АЛУ, который может в свободное время делать что-то другое, пока за него считает таймер... То что индикатор не моментально реагирует на изменение питания - серьёзным недостатком действительно назвать нельзя, но и преимуществом тоже. Иногда полезно наблюдать как проседает под нагрузкой напряжение и т.п., правда в светофоре слишком грубая шкала, чтоб ловить подобные моменты... |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
|
Ветеран Фонарёвки
|
![]() Цитата:
Я не думаю, что индикатор всё время включен будет, пока работает устройство, я так понимаю, предполагается проверять заряд время от времени подключая его к аккумулятору. Цитата:
![]() Хотя с тем, что МК использует кучу ресурсов в пустую я согласен, говорю же код примитивный, и можно сделать гораздо лучше. Можно было использовать его на заводских настройкац с частотой 1 мегагерц, в этом случае потребление было бы даже ниже. |
|
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Ветеран Фонарёвки
Регистрация: 15.02.2010 Последняя активность: 24.08.2019 11:36
Сообщений: 1342
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
![]()
Понижение частоты экономичность не повышает. На неё влияет только объём вычислений и напряжение питания. Благодаря снижению частоты можно уменьшить напряжение питания, и только тогда добиться экономии. А с одинаковым напряжением питания потребление не изменится. Толку от того что операций за единицу времени будет производится меньше? Сами операции будут обрабатывать задачу в столько же раз дольше. Вывод: если питаем литием - ниже 8МГц частоту опускать смысла просто нет. Только латентность поднимем...
Я не понял при чём к RC-фильтру, на Vcc МК, понижалка с высоким КПД. Смысл то не в понижении напряжения, а в фильтрации и защите от переполюсовки (вместо полевика). Высокоомный резистор с этим справляется лучше, чем низкоомный, но на нём проседает недопустимо высокое напряжение при таком потреблении. Тут более оптимальный код позволил бы упростить схему и улучшить её характеристики. Задержка АЦП нужна при устаканивании переходных процессов, да, но они ведь далеко не всегда происходят. К примеру если ты выходишь из режима "Idle", то просыпается только АЛУ, при этом все таймеры, питание, АЦП и т.п. как работали, так и продолжают работать. В этот момент просто начинается очередная пачка помех от АЛУ, пока он не обработает задачу. Остальное же время МК работает, АЦП снимает семплы, таймер считает время, но помех уже гораздо меньше (жрёт то МК импульсами, и почти всё хренпоймическое потребление приходится на АЛУ, остальные узлы потребляют более менее равномерно) и задержки тут только навредят, т.к. оверсемплинг никто не отменял. Усреднение зашумленных семплов повышает эффективную разрядность АЦП. Шум полезен, но его всё же желательно сводить хотя бы к половине LSB (а ещё лучше, если шум всегда известен, чтоб его затем вычесть). И чем больше семплов усреднишь - тем качественнее получишь сигнал, поэтому всякие там выжидания, задержки и т.п. в ряде случаев даже нежелательны... Я с этого АЦП спокойно и 16 бит получаю... |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Ветеран Фонарёвки
|
![]()
Если от RC цепочки работает - то да. Он всё равно на 8 мегагерцах, но разве, микроконроллер еще что то делает, когда частота делится на 8? он что то делает каждые 8 тактов а не каждый, потребление хоть и не сильно значительноо, но уменьшится.
А шумы - это да, обычно делаю 8 выборок и усредняю. От сетевой помехи 50 церц вообще избавиться легко, делая замеры за 1 период, и она автоматом вычитается. Потребление кстати снижается, при снижении напряжения питания МК ![]() |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
|
Ветеран Фонарёвки
Регистрация: 15.02.2010 Последняя активность: 24.08.2019 11:36
Сообщений: 1342
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
![]() Цитата:
Поехали дальше. Есть у нас прерывание, обработка которого требует 100 тактов: 10нДж*100=1мкДж. Если МК успевает всё обработать вовремя, то на в 8 раз более высокой частоте он будет справляться в 8 раз быстрее, и среднее потребление останется на прежнем уровне. Снижение частоты позволяет ключам работать более устойчиво, и снизить напряжение питания. Вот оно уже значительно сокращает затраты на перезаряд паразитной ёмкости этих ключей... Остальная же периферия хоть и вносит заметное влияние на потребление, в зависимости от частоты - всё же напряжение влияет куда больше... Спать ты его не отучил - ты его и не научил. Получил семпл, обработал его, заснул в ожидании следующего события. Получил прерывание от таймера - О! Надо переключить светик. Сделал - опять уснул... Или получил любое событие - проснулся и пошел высматривать что же там произошло, увидел флаги, которые после себя оставили прерывания, и принялся за работу. Т.е. всё выполняется в одном цикле, но его надо построить так, чтоб на анализ уходило минимум ресурсов. В таком случае код получается последовательным и понятным. Я пробовал на Си написать программку под МК - ассемблер мне показался на порядок функциональнее, более удобным, компактным и быстрым. |
|
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Увлеченный
Регистрация: 18.08.2011 Последняя активность: 11.08.2015 21:34
Сообщений: 61
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
![]()
Проверял новую прошивку вчера в попыхах в самом конце рабочего дня. Вроде работает. Думаю задействовать вторую ногу всё-таки надо, чтоб при включении фары включалась индикация (на нее подавался сигнал с платы управления драйвера). Думаю не очень удобно будет ставить отдельную кнопку для включения индикации.
|
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
|||
Ветеран Фонарёвки
|
![]() Цитата:
Цитата:
Цитата:
Я выбрал С так как у меня не времени сидеть и изучать ассемблер, я пошел по пути наименьшего сопротивления, каждый пишет на том, что ему больше нравится. Да, о преимуществах ассемблера я знаю, так же как и о его недостатках, я выбрал то, что мне удобнее. Переписать эту прошивку не сложно. Кстати она не испотльзует таймер - да да, и шим генерирует по ходу выполнения. Повторяю еще раз, это первая моя прошивка, в которой я кое что подправил. Я начинал не с того что зажег светодиод на одном из портов, а вот с этой прошивки, так ли она ужасна для первой? И как её переписать я прекрасно знаю. |
|||
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Ветеран Фонарёвки
|
![]() Цитата:
Если всё же делать дополнительную кнопку, то на какой сигнал она должна реагировать? на высокий или на низкий? Сейчас прошивка при подачи питания работает всё время, я думал использоваться будет изредка, для проверки напряжения на аккумулятороах. Если всё время, о потребление действительно для индикатора многовато. |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Ветеран Фонарёвки
Регистрация: 15.02.2010 Последняя активность: 24.08.2019 11:36
Сообщений: 1342
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
![]()
Ryazanec. Зачем нервничать?
![]() У тебя не возникает желания причесать свой код хотя бы для спортивного интереса? Учиться юзать прерывания и слип тут стоит начинать как можно раньше. Это ведь не компьютер из большого мира, в котором все разруливает ОС. Индикатор для образовательных целей не плохо подходит. Тут сталкиваешься и с ШИМ, и с АЦП, и с прерываниваниями, и со спящими режимами... При этом все наглядно работает и нет ничего заумного. |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Ветеран Фонарёвки
|
![]() Цитата:
Этот код причесать желание возникло. Думаю сегодня этим и займусь. Мне отлаживать только не где, это в протеусе не отладить, там можно только понаблюдать за внешней реакцией, энергопотребление не замерить. Прерывание я всё же использовал, когда из спячки его пробуждала кнопка, а вот в простое вместо спячки у меня МК nop ами занимался (думаю библиотека delay.h расчитывает в зависимости от частоты МК только количество простоя). Реакцию мгновенную на АЦП всё же делаьт не буду, хотя это и не сложно, в моем случае проседание напряжения аккумулятора не будет таким быстрым. |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Увлеченный
Регистрация: 18.08.2011 Последняя активность: 11.08.2015 21:34
Сообщений: 61
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
![]() |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Ветеран Фонарёвки
|
![]()
Тогда нужно еще один резистор в схему иначе он от наводок включаться будет. Прошивку я ради интереса доработаю.
Отлаживать пока только не на чем, кроме протеуса. |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Увлеченный
Регистрация: 18.08.2011 Последняя активность: 11.08.2015 21:34
Сообщений: 61
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
![]()
Резистор так резистор) Спасибо за все старания!
|
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Ветеран Фонарёвки
|
![]()
INFERION
Переделал немного прошивку. Полностью не оптимизировал, можно еще поднастроить, но можеш проверить на реальном МК, стало лучше? На твой взгляд. надо еще подумать как его полностью усыпить когда он не активен (кнопка не нажата). Тут кстати теперь задействована кнопка. Шим попрежнему генерируется в цыклах, но в простоях засыпает (IDLE MODE - только в нем тинька просыпается от переполнения таймера) отсюда и куча ненужного кода (а то опять помидоры полетят). Кстати разные версии компилятора по разному выдают код, причем разница приличная, с чем связано не пойму, настройки проекта и компиляторов одинаковые. |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Ветеран Фонарёвки
Регистрация: 15.02.2010 Последняя активность: 24.08.2019 11:36
Сообщений: 1342
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
![]()
Без помидоров всё равно не получится. Я ведь так люблю ими бросаться
![]() Опять сейчас много текста будет. Скучно мне тут сидеть, с солдафонами и поговорить не о чём. В голове у них только сиськи, пиво ![]() 3,14мА на 3,9V. Уже гораздо лучше, но можно ведь и ещё меньше. А почему не слепишь нормальный ШИМ, где переполнение таймера зажигает сразу все светики, а его компаратор тушит необходимые? Это вообще практически аппаратная реализация. Или сигма-дельта модулятор, вобще интересная и простая штука. Разве что требует прерывания с частотой в десятки килогерц. Посему Сишный код нежелателен, ибо количество команд критично. Суть заключается в простом добавлении заданного значения к регистру, который является как бы накопителем ошибки. При переполнении зажигать светик, если переполнения нет - тушить (командой условного перехода, проверяющей переполнение). Я не знаю как такое вообще в Си нормально построить, а на ассемблере всего 4 такта для 16-ти бит (плюс код, который что-то включает, или выключает). Килогерцевый 8-ми разрядный ШИМ будет заметно мерцать при взмахах, в то время как СДМ, затактированный частотой в 256кГц (такая же частота требуется и таймеру ШИМ), на этой частоте будет шуметь только 8-м битом, что в 256 раз меньше чем у ШИМ, а с дальнейшим снижением частоты этот шум будет и дальше падать. И на десятках герц разрядность будет куда выше чем у ШИМ. Вывод из этого простой - СДМ может работать на гораздо меньших частотах, чем таймер ШИМ. К сожалению в АВР он реализуется программно, и требует не мало тактов. У меня получилось на всё прерывание 28 тактов (вроде, или 32, не помню что симулятор показал), это на три 16-ти разрядных канала: Хотя команды sbi и cbi, которые жрут по 2 такта, можно попробовать заменить какой-нить однотактной альтернативой, и сэкономить ещё такта три. Ещё на пару тактов можно похудеть, если копировать регистр с флагами в отведённый для этого регистр (например R0), чтоб не таскать его в стек и обратно. Но это я уже под конец реализую, если заваляются лишние регистры. P.S. Прелесть ассемблера - чётко видишь что и как работает, где, что и как можно оптимизировать. А компиляторы не люди, порою лепят не то что не оптимальный, а вообще неработающий или криво работающий код, т.к. им ещё надо уметь правильно объяснять что ты от них хочешь. В данном случае вместо половины регистров, зарезервированных под нужды СДМ, компилятор бы расположил переменные в ОЗУ, и сожрало бы это более чем на 26 тактов больше (достать, а потом ещё и спрятать), плюс все использующиеся регистры он бы прятал в стек, даже если их содержимое никому неинтересно. Ещё я хз как юзать там флаги, и пришлось бы проверять переполнение более костыльными, арифметическими действиями. Сколько это съело бы тактов - я и предположить не могу. Я полистал листинги GCC и решил ещё немного посидеть на ассемблере. Не умею я нормально кодить на ЯВУ под МК ![]() |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Ветеран Фонарёвки
|
![]()
Можно, чем я и занимаюсь. На С сложно подгонять интервалы, так как код на выходе иногда работает дольше, чем ожидается. Но и в ассемблер пока лезть не хочу, своих сложностей в нем хватает.
Новая прошивка. Уже что то менять лень... Program size: 416 words (832 bytes), 20,3% of FLASH |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Ветеран Фонарёвки
Регистрация: 15.02.2010 Последняя активность: 24.08.2019 11:36
Сообщений: 1342
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
![]()
2,8мА, в спячке 0,25мА. В принципе разве что спящий режим допилить, отключать ИОН перед уходом в глубокий сон. Тогда МК меньше микроампера жрать будет...
2,8мА против 15-ти + более компактный код. Как бы уже ощутимо ![]() ![]() |
![]() |
![]() ![]() |
![]() ![]() |
![]() ![]() |
Ветеран Фонарёвки
|
![]()
Ион не вырубается, возиться надо.
MCUCR=0b10110000; MCUCR=0b10110100; #asm("Sleep"); надо с режимами поиграться, соберу на макетке, тогда отлажу и это. Denis Могу тестовую прошивку выложить. Меня попросили сделать для автомобильного аккумулятора такой же индикатор, буду дорабатывать этото проект. Сегодня печатку попробую сделать. |
![]() |
![]() ![]() |
![]() |
![]() ![]() |
Ветеран Фонарёвки
Регистрация: 15.02.2010 Последняя активность: 24.08.2019 11:36
Сообщений: 1342
Сказал(а) спасибо: 0
Поблагодарили: 0 раз(а) в 0 сообщениях
|
![]()
Вот пример функции, отвечающей за слип в старой версии моего индикатора:
По-сути это главная функция, всегда работающая в фоновом режиме. После любого события она проверяет активность кода и выбирает соответствующий режим сна. Тут есть пример отключения ИОН. Обрати внимание на команды sei и cli. На время отключения ИОН нужно запрещать прерывания, т.к. у тебя всего несколько тактов, чтоб его отключить и уснуть. Си врятли в них укладывается, слишком он уж костыльно всё выполняет. Ещё один важный момент - BOD это не ИОН, а супервизор. ИОН отключается, если его ничего не использует. Для того чтоб он заглох - обычно приходится глушить 3 вещи - АЦП, компаратор и супервизор. Они у тебя точно отключаются все? P.S. Сократил число тактов модулятора до 18 (почти в 2 раза): Код стал гораздо компактнее и без каких-либо переходов и битовых операций с РВВ, жрущих по 2 такта. Опять же всё благодаря использованию флагов, с которыми в Си я хз как работать. Теперь переполнения просто засовываются в регистр сдвигом, через флаг переноса. И одним тактом под конец выводятся в порт... |
![]() |
![]() ![]() |