Да сегодня попробую, дорожку разрежу на МК, поставлю Шоттки и кондерчик, думаю должно помочь. Потом уже плату переразведу.
P.S. В оригинале так и организовано питание - диод с + и кондер на 22мкФ на МК. (сейчас полез разобрал фонарь и увидел)
Добавлено (14.07.2019, 21:54) --------------------------------------------- Дело сдвинулось, переделал плату - все заработало, осталось теперь подогнать ШИМ, чтобы светодиоды не спалить, при 100% заполнении, ток большой.
Доделал проект, выкладываю файлы. Спасибо всем за помощь!
Описание работы: Драйвер светодиодного фонаря на 2 светодиода мощностью до 5Вт. Имеет 3 режима яркости для каждого из светодиодов. Яркость можно менять в исходнике меняя значения в строках 22 и 23. Имеет отключение при снижении напряжения ниже 3В (для номиналов делителя 27 кОм и 10 кОм и текущего значения в строке 112), резистор 27к* лучше заменить на 33к, соответственно пересчитав значение в строке 112 (для 33кОм - значение ~695). Тогда диапазон напряжения аккумулятора не будет выходить за максимальный диапазон измерения АЦП. При отключении/включении при низком напряжении фонарь плавно мигает 1м светодиодом и отключается. При однократном нажатии фонарь включается. Загорается тот светодиод, который был выключен. При удержании кнопки более 1с переключается на другой светодиод и однократным нажатием изменяется яркость.
Описание прошивки: Напряжение отключения можно настроить - строка 112 (данное значение будет зависеть от делителя и напряжения внутреннего ИОН). Заполнение шим можно установить в строках 22 и 23 для каждого светодиода. для значений 0%, 100%, 50%, 25% значение массива должны быть {255, 0, 128, 192} Частота ШИМ - 4,8 кГц.
Железо: Устройство рассчитано на питание от литий-ионного аккумулятора напряжением 3,7В (максимальное 4,2В). Схему выкладывать не буду, так как попросту ее нет, все видно на плате. Для настройки максимального тока через светодиод подбираем резисторы R300* для одного и другого светодиода при максимальном напряжении напряжения (4,1 - 4,2В) на аккумуляторе. Конденсатор 1n* можно не устанавливать, нужен для более стабильной работы АЦП (у меня не установлен). Провода от АКБ до платы желательно использовать максимального сечения (в разумных пределах), для точной работы АЦП и максимального КПД. При снижении напряжения на АКБ яркость светодиодов будет падать, так будет уменьшаться ток через них.
Исходник представлен в формате Arduino IDE (MicroCore), но он актуален для Atmel Studio 7. Плата в формате SpintLayout 6.
Добавлено (22.11.2019, 08:49) --------------------------------------------- Товарищи, продолжаю свой монолог... Никак не могу понять, "где собака порылась". Фонарь периодически перестает включатся. После ресета снова работает. Код перелопатил, косяков вроде нет (или я их не вижу). Исходник (ардуино):
// если нажата кнопка if ((PINB & (1 << PB2)) && !flgLngPress) { _delay_ms(15); // время на дребезг if (PINB & (1 << PB2)) { // если кнопка все еще нажата keyFalsePress = false; // снимаем флаг случайного нажатия butCount++; // начало отсчета нажатия кнопки if (butCount >= 55){ // ~1 сек (15мс *(55 + обработка команд)) flgLngPress = true; butCount = 0; // обнуляем счетчик времени нажатия }// end if else{ flgPress = true; // клик }// end else }// end if }// end if
// если отпустили после длительного нажатия if (flgLngPress && !(PINB & (1 << PB2))){ switchLED = false; flgLngPress = false; flgPress = false; // сбрасываем флаг нажатия }// end if
// отпустили кнопку if (flgPress && !(PINB & (1 << PB2))){ flgClick = true; // устанавливаем флаг клика flgPress = false; // сбрасываем флаг нажатия butCount = 0; // обнуляем счетчик времени нажатия }// end if
// если длительное нажатие if (flgLngPress && !switchLED){ LedMode = !LedMode; // переключаем на другой светодиод i = 1; Set_PWM(); // устанавливаем режим светодиода switchLED = true; }// end if
// был клик if (flgClick){ flgClick = false; // сбрасываем флаг клика i++; // инкрементируем режим PWM if (i > 3) i = 0; // обнуляем счетчик (у нас всего 4 режима: 0-3) Set_PWM(); // устанавливаем режим светодиода if (i == 0) sleep_MODE = true; else sleep_MODE = false; }// end if
// защита от помехи / случайного нажатия // если нажатие было случайное или помеха фонарь не включен и прошло больше 2с if (keyFalsePress && !i && ((msCounter - msCounterNow) > 200)){ sleep_MODE = true; }// end if
// если аккумулятор разрядился if (lowBat){ i = 0; if (!beUnPress) BlinkLed(); else beUnPress = false; RunSleep(); }// end if