ЭЛЕКТРОНИКА Как фронтендер фонарь делал

Azq2

✩✩✩✩✩✩✩
28 Ноя 2018
8
6
V0jj5OnSfug.jpg

Давно хотел себе нормальный фонарь. В итоге "схема" пришла к такому виду:

XH6qisMQmPs.jpg

Но перед этим я наступил на логарифмечское количество граблей...

Идея

Идея простая - собрать достаточно яркий фонарь, с защитой от перегрева светодиода и плавным управлением яркостью.
И стробоскоп! Запилить - просто, поиграться 5 минут и забить - бесценно. Да, это всё видос Гайвера про перчатку времени не давал мне покоя.
Всё это должно работать от свинцового аккумулятора. (Вы видели цены на литий? Есть целый год мивину (дошик) - такая себе перспектива.)

Наверное, это всё можно было заменить на самое просто термореле и NE555, но это не наши методы. Слишком просто!

Поэтому решено было делать это всё вокруг отладочной платы STM32:
1. Переменный резистор к stm32
2. Полевой транзистор между DC-DC и светодиодом.
3. Крутим резистор - считываем через ADC напряжение - меняем заполненность PWM
4. На всякий случай прикручиваем ds18b20, чекаем температуру и занижаем яркость при перегреве (>50C).
5. При остывании - возвращаем яркость обратно.
6. Как источник питания - используем готовый DC-DC бустер, со стабилизацией по току (обязатльно) и напряжению.
booster.png

Всё просто? Справится даже человек, который не разбирается в электронике? А вот фиг.

Проблема первая. Укрощение полевика.

Изначально я планировал подключить полевой транзистор прямо к ноге таймера STM32. Напрямую. Но тут меня ждал крупный фэйл. Да, полевик действительно может управляться от 3.3V

vt.jpg

Только работает он при этом в линейном режиме, а не как ключ. От чего его сопротивление не минимальное, заметно ограничивает ток и греется.
Что бы ввести MOSFET транзистор в ключевой режим - нужно около 10-12 вольт, но STM32 на ноге выдаёт не более 3.3V.

Логичное решение - сделать простейший усилитель, с эмиттерным повторителем на выходе.

Изначально в гуглении готовых решений управления мосфета от 3.3V я наткнулся на комплементарный эмиттерный повторитель.

compl.jpg

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

facepalm.png

После этого, я изучил тонну теории и испробовал на практике множество разных вариантов в онлайн симуляторе: http://www.falstad.com/circuit/circuitjs.html

И начал делать усилитель^W драйвер для MOSFET примерно по такой схеме:


amp.jpg

Было ОЧЕНЬ много вариантов.

Я даже писал расчёт усилительных и ключевых каскадов на JS. (сорсы потерялись вместе со случайным rm -rf :( )

БЕСПОЛЕЗНО! Просто заваливались фронты и плыла заполненность PWM при высокой частоте (100-200 khz). Устанавливаешь 50% - а там 70% по факту.
У меня не было осцилографа, что бы заняться отладкой и пофиксить этот баг без соответствующего опыта построения подобных схем.

Со временем я устал от этих попыток запилить хэнджоб драйвер и я купил готовый - MC33151PG.

Проблема вторая. КРУТИСТОР ШУМИТ.

Ну не сам крутистор, конечно. Идея была такая:
1. Подключаю потенциометр как делитель напряжения. Крайние к 3.3V и GND, а средний в ADC. Типа так:

pot.jpg

2. Читаю ADC, меняю заполненность PWM.

Всё просто, никаких проблем не должно быть. Но и тут я нашёл грабли:
1. У меня оказались только обратно логарифмические потенциометры. А нужны были линейные. Пробовал программно переводить логарифм в линейный по таблице, но результат не понравился. Пришлось ждать линейные.
2. Внезапно, мои отладочные платы STM32 шумят в опорное напряжение. Там нет отдельного опорного напряжения. И нормального фильтра.
Значение ADC даже при КЗ с gnd скачет до 5 (из 4095), а в потенциометре - ещё больше, до десятка и выше. Зависит от позиции.
Что я только не делал. И экранированный провод, и конденстаторы подбирал и хитрые алгоритмы усреднения делал. В итоге всё равно получалась хрень, даже если удавалось задушить помехи, то образовывались две заметные мёртвые зоны у потенциометра. В самом начале и в самом конце. Мне это не понравилось.

Без осцилографа это сложно победить и я просто отказался от потенциометра в пользу очень крутой штуки - энкодера.

Отчявшись пробовал NE555 - частота плывёт, та же проблема плавности, сложно для меня на тот момент получить 100% заполнение. В итоге выбор пал на энкодер.

Проблема третья. Энкодер ШУМИТ.

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

Я так же попробовал. В итоге, направление было часто совсем рандомное, а не то, в какую сторону я кручу.

Да, это фиксится кондёрами и алгоритмами. НО ПРИ ЭТОМ. Если установить IRQ при 100 щелчках, то внутренний счётчик таймера правильно инкрементился и декрементился от 0 до 100, без лишних скачков, ровно в ту сторону, в которую я кручу. С высокой точностью! Но при этом я не нашёл способа генерировать прерывание, когда инкрементится внутренний счётчик таймера. Он умеет генерировать его только при переполнении.

Поэтому я не нашёл ничего лучше, как заюзать второй таймер и с определённым интервалом читать текущее значение у первого таймера. И если оно изменилось более, чем на 90%, то считать это переполнением.

Получился простой код:https://github.com/Azq2/stm32_fonarik/blob/master/src/main.c#L227

Который крутит encoder_value на любое кол-во в минус и в плюс.

Проблема четвёртая. ЛОГАРИФМЫ.

Даже после замены регулятора на энкодер - яркость всё равно не регулировалась плавно. После 30% резкий скачёк яркости.
И вот тут я понял, что человек воспринимает уровень яркости не линейно, а почти по логарифмической кривой!

Т.е. возможно я решал несуществующую проблему с переменным резистором, но отступать было поздно.

В итоге написал простой генератор: https://github.com/Azq2/stm32_fonarik/blob/master/lg.php

Который генерирует 101 уровень яркости (полный оборот энкодера)
И всё стало круто и плавно.

Немного о конструкции

Использовать канализационные фитинги и кулер от LGA775, который идеально входит в 110-ю трубу? Да Алекс Гайвер чёртов гений!

Именно это стало окончательной мотивацей заняться этим проектом.

Блок со светодиодом был реализовано в точности, как в его видео. (но криво)

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

front0.jpg front1.jpg

Термодатчик закреплён на рандомный термоклей. Ещё не отвалился.

Сам корпус дальше хоть и использует канализационные трубы, но уже сильно отличается. За основу взята муфта и редуктор 150 -> 110

reductor.jpg

Блок электроники.

Вся электроника смонтирована внутри редуктора.. Дополнительно завернул в пакет от STM32, что бы если отвалится - не было КЗ.

electro.png

Зачем 2 ключа с радиаторами?
Я cпалил DC-DC случайным КЗ. Пришлось внешний фет использовать.

facepalm.png

Сама плата контроля выглядит так:

Содержит в себе DC-DC 5V, STM32 и ключи управления индикатором статуса.

pcb.jpg

Крепёж аккуумулятора.

Изначально я планировал использовать 110-ю трубу, но аккумулятор туда не влез. Почему же квадратный аккумулятор, который явно меньше 11 см со всех сторон, не влез в 110 трубу???
Просчитался немного. Поэтому пришлось использовать 150-ку с редкутором в 110.

После этого аккумулятор стал слишком маленьким для муфты :D

Поэтому обклеил пенопластом корпус изнутри (на термосопли)
И покрыл его антистатик пакетами от использованных STM32.
В теории, это ещё и должно уберечь аккумулятор от случайных падений. Но это не точно.

acc.jpg

Но пришлось отказаться от некоторых пенопластовых блоков, ради циркуляции воздуха. Воздух проходит через весь корпус к радиатору светодиода.

acc2.jpg

Задняя крышка

Задняя крышка изнутри обклеена сеткой от комаров, что бы внутрь не всасывались крупные предметы.

backofback.jpg

Внешний вид

Фонарь выглядит так:

back.jpg
side.jpg
V0jj5OnSfug.jpg

Задняя панель может некорретно отображаться с некоторых браузеров.

awesome.jpg

На самом деле:
1. Изначально планировался встроенный Power Bank
Была наивная идея использовать для этого LM7805. А ведь он - линейный стабилизатор. Уже при 1A мог конкурировать с Тvidia GTX1080.
Я уже не стал делать SMPS buck, хотел побыстрее закончить. Отверстия остались - заткнул выключателями.
2. Тактовых кнопок не было, поэтому стробоскоп сейчас включается тумблером.
В будущем переработаю, запасная заглушка ждёт своего времени.

Программная часть

Исходный код: https://github.com/Azq2/stm32_fonarik

Характеристики

1. Почти 130 Вт при 100% яркости, ёмкость аккумулятора 12V * 12Ah т.е в идеале на 100% ~1 час работы. КПД питания 75%.
2. В идеале 8500 люмен, если верить китайцам.
3. Плавный уровень яркости. Сохраняется во flash.
4. Стробоскоп 15-1000 Гц. Самая полезная функция.
5. Брутальный кустарный внешний вид, при этом весит 5 кг.

Как показала практика, ограничения из-за перегрева не происходит.
 

Вложения

  • 88.1 KB Просмотры: 20
Изменено:
  • Лойс +1
Реакции: kirovz и EandV

Azq2

✩✩✩✩✩✩✩
28 Ноя 2018
8
6
В итоге

Спустя ровно год я понимаю, что этот проект - идеальный пример как делать не стоит.

1. Только практика, только хардкор. Именно так я начинал свой путь программирования. Но это не работает в электронике. К сожалению, тот белый дым, на котором всё работает, вернуть обратно нельзя.
Более десятка STM32 можно было сохранить. Большую часть описанных проблем можно было обойти. Нужно было только немного восполнить пробелы в теории перед реализацией.

2. Свионцовые аккумуляторы - не самое лучшее решение. Они не любят большие токи, от чего сильно проседает напряжение.

3. Нет никакой необходимости в мосфете между DC-DC и светодиодом. Достаточно подать инвертированный PWM через ультрабыстрый диод на датчик напряжения или датчик тока в DC-DC.
На примере рандомной схемы:

pwm.jpg

В итоге там оказывается напряжение выше пороговым 0.22V и бустер отключается на время импульса.

4. STM32 здесь избыточен, но это сделано намеренно. Он дешёвый на али и у меня их было много.
Аналоговую схему тоже можно было, но я программист. Я не смог упустить возможносить закодить фонарь.

5. Вряд ли заваливания фронтов (по крайней мере по версии мультиметра в режиме измерения PWM) и прочие незначительные погрешности повлияли бы на качество регулирования яркости.
А поэтому сомнительное преимущество покупного драйвера вместо транзистора с повторителем.
Нужно было изначально поинтересоваться восприятием яркости у человека и использовать логарифм.

PS. 10k символов в 2к18 очень мало, половину текста удалил.
 
  • Лойс +1
Реакции: te238s

EandV

★★★✩✩✩✩
4 Авг 2018
288
167
Приветствую!

Это самый замороченный проект фонаря, который я видел. Впечатляет масштаб проделанной работы, затраченные усилия, а также пройденный тернистый путь проб и ошибок.
Я бы конечно сделал всё попроще: высокотоковый литий + BMS + повышающий преобразователь + ардуино и мосфет для регулировки яркости через ШИМ + термореле, которое будет включать вентилятор охлаждения при перегреве. Это первое, что приходит в голову. Но наверно если получше подумать, можно выработать более правильное решение.
 

Azq2

✩✩✩✩✩✩✩
28 Ноя 2018
8
6
Приветствую!

Это самый замороченный проект фонаря, который я видел. Впечатляет масштаб проделанной работы, затраченные усилия, а также пройденный тернистый путь проб и ошибок.
Я бы конечно сделал всё попроще: высокотоковый литий + BMS + повышающий преобразователь + ардуино и мосфет для регулировки яркости через ШИМ + термореле, которое будет включать вентилятор охлаждения при перегреве. Это первое, что приходит в голову. Но наверно если получше подумать, можно выработать более правильное решение.
Проще всего это готовый драйвер светодиода со встроенным диммером на али купить, такие есть. Или как Гайвер - вывести регулятор напряжения.
Но тут я сильно запаривался над тем, что бы регулировка была по настоящему плавной, линейной для человека и без мёртвых зон.
Такая себе лёгкая форма извращений перфекционизма.

Или наоборот - вообще всё реализовать на stm32. Повышайку с обратной связью можно было на микроконтроллёре закодить. =)

Планировал регулировать обороты вентилятора, но практика показала, что скорость нагрева высокая и это имеет смысл только на совсем низкой яркости. Пока жертвую этими 1 Вт потребления.
А занижение яркости при перегреве - в жаркой среде кулер на максимальных оборотах может не спасти от перегрева.
 

EandV

★★★✩✩✩✩
4 Авг 2018
288
167
@Azq2, В общем я понял, что если захочу сделать мощный фонарь с наворотами, то теперь знаю с чьему опыту можно обратиться.

Хорошо всё расписано, а главное деталей много. Сам стараюсь здесь подробные статьи публиковать по своим самоделкам, знаю, насколько трудоемко всё подробно расписывать.

Кароче: респект!
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,132
412
Москва
wan-derer.ru
БЕСПОЛЕЗНО! Просто заваливались фронты и плыла заполненность PWM при высокой частоте (100-200 khz).
Ну да. Просто частота ШИМ в 1000 раз больше чем нужно. Думаю, 100 Гц хватило бы. Ну или 500 "как в Ардуино". Тогда "драйвер" состоял бы из 1 транзистора и 2 резисторов. А если взять не STM, а AVR и MOSFET "с логическим управлением", то и вообще без драйвера всё бы работало. И светодиоды "Статус" не потребовали бы транзистора. Кстати, и сжечь AVR гораздо сложнее чем STM, хотя некоторые умудряются.
И да, подозреваю что проблема с "логарифмичностью" светодиода тоже связана с высокой частотой ШИМ. СД тот ещё тупак :)

Проблема вторая. КРУТИСТОР ШУМИТ.
Значение ADC даже при КЗ с gnd скачет до 5 (из 4095), а в потенциометре - ещё больше, до десятка и выше. Зависит от позиции.
Что я только не делал......
... а было достаточно загрубить показания АЦП. 8 разрядов, 256 уровней вполне достаточно для фонарика, даже с учётом логарифмической коррекции. Просто двигаем значение АЦП на 4 разряда вправо (целочисленно делим на 16) и вообще не имеем проблем с шумом.

Проблема третья. Энкодер ШУМИТ.
Если установить IRQ при 100 щелчках, то внутренний счётчик таймера правильно инкрементился и декрементился от 0 до 100, без лишних скачков
Это называется "дребезг контактов". Решается аппаратно: RC-цепочкой или программно: игнорируем импульсы с энкодера ~10мс после первого импульса.
 

Azq2

✩✩✩✩✩✩✩
28 Ноя 2018
8
6
@Wan-Derer,

... а было достаточно загрубить показания АЦП.
Занижение разрядности приводило к мёртвым зонам на и без того ограниченном ходе переменного резистора. Это меня очень огорчяло.

Ну да. Просто частота ШИМ в 1000 раз больше чем нужно. Думаю, 100 Гц хватило бы.
Настолько низкие частоты не использовал, что бы:
- Не создавать потенциальные проблемы с вращающимися механизмами
- Не создавать неприятные ощущения у человека, вроде как низкая частота мерцания может негативно восприниматься. Тут не уверен.
- Не создавать потенциальные проблемы у камер.

Это уже требует >2 кгц. Далее захотелось выйти за пределы звукового диапазона. Зачем это в фонаре, где кулер создаёт 99.9% шума?
Хм.... Сейчас не понятно.

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

После покупки mosfet-драйвера всё работало и на 72 кгц, так и оставил. Зря покупал что ли =)

И да, подозреваю что проблема с "логарифмичностью" светодиода тоже связана с высокой частотой ШИМ. СД тот ещё тупак :)
Так это логарифмичность у зрительной периферии человека :) А у меня получилась полностью линейная регулировка.
Я на тот момент знал, что восприятие громкости звука у человека логарифмическое. Со зрением не ожидал такой подставы.

Это называется "дребезг контактов".
Хардварный фильтр тогда не помог. Но при долговременном инкрементировании и декрементировании таймера энкодером нет этого дребезга, я его как только не насиловал. Медленным вращением ровно по 1. Проблема наблюдается только если таймер настроен на 1 импульс до переполнения.
Почему так? Мне до сих пор не понятно.
Этот вариант оставлен как наиболее стабильный в моём случае.