Как стать автором
Обновить

Выжимаем ATtiny10, практическое применение

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров18K
Всего голосов 67: ↑67 и ↓0+67
Комментарии46

Комментарии 46

Но эти 100 мелких светящихся засранцев наваливались на батарейки так, что потребление было около 1А. Сколько работал первый набор батареек я не засёк, перешёл на аккумуляторы, но и их выносило за 2-3 часа.
Я с такими гирляндами поступил проще: припаял 3мм гнездо под трубчатый штекер параллельно крайним контактам батареек и подключал к старому нокиевскому ЗУ (туда на конец провода соответствующий штекер припаял, благо я давно штекеров и гнёзд таких пару десятков для самоделок покупал).
Т.е. можно отключать от ЗУ и снова вставлять батарейки.
С другой такой гирляндой сделал ещё проще: припаял таким же образом гнездо microUSB и подключаю старое ЗУ на 700мА через стандартный шнур.

P.S. Напротив гнёзд, естественно, в корпусе сделаны отвертстия под соответствующие штекеры. Ну и сами гнёзда зафиксированы термоклеем.

Вот странно - и микроконтроллер на 12 МГц, и мощный полевик - и тут 10 Ом балластный резистор... Какой-то фейспалм.

Почему фейспалм?

Потому что при использовании ШИМ можно обойтись вообще без балластных сопротивлений?

Импульсные токи большие могут быть, лучше уж так.

По моему, пусть лучше лишний резистор, но полный диапазон значений ШИМ и уверенность в значении максимального тока потребления. Да и программировать так проще.

Во, точно! Смысл моей телеги в двух предложениях)

Не знаю как обойтись. Ведь светодиод - это токовой прибор, тут ШИМ ведь не используется для управления напряжением, а используется для управления яркостью только благодаря интегратору яркости в человеческом глазе) А ток в моменты открытия транзистора течёт максимальный возможный для этой цепи. Без резистора, 1-2 ампера, которые выдает батарейный блок распределяются поровну и каждый диод получает 10-20 мА - это, зачастую, для таких диодиков максимальный ток и большим можно их спалить (например, если попадутся качественные батарейки, которые отдадут больше чем 2А).

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

Но, соглашусь, что резистор на фото некрасивый ))) Поэтому я разводку подрихтовал, нашёл место для smd.

Поставьте не резистор, а дроссель, сделайте buck-преобразователь.

И что, при этом между анодом и катодом диода будет разность потенциалов не меньше 3 вольт и при этом ток в наноамперы?

Хотел сказать "в сотни микроампер".

При этом между катодом и анодом диода будет ровно такая разность потенциалов, которая нужна для желаемого тока, и микроконтроллер сможет произвольно выбирать ток. Это принцип действия понижающего преобразователя в режиме стабилизации тока.

По нормальному - ставят LC фильтр, получается полупрограммный dc/dc.
Даже уж на что китайцы экономные, но ставят такое иногда даже на платки плавной регулировки скорости вентилятора.

Тоже выход. Но тогда стоит поставить обводной диод вдобавок к транзистору и задрать частоту повыше для уменьшения габаритов дросселя. А тут уже, скорее всего, затвор полевичка микроконтроллер уже не раскачает, понадобится драйвер какой-нибудь... Зато можно будет легко умощнить всё.

Короче, я так делал, идея рабочая, но со своими плюсами и минусами. Всё-таки один резистор припаять гораздо проще и при этом не сильно хуже в данном случае.

Это если мы регулируем напряжение. А тут диоды, они работают на постоянном значении тока. ШИМ только для управления соотношением времени включено/выключено в секунду.

Есть модное слово dc-dimming, но и там ограничения. Менять рабочий ток светодиода без нюансов относительно яркости/цвета можно только вверху рабочего диапазона - от максимального до минимального по даташиту. Для этого, действительно, можно проинтегрировать ШИМ-сигнал так чтобы полученное напряжение давало нужный ток. Но как только мы приблизимся к границе минимального тока через диод, начнутся проблемы связанные с разбросом характеристик каждого диода. Появятся разные оттенки, какие-то будет ярче, какие-то темнее. И при этом средний уровень будет всё равно слишком яркий. Поэтому в смартфонах, где этот dc-dimming есть, на низких значениях яркости опять включается ШИМ,

Вот пример того как светится светодиодная лента на минимальном токе без ШИМ и как разброс характеристик диодов виден вживую.

Бесплатный дополнительный эффект для гирлянды!

Увы нет :) Если ещё немного прибрать напряжение источника питания так чтобы оно стало меньше падения напряжения на диоде, то они резко разом все погаснут. Минимальной яркости так не добиться.

И даже хуже, по моему опыту это произойдёт уже примерно на половине дистанции между "не светит" и "светит максимально ярко".

У меня при последовательном соединении светодиодов (плата со светодиодами из лампы Remez) DC-димминг отлично работает от еле заметного свечения до яркости, достаточной для настольной лампы. Только ШИМ пришлось делать 10 бит и заморочиться с самодельным драйвером, который реагирует на ШИМ примерно по экспоненте.

Минимальной яркости так не добиться.

кстати да, согласен, но у вас же целых 64 байта ещё!)
можно сделать ШИМ второго порядка когда будем не просто двигать скважность, а ещё и нормированными по току импульсами)

Нельзя. Дело не в яркости, а в регулировке пикового тока. При использовании ШИМ можно заменить резистор дросселем и диодом, сделав фактически buck-преобразователь, но совсем выкидывать нельзя. Работать-то будет, но срок службы светодиодов снизит резко. В дешевых длинных гирляндах, где светодиоды просто воткнуты последовательно без регулировки тока, летит по одному светодиоду за сезон.

мощный полевик

Подскажите, как правильно оценить мощность полевика: если смотреть на Figure 9. Maximum Safe Operating Area в datasheet, то при 3.6-4В при длительности нагрузки 1с (примерно как горит гирлянда на максимуме) ток не должен превышать 0.6-0.7А. Исходя из этого нужно выбирать резистор (или рассчитывать ШИМ с соответствующей скважностью). Это правильные рассуждения?

то при 3.6-4В

Нет. Это напряжение на нагрузке. На открытом транзисторе напряжение будет гораздо меньше: протекающий ток, помноженный на сопротивление канала.

Пускай на затворе будет 2,5 вольт, тогда номинальное сопротивление канала получится 70 мОм. То есть при токе 1 Ампер получим 70 мВ на транзисторе и выделившуюся мощность 70 мВт. Совсем немного.

Спасибо, стало ясно

Можно почитать статьи со схемами драйверов для фонариков всяких (вроде тут не единожды были, ещё можно на муську и фонарёвку заглянуть, ну и ещё есть другие железнячные сайты/форумы).

Не нашёл в статье информации о напряжении питания схемы, но судя по характеристикам тиньки — это максимум 5В. ЗУ от мобилки, что ли будет в качестве БП?
Если это так то ток будет не таким уж и большим (особенно если БП не слишком мощный). Тем более, что я выше писал, что я такую же гирлянду запитал напрямую от ЗУ на 700мА (но ограничительный резистор оставил в схеме, т.к. у меня нет никакой регулировки по току).

Ну а максимальную скважность можно же сделать зависимой от напряжения питания или тинька такое не умеет определять?

Она же на батарейках :) Изначально гирлянда рассчитана на 1.5Вх3=4.5В. Я использую 1.2В Ni-Mh аккумуляторы, получается 3.6В.

Ёлок подключенных к розетке я иррационально очень боюсь:)) Поэтому использую только батареечные гирлянды. Но в целом, наверное, ЗУ от мобилки будет лучше, чем дешёвый комплектный китайский БП без развязки.

Чтобы программно сделать скважность зависимой от напряжения, нужно замерить напряжение (не помню чтобы у тиньки можно было это значение прочитать из регистров). Это ещё несколько деталей на делитель и код для замера. В килобайт не влезет. Как и на одну сторону такой платки)

Она же на батарейках
И?
Светодиоды, по идее рассчитаны на 3В питания.

Вообще чем выше напряжение питания, тем больше ток потребляет светодиод. ШИМ же позволяет сделать так чтобы светодиод не успевал сгореть от превышения тока.

И вообще проще было сделать контроллер тока на основе копеешной платки для зарядки Li-Ion акукумуляторов, в которых используется микросхема TP4056. Только добавить к штатному токозадающему резистору (который задаст максимальный ток в 1000мА; если нужен меньший ток, то нужно будет последовательно с ним установить ещё один или просто заменить резистор 1.2кОм на более подходящий номинал) последовательно подстроечный на номинал до 30кОм (при номинале в 30кОм на выходе платы будет максимальный ток 50мА).
Вот формула расчёта зарядного тока из даташита:


В общем: можно выкинуть к чертям токоограничительный резистор и вместо него задействовать такую платку (если купите с защитой от переразряда, то спаренные полевики FS8205A можно будет задействовать вместо используемого в схеме, благо они токи и в 3А выдержат).

У неё минимальное входное заявлено 4 Вольта. Такой манёвр отлично проходит при питании от USB.

Так ведь она и предназначена для питания от USB.

Тогда зачем советуете её при батарейном питании?

При батарейном и резистор не особо нужен.
Кроме того светодиодам важнее величина тока, а не напряжения (если ограничить ток, то повышение напряжения ему до определённого порога не страшно).
Т.е. можно поднять напряжения питания: т.к. использование обычных пальчиковых батареек не рационально (слишком маленькая ёмкость при сравнительно высокой цене) и аккумуляторы очень быстро окупят себя, то можно задействовать даже 2 аккумулятора последовательно (микруха держит до 8В, хотя проще задействовать повербанк).

Вообще я такую же гирлянду использую с питанием от ЗУ или повербанка.
Переделку описал выше. =)

ШИМ же позволяет сделать так чтобы светодиод не успевал сгореть от превышения тока.

Подход, достойный Ардуино. :)))

Нет. Нормальная схема должна гарантированно обеспечить штатный режим. Так что в данном случае резистор - самый адекватный выход. Городить что-то более серьезное смысла тут нет.

Я не знаю, может это компилятор оптимизирует, но деление на 64 можно записать как delay >> 5

Я продлил время жизни гирлянды припаяв резистор последовательно...

Да, компилятор довольно агрессивно оптимизирует, и если видит умножение/деление на степень двойки, то подсказок не просит:)

const int * const patterns[] = {
    (const int16_t[]){500, -500, 500, -500, 1, 50, -1, -50, 1, 50, -1, -50, 1, 50, -3000, -2000, 0},
    (const int16_t[]){1, 500, -1, -500, 0},
    (const int16_t[]){4000, -1, -2000, 0},
    (const int16_t[]){1, 250, -1, -250, 0},
    (const int16_t[]){500, -500, -3000, 0},
    (const int16_t[]){1, 50, -1, -50, 0},
    (const int16_t[]){1, -4000, -2000, 0},
    (const int16_t[]){2000, -1, -100, 1, 100, -1, -100, 1, 100, -1, -100, 1, 100, -1, -100, 1, -2000, -3000, 0},
    (const int16_t[]){1000, -1000, 0}
};

А версия AVR-GCC, которую вы использовали, уже научилась не копировать константы в RAM при таком их объявлении?

Классически, чтобы читать константы из FLASH, не копируя их в RAM, надо было использовать avr/pgmspace.h и макрос PROGMEM.

Или вы сознательно решили пожертвовать частью RAM, чтобы не тратить FLASH на код загрузки из FLASH (pgm_read_xxx)?

Это ещё одна причина по которой мне нравится ATtiny10 - у них флэш память отображается в адресное пространство, доступное обычным командам работы с RAM (ld*/st*) и поэтому не нужно использовать специальные макросы (которые превращаются в набор инструкций lpm для копирования из флэша в RAM).

Компилятор сам кладёт const объявления во флэш и сам подправляет адреса при обращении к ним. В общем, руководствуется этим положением из даташита тиньки:

Constant tables can be allocated within the entire address space of program memory by using load/store
instructions. Since program memory can not be accessed directly, it has been mapped to the data
memory. The mapped program memory begins at byte address 0x4000 in data memory. Although
programs are executed starting from address 0x000 in program memory it must be addressed starting
from 0x4000 when accessed via the data memory.

Ооо! Ооо! Распаковать что ли свои запасы ATtiny10... Страшно сказать, я их лет пять назад покупал поиграться, и вот все никак руки пока не дошли...

Зато я в рамках работы применял "новые" серии, ATtiny2xx. Очень приятные чипы, мне понравились.

Если речь идёт о 8-pin корпусах, то, мне кажется, до сих пор среди тинек вне конкуренции ATtiny85 c 8Кб флэша. На ней можно реализовать usb-протокол и даже в сериале Mr.Robot Эллиот в одной из сцен задумавшись крутит в руках платку Digispark с этим МК которая будет клавиатурным жучком.

Джампер нужно было обозначить хотя бы каким нибуть пунктиром - а то не понятно.

Предполагаю что мощный полевик имеет свою емкость и рамазывает фронты сигналов программирования до неприличных значений.

В более древних atmel есть протокол DW при котором и программирование и отладка выведены на RESET, т.е. больше свободных ножек. Но некоторые смелые искусники и RESET используют как GPIO, после чего перешить становиться затруднительно.

К тому же в таких схемах нет приличного источника тактовой частоты, для чего то серьезного RC генератор надо минимум калибровать, а еще у него уход частоты от температуры.

Так что иногда стоит подумать, а не взять ли контроллер с числом ножек более 6 :)

Маленький хинт для более аккуратных дорожек: лудите через оплетку, она лишнее соберет.

С моим ЛУТом так не выходит. Слой тонера очень тонкий и возникают подтравы, в итоге дорожки с мелкой перфорацией) Приходится наступить на эстетику и некрасиво замазывать припоем.

У меня жёлтая бумага с али, она сама по себе немного шершавая. Требуются небольшие ухищрения. Может помочь поднятие температуры при переносе на плату. А ещё такое было с отдельными кусками советского текстолита, у него как будто немного проступала структура ткани, даже шкурился неравномерно. Ещё слышал когда печатают для фотошаблонов - держат в парах ацетона, но этот вариант не пробовал.

Там нет attiny10. А под другие модели надо прошивку править (как минимум то самое обращение к program memory).

Хорошая самоделка, и статья хорошо написана! А ассемблер не практикуете для разработки? По идее, там бы и оптимизировать особо не пришлось

Чтобы нормально прогать на ассемблере нужно иметь или большую мотивацию или использовать систему правил типа прологов/эпилогов функций/ответственности за регистры и т.д. и тогда получится близко к тому, что генерит компилятор)

А, и ещё hw-дебаггер нужно иметь)

Да ладно, лет 5 практики и это все не надо

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории