Шим-модуляторы для плавного управления яркостью гирлянд

Способы управления яркостью свечения светодиодов с помощью импульсных драйверов

Журнал РАДИОЛОЦМАН, ноябрь 2011

Rich Rosen, National Semiconductor

Введение

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

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

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

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

Яркость и цветовая температура светодиодов

Яркость светодиодов

Концепцию яркости видимого сета, испускаемого светодиодом, понять довольно легко.

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

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

На Рисунке 1 изображен график зависимости светового потока некоторого светодиода от прямого тока. В области используемых значений прямых токов (IF) график исключительно линеен. Нелинейность начинает проявляться при увеличении IF. При выходе тока за пределы линейного участка эффективность светодиода уменьшается.

Рисунок 1. Зависимость светового потока от тока через светодиод.

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

Цветовая температура светодиодов

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

Чем ниже цветовая температура светодиода, тем ближе его свечение к красно-желтому цвету, называемому «теплым». Более высоким цветовым температурам соответствуют сине-зеленые цвета, называемые «холодными».

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

Способы управления яркостью свечения светодиодов

Существуют два распространенных способа управления яркостью (диммирования) светодиодов в схемах с импульсными драйверами: широтно-импульсная модуляция (ШИМ) и аналоговое регулирование. Оба способа сводятся, в конечном счете, к поддержанию определенного уровня среднего тока через светодиод, или цепочку светодиодов. Ниже мы обсудим различия этих способов, оценим их преимущества и недостатки.

На Рисунке 2 изображена схема импульсного драйвера светодиода в конфигурации понижающего преобразователя напряжения. Напряжение VIN в такой схеме всегда должно превышать сумму напряжений на светодиоде и резисторе RSNS.

Ток дросселя целиком протекает через светодиод и резистор RSNS, и регулируется напряжением, подаваемым с резистора на вывод CS.

Если напряжение на выводе CS начинает опускаться ниже установленного уровня, коэффициент заполнения импульсов тока, протекающего через L1, светодиод и RSNS увеличивается, вследствие чего увеличивается средний ток светодиода.

Рисунок 2. Топология понижающего преобразователя.

Аналоговое диммирование

Аналоговое диммирование – это поцикловое управление прямым током светодиода. Проще говоря, это поддержание тока светодиода на постоянном уровне.

Аналоговое диммирование выполняется либо регулировкой резистора датчика тока RSNS, либо изменением уровня постоянного напряжения, подаваемого на вывод DIM (или аналогичный вывод) драйвера светодиодов.

Оба примера аналогового управления показаны на Рисунке 2.

Аналоговое диммирование регулировкой RSNS

Из Рисунка 2 видно, что при фиксированном опорном напряжении на выводе CS изменение величины RSNS вызывает соответствующее изменение тока светодиода. Если бы было возможно найти потенциометр с сопротивлением менее одного Ома, способный выдержать большие токи светодиода, такой способ диммирования имел бы право на существование.

Аналоговое диммирование с помощью управления напряжением питания через вывод CS

Более сложный способ предполагает прямое поцикловое управление током светодиода с помощью вывода CS.

Для этого, в типичном случае, в петлю обратной связи включается источник напряжения, снимаемого с датчика тока светодиода и буферизованного усилителем (Рисунок 2).

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

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

Диммирование с помощью ШИМ

Диммирование с помощью ШИМ заключается в управлении моментами включения и выключения тока через светодиод, повторяемыми с достаточно высокой частотой, которая, с учетом физиологии человеческого глаза, не должна быть меньше 200 Гц. В противном случае, может проявляться эффект мерцания.

Средний ток через светодиод теперь становится пропорциональным коэффициенту заполнения импульсов и выражается формулой:

IDIM-LED = DDIM × ILED
 

где

IDIM-LED – средний ток через светодиод,
DDIM – коэффициент заполнения импульсов ШИМ,
ILED – номинальный ток светодиода, устанавливаемый выбором величины сопротивления RSNS (см. Рисунок 3).

Рисунок 3. Двухпроводное ШИМ диммирование.

Модуляция драйвера светодиодов

Многие современные драйверы светодиодов имеют специальный вход DIM, на который можно подавать ШИМ сигналы в широким диапазоне частот и амплитуд.

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

С помощью выводов разрешения выхода и вспомогательной логики можно реализовать ряд дополнительных функций.

Двухпроводное ШИМ-диммирование

Двухпроводное ШИМ-диммирование приобрело популярность в схемах внутренней подсветки автомобилей. Если напряжение на выводе VINS становится на 70% меньше, чем на VIN (Рисунок 3), работа внутреннего силового MOSFET транзистора запрещается, и ток через светодиод выключается. Недостаток метода заключается в необходимости иметь схему формирователя сигнала ШИМ в источнике питания преобразователя.

Быстрое ШИМ-диммирование с шунтирующим устройством

Запаздывание моментов включения и выключения выхода конвертора ограничивает частоту ШИМ и диапазон изменения коэффициента заполнения.

Для решения этой проблемы параллельно светодиоду, или цепочке светодиодов, можно подключить шунтирующее устройство, такое, скажем, как MOSFET транзистор, показанный на Рисунке 4а, позволяющий быстро пустить выходной ток преобразователя в обход светодиода (светодиодов).

а)
б)
Рисунок 4. Быстрое ШИМ диммирование (а), формы токов и напряжений (б).

Ток дросселя на время выключения светодиода остается непрерывным, благодаря чему нарастание и спад тока перестают затягиваться. Теперь время нарастания и спада ограничивается только характеристиками MOSFET транзистора.

На Рисунке 4а изображена схема подключения шунтирующего транзистора к светодиоду, управляемому драйвером LM3406, а на Рисунке 4б показаны осциллограммы, иллюстрирующие различие результатов, получаемых при диммировании с использованием вывода DIM (сверху), и при подключении шунтирующего транзистора (внизу).

В обоих случаях выходная емкость равнялась 10 нФ. Шунтирующий MOSFET транзистор типа Si3458.

При шунтировании тока светодиодов, управляемых преобразователями со стабилизаций тока, надо учитывать возможность возникновения бросков тока при включении MOSFET транзистора.

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

Для сохранения максимальной скорости включения/выключения емкость между выводами светодиода должна быть минимальной.

Существенным недостатком быстрого ШИМ-диммирования, по сравнению с методом модуляции выхода преобразователя, является снижение КПД. При открытом шунтирующем приборе на нем рассеивается мощность, выделяющаяся в виде тепла. Для снижения таких потерь следует выбирать MOSFET транзисторы с минимальным сопротивлением открытого канала RDS-ON.

Многорежимный диммер LM3409

National Semiconductor выпускает уникальный многорежимный драйвер светодиодов LM3409, предназначенный как для аналогового, так и ШИМ регулирования яркости. Диммирование может осуществляться одним из четырех способов:

  1. Аналоговое регулирование прямой подачей напряжения 0 … 1.24 В на вывод IADJ.
  2. Аналоговое регулирование с помощью потенциометра, подключенного между выводом IADJ и «землей».
  3. ШИМ регулирование с помощью вывода EN.
  4. ШИМ регулирование с помощью шунтирующего MOSFET транзистора.

На Рисунке 5 показана схема включения LM3409 для управления яркостью с помощью потенциометра. Внутренний источник тока 5 мкА создает падение напряжения на сопротивлении RADJ, которое, в свою очередь, влияет на внутренний порог схемы измерения тока светодиода. С точно таким же эффектом можно управлять микросхемой, непосредственно подавая постоянное напряжение на вывод IADJ.

Рисунок 5. Аналоговое управление яркостью.

Рисунок 6 демонстрирует зависимость измеренного тока светодиода от сопротивления включенного между IADJ и «землей» потенциометра. Плато на уровне 1 А в верхней части графика определяется величиной показанного на Рисунке 4 резистора RSNS, задающего максимальный номинальный ток светодиода.

Рисунок 6. Зависимость тока светодиода от сопротивления потенциометра.

На Рисунке 7 изображена зависимость измеренного тока светодиода от постоянного напряжения, приложенного к выводу IADJ. Заметим, что максимальный ток здесь также определяется величиной RSNS.

Рисунок 7. Зависимость тока светодиода от напряжения на выводе IADJ.

Обе аналоговые технологии диммирования просты в реализации и позволяют с очень высокой линейностью регулировать яркость свечения, вплоть до уровня 10% от максимума.

Заключение

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

Ценою использования дополнительной логики, ШИМ регулирование значительно уменьшает вариации цвета светодиода при изменении яркости.

Схемотехника аналогового диммирования проще, но неприменима там, где требуется поддержания постоянной цветовой температуры.

Источник: https://www.rlocman.ru/review/article.html?di=124982

Широтно-импульсная модуляция (ШИМ)

Широтно-импульсная модуляция (ШИМ) – это метод преобразования сигнала, при котором изменяется длительность импульса (скважность), а частота остаётся константой. В английской терминологии обозначается как PWM (pulse-width modulation). В данной статье подробно разберемся, что такое ШИМ, где она применяется и как работает.

Область применения

С развитием микроконтроллерной техники перед ШИМ открылись новые возможности.

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

Метод широтно-импульсной модуляции применяется для изменения яркости света, скорости вращения двигателей, а также в управлении силовым транзистором блоков питания (БП) импульсного типа.

Широтно-импульсная (ШИ) модуляция активно используется в построении систем управления яркостью светодиодов. Благодаря низкой инерционности, светодиод успевает переключаться (вспыхивать и гаснуть) на частоте в несколько десятков кГц.

Его работа в импульсном режиме воспринимается человеческим глазом как постоянное свечение. В свою очередь яркость зависит от длительности импульса (открытого состояния светодиода) в течение одного периода.

Если время импульса равно времени паузы, то есть коэффициент заполнения – 50%, то яркость светодиода будет составлять половину от номинальной величины. С популяризацией светодиодных ламп на 220В стал вопрос о повышении надёжности их работы при нестабильном входном напряжении.

Решение было найдено в виде универсальной микросхемы – драйвера питания, работающего по принципу широтно-импульсной или частотно-импульсной модуляции. Схема на базе одного из таких драйверов детально описана здесь.

Подаваемое на вход микросхемы драйвера сетевое напряжение постоянно сравнивается с внутрисхемным опорным напряжением, формируя на выходе сигнал ШИМ (ЧИМ), параметры которого задаются внешними резисторами.

Некоторые микросхемы имеют вывод для подачи аналогового или цифрового сигнала управления. Таким образом, работой импульсного драйвера можно управлять с помощью другого ШИ-преобразователя.

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

Микроконтроллер Ардуино тоже может функционировать в режиме ШИМ контроллера. Для этого следует вызвать функцию AnalogWrite() с указанием в скобках значения от 0 до 255. Ноль соответствует 0В, а 255 – 5В. Промежуточные значения рассчитываются пропорционально.

Повсеместное распространение устройств, работающих по принципу ШИМ, позволило человечеству уйти от трансформаторных блоков питания линейного типа. Как результат – повышение КПД и снижение в несколько раз массы и размеров источников питания.

ШИМ-контроллер является неотъемлемой частью современного импульсного блока питания. Он управляет работой силового транзистора, расположенного в первичной цепи импульсного трансформатора. За счёт наличия цепи обратной связи напряжение на выходе БП всегда остаётся стабильным.

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

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

  • обеспечивает режим плавного пуска преобразователя;
  • ограничивает амплитуду и скважность управляющих импульсов;
  • контролирует уровень входного напряжения;
  • защищает от короткого замыкания и превышения температуры силового ключа;
  • при необходимости переводит устройство в дежурный режим.

Принцип работы ШИМ контроллера

Задача ШИМ контроллера состоит в управлении силовым ключом за счёт изменения управляющих импульсов. Работая в ключевом режиме, транзистор находится в одном из двух состояний (полностью открыт, полностью закрыт). В закрытом состоянии ток через p-n-переход не превышает несколько мкА, а значит, мощность рассеивания стремится к нулю.

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

Но за счёт малого времени переходного процесса по сравнению с частотой модуляции, мощность потерь при переключении незначительна.

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

Аналоговая ШИМ

Принцип действия аналогового ШИ-модулятора основан на сравнении двух сигналов, частота которых отличается на несколько порядков. Элементом сравнения выступает операционный усилитель (компаратор).

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

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

Цифровая ШИМ

Широтно-импульсная модуляция в цифровой интерпретации является одной из многочисленных функций микроконтроллера (МК). Оперируя исключительно цифровыми данными, МК может формировать на своих выходах либо высокий (100%), либо низкий (0%) уровень напряжения.

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

Что делать, чтобы получить на выходе микроконтроллера любое значение напряжения в диапазоне от 0 до 100%?

Вопрос решается применением метода широтно-импульсной модуляции и, используя явление передискретизации, когда заданная частота переключения в несколько раз превышает реакцию управляемого устройства. Изменяя скважность импульсов, меняется среднее значение выходного напряжения.

Как правило, весь процесс происходит на частоте в десятки-сотни кГц, что позволяет добиться плавной регулировки. Технически это реализуется с помощью ШИМ-контроллера – специализированной микросхемы, которая является «сердцем» любой цифровой системы управления.

Активное использование контроллеров на основе ШИМ обусловлено их неоспоримыми преимуществами:

  • высокой эффективности преобразования сигнала;
  • стабильность работы;
  • экономии энергии, потребляемой нагрузкой;
  • низкой стоимости;
  • высокой надёжности всего устройства.

Получить на выводах микроконтроллера ШИМ сигнал можно двумя способами: аппаратно и программно. В каждом МК имеется встроенный таймер, который способен генерировать ШИМ импульсы на определённых выводах. Так достигается аппаратная реализация.

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

Примечательно, что в цифровой ШИМ количество импульсов за период может быть различным, а сами импульсы могут быть расположены в любой части периода.

Уровень выходного сигнала определяется суммарной длительностью всех импульсов за период.

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

Пример использования ШИМ регулятора

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

Источник: https://ledjournal.info/spravochnik/shirotno-impulsnaya-modulyaciya.html

Управление большим количеством светодиодов через Binary Angle Modulation

Вот приспичило вам сделать себе могучую светодиодную хреновину, чтобы моргала и переливалась. Да еще в RGB и плавненько так. Собрали вы это дело, поглядели на количество каналов которыми нужно рулить и призадумались…
 

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

 

Каждый отдельный фронт потребует своего прерывания на смену уровня. А представьте, что у нас этих каналов будет не 4, а 40? Или 400? Да контроллер из прерываний вылезать не будет. Прерывания будут налезать друг на друга, порождая джиттер. Не говоря уже о том, что все эти каналы надо будет при любом изменении скважности заново сортировать по длительности. В общем, тупилово будет еще то.
 

▌Нас спасет BAM Но решение есть. Зовется этот метод BAM. Суть его в том, что мы включаем нагрузку импульсами, поразрядно, с длительностью равной весу разряда.

 

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

 

Интегрируется все аналогично обычному ШИМу. Но есть ряд нюансов:

  1. Частота плавает и на малых разрядах она повышается. Для светодиода или грелки это наплевать. А вот двигатель или еще какую нагрузку с реактивными элементами вроде обмоток или емкостей я бы таким сигналом питать не стал.
  2. При переходе с малых весов к одному большому наблюдается мерцание. Но с этим можно бороться, подробности ниже.
  3. Выдавать вес лучше с большего к меньшему, так меньше заметно влияние второго пункта.

 

▌Код Концепция ясна, попробуем замутить прогу которая это реализует.

Начнем с автомата который формирует временные интервалы. Все реализации которые я видел, использовали массив выдержек, что загружались в таймер.

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

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

Поэтому нам для всего этого хватит таймера в режиме СТС и одного прерывания OCR. Поглядим даташит на ATMega16A, раздел 8-bit Timer/Counter0 with PWM.
 

Там есть такая вот картинка:

 

То что нужно!
 

Дальше работать будет до смешного просто. Мы загружаем в OCR0 число 0b10000000 и запускаем таймер. А в прерывании по OCR сдвигаем это число по кругу направо, получая автоматом 0b01000000 -> 0b00100000 -> 0b00010000 -> 0b00001000 и так далее. Попутно у нас получается маска для выбора бита из массива. И все это само. Красота же 🙂
 

Вот код автомата времени:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include
#include
#include
#include
 
 
// Макросы циклических сдвигов
#define ROL(x) ((x > 7))
#define ROR(x) ((x >> 1) | (x

Источник: http://easyelectronics.ru/upravlenie-bolshim-kolichestvom-svetodiodov-cherez-binary-angle-modulation.html

Плавный розжиг и регулятор яркости с управлением по плюсу — DRIVE2

Доброго здравия, дорогой друг!

Фотография оптимизированной платы

1. Предисловие

После того, как был достигнут очень хороший результат пересвета климата и переключателейна центральной консоли, основные приборы, которые тоже были пересвечены заменой штатных светодиодов, стали уныло не яркими днем, особенно в солнце. Было решено сделать и туда платы для пересвета светодиодами 1206, которые бы светили также ярко холодным белым светом.

Подсветка центральной консоли. На улице солнечный день

И решено сделать плавный розжиг всей подсветки приборов с регулятором яркости. Здесь я не стал придумывать ничего нового и взял схему плавного розжига от CAMOKAT-BETEPAHA. Огромное ему спасибо за этот проект и выдержку, которую он проявлял в личной переписке. Собственно весь функционал схемы и настройка точно такие же! Поэтому их здесь описывать не стал. Далее прошил Attiny13 и собрал тестовую схемку на макетке, пока без ключей. Все заработало.

Тестовая сборка на макетке

Однако, посмотрев электросхему автомобиля я понял, что мне нужно управлять яркостью и розжигом по плюсу, а в схеме управление по минусу. Для тех кто не понял: минус (масса) у всех подсвечиваемых элементов (переключатели, блок климата, подсветка основных приборов) будет общим и будет посажен на массу автомобиля, а мы будем подавать на плюсовой провод ШИМ сигнал, который обеспечит необходимую яркость подсветки всем приборам. Чтож, будем переделывать схему!

2. Отладка схемы с управлением по плюсу

Для управления по плюсу мы заменяем в схеме полевой транзистор N-канала на полевой транзистор P-канала. Но для управления P-каналом нам нужен инвертированный сигнал с контроллера, т.к. такой ключ, в отличии N-канального, открывается отрицательным напряжением Vgs. Инверсию управляющего сигнала можно сделать аппаратно и программно. Здесь пусть каждый выберет для себя сам.

Схемы делал легким движением руки в Paint из нескольких схем Степан Палыча, надеюсь он не сильно осерчает на меня за это.

2.1. Аппаратная инверсия сигнала

В этом случае схема примет следующий вид.

Схема плавного розжига на полевиках P-канала с инвертирующим каскадом транзисторов

Добавляется каскад транзисторов, которые инвертируют сигнал с контроллера. К тому же, этот каскад транзисторов усиливают сигнал, поэтому эта схема больше подойдет, если в нагрузке будут большие токи.

Полевики здесь будут гарантированно успевать открываться до конца и их нагрев будет меньше. У меня токи будут небольшими, максимум 0.3 А.

Собрал схему на макетной плате, все сразу заработало безо вских проблем с родной прошивкой от Степан Палыча.

Аппаратная инверсия тестовый вариант на макетке

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

2.2. Программная инверсия сигнала

Долго мучил Степан Палыча в личной переписке и в итоге получилась схема.

Схема плавного розжига на полевиках P-канала

Даже на макетке глаз радуется от количества деталей.

Розжиг с программной инверсией сигнала на макетке (контроллер был немного отодвинут для прошивки)

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

2.3. Трудности программной инверсии

По логике, мы должны только инвертировать сигнал на две ножки микроконтроллера, которые управляют ключами. Это значит инициализировать их единицами в начале и сделать ШИМ инвертированным. Что делается достаточно просто. Однако, в итоге мы получаем следующий косяк.

Мы видим, что до плавного розжига светодиоды кратковременно моргают в момент включения. И моргают в момент выключения! Долгий поиск ошибки в прошивке ничего мне не дал. Поискал в сети подобные случаи — тоже ничего. Тогда я попросил помощи. Комментариев было много и много разных версий.

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

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

Оказалось, причём это вовсе не прозрачно из документации, что, когда OCRx равен нулю высокий уровень на выходе будет установлен не сразу, как то ожидалось бы, а только когда таймер досчитает доверху, затем спустится вниз.

А до этого целый цикл таймера (а это 1/2353 секунды = 425 мкс) на выходе будет явный низкий уровень, а значит транзистор будет открыт. Если выход не инвертированный — то всё в порядке, низкий уровень с первого такта.

А если инвертирован — то вот так.

Никак заставить работать его так, как я хочу, мне не удалось.

На Force Output Compare он в этом режиме не реагирует, если выключить вывод PWM, и включить его позже, то он всё равно будет капризничать целый цикл и я придумал такую фишку:1) отключаю DDR на этом выводе, в этом состоянии порт переходит в третье состояние, а транзистор держится закрытым внешним резистором. Режим PWM уже включен как надо2) ожидаю появления флага переполнения TOV0, который будет означать прохождение полного цикла таймером

3) включаю DDR и теперь таймер уже начинает управлять выводом.

Вот такие танцы с бубном дают незначительную задержку в один цикл (425 мкс), зато транзистор держится строго закрытым, до появления управляющего сигнала с выключателя.

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

Программатор

3. Результат

Проблема была решена. Да, для схемки сделал платку ориентируясь на детали, что нашел под рукой. Плата немного громоздка (порядка 4х4 см, смотрите на первом фото к посту) и вышла не совсем аккуратно, т.к. утюжил не своим родным утюгом в дали от дома, в полевых условиях, так сказать.

Плата

Первый опытный образец

В следующий раз если и повторять, то полностью на SMD компонентах.На видео показан плавный розжиг, имитация включения габаритов и регулировка яркости.
Теперь дело за платами в приборную панель и установкой всего этого.

4. Еще один интересный момент

Когда отлаживал прошивку, шил последовательным программатором прямо на макетке и новая прошивка сразу запускалась в работу — очень удобно. Так вот, естественно я не прошивал сразу фьюзы. И тогда при включении я наблюдал бесконечное мигание светодиодом.

Оказывается, что когда не прошиваешь фьюз RSTDISBL, то в программе на PINB.5 у нас ноль (Хотя понятно, что нога сброса висит в воздухе и логично, если бы там была единица)! И у нас как будто все время нажата кнопка настройки.

Для отладки, я просто закомментировал кусок кода для опроса PINB.5.

Прошивка и исходный код для варианта с программной инверсией здесь.В этом архиве оригинальная разводка платы с управлением по минусу.

Вот здесь выложил оптимизированную версию платы под ключи IRFD9120.

Разводка оптимизированной (уменьшенной) платы

Собранное устройство на оптимизированное плате — на первой фотографии к посту.

Об обновленном регуляторе можно почитать здесь.

Желаю всем творческих успехов!

Источник: https://www.drive2.ru/b/1992748/

Нужен ли BAM vs ШИМ и как управлять светодиодами микроконтроллером

Речь пойдёт об изготовлении каких-то больших “индикаторов” на базе микроконтроллера. Световой рекламы, например. Где принципиальной особенностью может быть необходимость плавного зажигания и гашения светодиодов.

Есть разные методы это сделать, первый и очевидный — широтно-импульсная модуляция.

Причём реализуемая в таких случаях, как правило, полностью программно ввиду того, что число каналов (отдельных диодов или диодных лент) достаточно велико и практически сопоставимо с числом выводов микроконтроллера вообще (а может быть и больше, если используется SPI и регистры сдвига), а число аппаратных модулей ШИМ у дешёвых МК обычно весьма ограничено. Практически период ШИМ должен выбираться достаточно коротким, чтобы мерцание не было заметно. Где-то от 100Гц до 1КГц, чем выше, тем лучше. Но при большом числе каналов частоту сверху начинает ограничивать производительность микроконтроллера — он просто не успеет с нужной частотой обсчитать состояние каждого вывода. А при низких частотах начинает слишком явно проявляться негативное свойство ШИМ, особенно хорошо заметное при коэффициенте заполнения близком к 0.5 — на выходе практически меандр и мерцание становится особенно заметным.

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

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

Можно использовать свойство взаимо-простых чисел N и M, что вычисляя каждый раз i=(i+N)%M, для начального значения i=0, i пройдёт все значения от 0 до M-1, но не последовательно, а с каким-то шагом.

Переменную i можно использовать как значение “счётчика” сравниваемое на каждом шаге с амплитудой сигнала и на основе сравнения выводится 0 или единица.

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

0: 00000000000000000000000000000 00000000000000000000000000000
1: 10000000000000000000000000000 00000000000000000000000000001
2: 11000000000000000000000000000 00000000000010000000000000001
3: 11100000000000000000000000000 00000000000010000000000001001
4: 11110000000000000000000000000 00000000010010000000000001001
5: 11111000000000000000000000000 00000000010010000000001001001
6: 11111100000000000000000000000 00000010010010000000001001001
7: 11111110000000000000000000000 00000010010010000001001001001
8: 11111111000000000000000000000 00010010010010000001001001001
9: 11111111100000000000000000000 00010010010010001001001001001
10: 11111111110000000000000000000 10010010010010001001001001001
11: 11111111111000000000000000000 10010010010011001001001001001
12: 11111111111100000000000000000 10010010010011001001001001101
13: 11111111111110000000000000000 10010010011011001001001001101
14: 11111111111111000000000000000 10010010011011001001001101101
15: 11111111111111100000000000000 10010011011011001001001101101
16: 11111111111111110000000000000 10010011011011001001101101101
17: 11111111111111111000000000000 10011011011011001001101101101
18: 11111111111111111100000000000 10011011011011001101101101101
19: 11111111111111111110000000000 11011011011011001101101101101
20: 11111111111111111111000000000 11011011011011101101101101101
21: 11111111111111111111100000000 11011011011011101101101101111
22: 11111111111111111111110000000 11011011011111101101101101111
23: 11111111111111111111111000000 11011011011111101101101111111
24: 11111111111111111111111100000 11011011111111101101101111111
25: 11111111111111111111111110000 11011011111111101101111111111
26: 11111111111111111111111111000 11011111111111101101111111111
27: 11111111111111111111111111100 11011111111111101111111111111
28: 11111111111111111111111111110 11111111111111101111111111111
29: 11111111111111111111111111111 11111111111111111111111111111

Очевидно, что во втором случае (правая колонка) биты оказались перемешаны более равномерно и мерцание будет менее заметно. Данные получены с помощью представленной ниже программы. Взаимо-простые числа в данном случае 29 (период на единицу больше) и 9 (шаг).

for v=0:29 printf(“%u: “, v); for i=0:28 if (v > i) printf(“1”); else printf(“0″); end end printf(” “); j=0; for i=1:29 j=mod(j+9, 29); if (v > j) printf(“1”); else printf(“0″); end end printf(”
“);
end

Шаг стоит выбирать примерно равным от четверти до половины периода. Список взаимо-простых чисел можно найти в интернете или вычислить по алгоритму приведённому в Wikipedia (en.wikipedia.org/wiki/Coprime_integers).

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

Либо следует применять более качественный источник питания, либо начало периода ШИМ для разных каналов разнести во времени.

Что в описываемом выше случае можно реализовать добавлением к i некоторой константы n*P/N, где n — номер канала, P — период, N — общее число каналов.

Есть также известный способ управления светодиодами называемый ВАМ (Bit Angle Modulation). У него есть преимущество, применительно к микроконтроллерам: требуется меньшее время на вычисления. Так для шим с периодом P нужно, соответственно, P раз вычислять выводимые значения. А для BAM только log2(P).
Но есть и недостатки:

  • во-первых для BAM невозможно выбирать период не кратный 2^N. Например, известно, что ШИМ не успевает отрабатывать с периодом 64, но успевает с периодом 50. А в случае с BAM останется ограничиться периодом 32. В последнем случае плавность зажигания уже под вопросом, видно ступенчатое изменения яркости.
  • Во-вторых BAM не позволит более равномерно перемешать биты на выходе как показано выше и получить меньшее мерцание, при выводе амплитуд близким к 0.5 периода мерцание при использовании BAM будет максимально.

Кроме того, BAM хоть и требует, суммарно, меньше времени на вычисления, в пике он требует такой же производительности как ШИМ: прерывания при выводе младших битов учащаются каждый раз в 2 раза и при выводе самого младшего бита идут с такой же частотой как у ШИМ.

Но если микроконтроллер успевает их обслужить в этом случае, почему он не успеет для всех остальных выводимых значений ШИМ? То преимущество BAM, что требуется меньше вычислений, по сравнению с ШИМ на самом деле весьма эфемерно и является преимуществом только в случае, например, если кроме управления светодиодами микроконтроллер занят какими-то другими задачами, требующими тоже большого количества процессорного времени, что вряд ли.

Нужно рассмотреть ещё один вопрос. Алгоритм непосредственно управления индикацией. Допустим, есть программа которая для N каналов выводит заданные для каждого канала интенсивности методом ШИМ.

Но как из этого получить динамичную картинку? Нужна “программа” по которой будут включаться те или иные сегменты изображения. И нужен интерпретатор этой программы.

Интерпретатор на самом деле не сложный, он может оперировать функциями “включить такую-то яркость на таком-то канале с такой-то скоростью перехода (плавно)”, “пауза столько-то миллисекунд” и “конец или переход на начало программы”. Это, наверное, минимум.

Возможен и более сложный язык, но это отдельная история. Можно сделать интерпретатор байткода (скорей, слов в ПЗУ), очевидно как. И какую-либо программу для перевода описания “программы” из текста в “байткод”.

Для последнего подойдёт, наприме, макроассемблер (встроенный в AVR-studio не в полной мере является таковым). Либо можно поступить проще, с помощью того же макро-ассемблера, из псевдоинструкций (“установить яркость”, “пауза”, “конец”) генерировать сразу непосредственно машинный код вызывающий нужные функции. Это будет основной цикл программы. А обработка ШИМ может вестись исключительно в прерываниях.

Источник: http://embedders.org/blog/fk0/nuzhen-li-bam-vs-shim-i-kak-upravlyat-svetodiodami-mikrokontrollerom.html

Регулятор яркости светодиодов. Схема ШИМ диммера

В данной статье описано как собрать простой, но эффективный регулятор яркости светодиодов основанный на ШИМ регулировании яркости (диммер) свечения  светодиодов.

Светодиоды  (светоизлучающие диоды) очень чувствительные компоненты. При превышение  питающего тока или напряжения выше допустимого значения может привести к выходу их из строя или же значительно сократить срок службы.

Обычно ток ограничивается с помощью резистора  последовательно подключенного к светодиоду, или же регулятором тока цепи (драйвером). Увеличение тока на светодиоде увеличивает его интенсивность свечения, а снижение тока уменьшает его.  Один из способов регулирования яркости свечения является использование переменного резистора (потенциометр)  для динамического  изменения яркости.

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

Широтно-импульсная модуляция. Намного эффективнее метод регулирования яркости свечения путем применение широтно-импульсной модуляции (ШИМ). С ШИМ, группы светодиодов обеспечиваются рекомендуемым током, и в тоже время появляется возможность производить регулирование яркости за счет подачи питания с высокой частотой. Изменение периода вызывает изменение яркости.

Рабочий цикл можно представить как соотношение времени включения и выключения питания поступающего на светодиод. Допустим, если рассмотреть цикл в одну секунду и при этом в выключенном состоянии светодиод будет 0,1 сек., а во включенном 0,9 сек., то получается что свечение составит около 90% от номинального значения.

Описание шим регулятора яркости

Самый простой способ для достижения данного высокочастотного переключения – применение микросхемы таймера ne555, одой из самых распространенных и самых универсальных микросхем, когда-либо созданных. Схема ШИМ регулятора, показанная ниже предназначен для использования в качестве диммера для питания светодиодов (12 вольт)   или регулятора скорости вращения для двигателя постоянного тока на 12 В.

В данной схеме, сопротивление резисторов к светодиодам необходимо подобрать, чтобы обеспечить прямой ток в 25 мА. В результате общий ток трех линеек светодиодов составит 75мА. Транзистор должен быть рассчитан на ток не менее 75 мА, но лучше взять с запасом.

Эта схема  диммера осуществляет регулировку от 5% до 95%, но используя германиевые диоды вместо 1N4148, диапазон может быть расширен от 1% до 99% от номинального значения.

Источник: www.reuk.co.uk

Источник: http://www.joyta.ru/4815-sxema-shim-regulyatora-yarkosti-svecheniya-svetodiodov/

Урок 37. Широтно-импульсная модуляция в Ардуино

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

Предыдущий урок     Список уроков     Следующий урок

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

В нашей разработке используется именно такой способ регулирования мощности на элементе Пельтье.

Широтно-импульсная модуляция.

Широтно-импульсная модуляция (ШИМ) это способ управления мощностью на нагрузке с помощью изменения скважности импульсов при постоянной амплитуде и частоте импульсов.

Можно выделить две основные области применения широтно-импульсной модуляции:

  • Во вторичных источниках питания, различных регуляторах мощности, регуляторах яркости источников света, скорости вращения коллекторных двигателей и т.п. В этих случаях применение ШИМ позволяет значительно увеличить КПД системы и упростить ее реализацию.
  • Для получения аналогового сигнала с помощью цифрового выхода микроконтроллера. Своеобразный цифро-аналоговый преобразователь (ЦАП). Очень простой в реализации, требует минимума внешних компонентов. Часто достаточно одной RC цепочки.

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

На диаграмме можно увидеть основные параметры ШИМ сигнала:

  • Ui – амплитуда импульсов ;
  • Ton – время активного (включенного) состояния сигнала;
  • Toff – время отключенного состояния сигнала;
  • Tpwm – время периода ШИМ.

Даже интуитивно понятно, что мощность на нагрузке пропорциональна соотношению времени включенного и отключенного состояния сигнала.

Это соотношение определяет коэффициент заполнения ШИМ:

Kw = Ton / Tpwm.

Он показывает, какую часть периода сигнал находится во включенном состоянии.  Может меняться:

  •  от 0 – сигнал всегда выключен;
  •  до 1 – сигнал все время находится во включенном состоянии.

Чаще используют процентный коэффициент заполнения. В этом случае он находится в пределах от 0 до 100%.

Среднее значение электрической мощности на нагрузке строго пропорционально коэффициенту заполнения. Когда говорят, что ШИМ равен, например, 20%, то имеют в виду именно коэффициент заполнения.

Формирование аналогового сигнала.

Если сигнал ШИМ пропустить через фильтр низких частот (ФНЧ), то на выходе фильтра мы получим аналоговый сигнал, напряжение которого пропорционально коэффициенту заполнения ШИМ.

U = Kw * Ui

В качестве ФНЧ можно использовать простейшую RC цепочку.

Из-за неидеальной характеристики такого фильтра частота среза должна быть минимум на порядок меньше частоты ШИМ. Для простого RC фильтра частота среза вычисляется по формуле:

F = 1 / (2 π R C).

  • При повышении частоты среза ФНЧ на выходе фильтра увеличиваются пульсации с частотой ШИМ.
  • При уменьшении частоты среза фильтра снижается время реакции выходного аналогового сигнала на изменения ширины импульсов.

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

Я бы рекомендовал:

  • В случае, когда к быстродействию аналогового сигнала жестких требований нет выбирать заведомо заниженную частоту среза фильтра.
  • Если необходимо оптимизировать быстродействие аналогового преобразователя, то лучше промоделировать схему.

Даже простейшие моделирующие программы вычисляют уровень пульсаций достаточно точно. Вот результаты моделирования на SwCAD для ШИМ частотой 500 Гц и RC фильтрами с частотами среза 500 Гц, 50 Гц и 5 Гц. Зеленым цветом показана диаграмма ШИМ, синим – напряжение на выходе RC фильтра.

Частота среза 500 Гц (10 кОм, 32 нФ).

Частота среза 50 Гц (10 кОм, 320 нФ).

Частота среза 5 Гц (10 кОм, 3,2 мкФ).

Точность преобразования широтно-импульсных модуляторов определяется погрешностью амплитуды импульсов (т.е.

стабильностью питания микроконтроллера) и значением падения напряжения на ключах цифровых выходов микроконтроллера. Как правило, точность ШИМ микроконтроллеров невысока.

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

К недостаткам использования широтно-импульсных модуляторов в качестве ЦАП также следует отнести высокое выходное сопротивление. Оно определяется сопротивлением резистора RC фильтра и не может быть низким из-за малой нагрузочной способности выходов микроконтроллера.

Широтно-импульсные модуляторы в Ардуино.

Платы Ардуино на базе микроконтроллеров ATmega168/328 имеют 6 аппаратных широтно-импульсных модуляторов. Сигналы ШИМ могут быть сгенерированы на выводах 3, 5, 6, 9, 10, 11.

Управление аппаратными ШИМ осуществляется с помощью системной функции analogWrite().

void analogWrite(pin, val)

Функция переводит вывод в режим ШИМ и задает для него коэффициент заполнения. Перед использованием analogWrite() функцию pinMode() для установки вывода в режим “выход” вызывать необязательно.

Аргументы:

  • pin – номер вывода для генерации ШИМ сигнала.
  • val – коэффициент заполнения ШИМ. Без дополнительных установок  диапазон val от 0 до 255 и соответствует коэффициенту заполнения от 0 до 100 %. Т.е. разрядность системных ШИМ в Ардуино 8 разрядов.

analogWrite(9, 25);  // на выводе 9 ШИМ = 10%

Частота ШИМ Ардуино 488,28 Гц.

Для генерации ШИМ используются все три таймера Ардуино.

Таймер Используется для генерации ШИМ на выводах
Таймер  0 выводы 5 и 6
Таймер  1 выводы 9 и 10
Таймер  2 выводы 3 и 11

Если таймер используется для других целей, например для прерывания, то параметры ШИМ соответствующих выводов могут не соответствовать указанным выше.

Поэтому, при использовании библиотек MsTimer2, TimerOne или им подобных некоторые выводы в качестве ШИМ сигналов использовать нельзя.

Увеличение частоты и разрядности ШИМ Ардуино.

Система Ардуино устанавливает на всех выводах ШИМ параметры:

  • частота 488,28 Гц;
  • разрешение 8 разрядов (0…255).

Очень низкая частота. Для большинства приложений совершенно не допустимая.

В разработке контроллера элемента Пельтье, начатой в предыдущем уроке, частота ШИМ должна быть не менее 30-50 кГц. В интернете достаточно много предложений по увеличению частоты ШИМВо всех описываются методы увеличения частоты до 31 кГц. В принципе приемлемый вариант, но мне захотелось большего.

Я разобрался с Таймером 1 микроконтроллера ATmega168/328, перевел ШИМ в быстродействующий режим и добился частоты ШИМ Ардуино до 62,5 кГц. Заодно я научился менять разрядность ШИМ. Чтобы в следующий раз не копаться в документации на микроконтроллеры ATmega168/328 я свел всевозможные варианты ШИМ для таймера 1 в таблицу.

Строчки из правого столбца для выбранного варианта необходимо написать в функции setup().

Варианты параметров ШИМ на выводах 9 и 10 Ардуино (таймер 1).

Разрешение Частота ШИМ Команды установки режима
8 бит 62 500 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
7 812,5 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0a;
976,56 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0b;
244,14 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0c;
61,04 Гц TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x0d;
9 бит 31 250 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x09;
3 906,25 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0a;
488,28 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0b;
122,07 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0c;
30,52 Гц TCCR1A = TCCR1A & 0xe0 | 2;
TCCR1B = TCCR1B & 0xe0 | 0x0d;
10 бит 1 5625 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x09;
1 953,13 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0a;
244,14 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0b;
61,04 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0c;
15,26 Гц TCCR1A = TCCR1A & 0xe0 | 3;
TCCR1B = TCCR1B & 0xe0 | 0x0d;

Следующий скетч генерирует на выводе 9 ШИМ с частотой 62,5 кГц и коэффициентом заполнения примерно 10 %.

void setup() {
  // ШИМ 8 разрядов, 62,5 кГц
  TCCR1A = TCCR1A & 0xe0 | 1;
  TCCR1B = TCCR1B & 0xe0 | 0x09; 
  analogWrite(9, 25); // на выводе 9 ШИМ=10%
}

void loop() {
}

Это максимально возможная частота ШИМ Ардуино для большинства плат (с частотой генератора 16 мГц).

В следующем уроке вернемся к разработке контроллера элемента Пельтье.

Предыдущий урок     Список уроков     Следующий урок

Источник: http://mypractic.ru/urok-37-shirotno-impulsnaya-modulyaciya-v-arduino.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}