Перейти к содержимому

Задний фронт vs передний фронт: какой метод диммирования выбрать

Диммирование с фазовой отсечкой: почему TRIAC (передний фронт) вызывает мерцание LED на низкой яркости, и когда MOSFET (задний фронт) — правильный выбор.

Коротко: Передний фронт — это стандартный TRIAC-диммер, который подключает нагрузку во второй половине каждого полупериода AC (лучше всего для ламп накаливания и нагревателей). Задний фронт — это MOSFET-диммер, который подключает нагрузку с начала полупериода (лучше для LED-ламп, меньше мерцания). Большинство бюджетных модулей используют передний фронт.



Проблема

Ваш TRIAC-диммер отлично работает с лампой накаливания или нагревателем — но стоит подключить LED-лампу, и начинаются проблемы: мерцание, нестабильность, непредсказуемое поведение на низкой яркости.

Это классическое несовпадение метода управления и типа нагрузки. TRIAC-диммеры реализуют передний фронт — метод, оптимизированный для резистивных нагрузок, который создаёт проблемы с электронными LED-драйверами. Задний фронт (MOSFET) решает эти проблемы.

Типичные симптомы несовпадения с форумов:

  • «TRIAC-диммеры с передним фронтом плохо работают с диммируемыми LED-лампами» (Arduino Forum, 2024)
  • «Я использую TRIAC-платы для ламп накаливания — диммируют отлично. Но с LED-лампами работают некорректно» (Arduino Forum, 2024)
  • Мерцание LED ниже 30–50% яркости, которое не исправить кодом
  • Лампа нормально работает на 100%, но нестабильна при диммировании



Причина проблемы

Оба метода используют фазовое управление (управление углом включения): TRIAC или транзистор открывается в определённой точке полупериода AC и пропускает часть синусоиды на нагрузку. Разница в том, какая часть полупериода попадает на нагрузку.


Передний фронт (прямая фазовая отсечка)

text
Синусоида:       ╭─────╮        ╭─────╮
                 │     │        │     │
─────────────────╯     ╰────────╯     ╰────
Передний фронт (50% мощности):
                 ──╭───╮        ──╭───╮
                   │   │          │   │
───────────────────╯   ╰──────────╯   ╰────
                   ↑ TRIAC включается здесь
  • TRIAC включается в середине полупериода
  • Нагрузка получает вторую половину каждого полупериода
  • Характерный резкий скачок напряжения в момент включения TRIAC
  • Отраслевой стандарт бытовых диммеров на протяжении 50 лет

Проблема с LED: Драйвер LED видит резкий скачок напряжения от нуля до ~200–300 В. Многие LED-драйверы воспринимают это как помеху, включают защитные цепи и начинают работать нестабильно.


Задний фронт (обратная фазовая отсечка)

text
Синусоида:       ╭─────╮        ╭─────╮
                 │     │        │     │
─────────────────╯     ╰────────╯     ╰────
Задний фронт (50% мощности):
                 ╭───╮          ╭───╮
                 │   │          │   │
─────────────────╯   ╰──────────╯   ╰──────
                     ↑ транзистор выключается здесь
  • MOSFET (транзистор) открывается в начале полупериода, закрывается в середине
  • Нагрузка получает первую половину каждого полупериода
  • Напряжение плавно нарастает от нуля по синусоиде — без резких скачков
  • Более сложная и дорогая схема, требует более сложного управления

Преимущество для LED: Драйвер LED видит напряжение, которое плавно нарастает от нуля — как в начале обычного полупериода, только укороченного. Большинство LED-драйверов корректно обрабатывают такую форму сигнала.


Математика управления

c
// Передний фронт: больше задержка = меньше мощность
delay_us = firing_angle;     // большая задержка = меньше мощность
// Задний фронт: больше задержка = больше мощность
// (мы закрываем транзистор раньше)
delay_us = half_period - firing_angle;  // большая задержка = больше мощность
// half_period:
// 50 Гц → 10 000 мкс
// 60 Гц →  8 333 мкс



Решения



🟢 Начинающим: выбор правильного модуля

Не хотите разбираться с углами фазы — выберите нужный модуль и используйте DimmerLink.

Большинство доступных TRIAC-модулей (включая RBDimmer) используют передний фронт. Это стандарт — хорошо работает с резистивными нагрузками: лампы накаливания, галогенные, нагреватели, паяльники, реостаты.

Если нужен задний фронт для LED — нужен MOSFET-диммер, а не TRIAC-модуль.

Практическое правило:

  • Лампы накаливания / галогенные / нагреватели → любой TRIAC-диммер (передний фронт)
  • Качественные LED с маркировкой «TRIAC dimmable» → TRIAC (передний фронт) работает
  • LED с нестабильностью / мерцанием → задний фронт (MOSFET-модуль)

Управление через DimmerLink:

Любой ESP32 works with standard RBDimmer TRIAC modules (leading edge) over I2C or UART. When trailing edge is needed, DimmerLink also controls MOSFET modules.

Когда выбрать DimmerLink:

  • ☐ Raspberry Pi (нет ОС реального времени для ISR)
  • ☐ ESP32-S2/C3/H2 (одноядерные — программные библиотеки не поддерживаются)
  • ☐ Хотите управлять диммером с любой платформы без написания ISR-кода
  • cpp
    // DimmerLink через I2C — работает с любым подключённым модулем
    // (TRIAC передний фронт или MOSFET задний фронт — изменения кода не нужны)
    // Документация: https://www.rbdimmer.com/docs/dimmerlink-I2CCommunication
    #include <Wire.h>
    #define DIMMER_ADDR 0x50
    #define REG_LEVEL   0x10
    void setLevel(uint8_t level) {
        Wire.beginTransmission(DIMMER_ADDR);
        Wire.write(REG_LEVEL);
        Wire.write(level);
        Wire.endTransmission();
    }
    void setup() {
        Wire.begin();
        setLevel(50);  // 50% яркости
    }
    void loop() {}


    🔵 Продвинутым: реализация в коде

    Хотите управлять углом фазы самостоятельно — вот как это работает.

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


    Вариант A: Передний фронт на ESP32 с rbdimmerESP32 ✅ Рекомендуется

    Когда: двухъядерный ESP32 + резистивные нагрузки или качественные TRIAC-совместимые LED-лампы.

    Библиотека rbdimmerESP32 реализует передний фронт по умолчанию.

    cpp
    // Платформа: двухъядерный ESP32
    // Библиотека: rbdimmerESP32 — передний фронт, автоматически
    // Исходный код: github.com/robotdyn-dimmer/rbdimmerESP32
    #include "rbdimmerESP32.h"
    #define ZC_PIN  18
    #define DIM_PIN 19
    rbdimmer dimmer;
    void setup() {
        dimmer.begin(ZC_PIN, DIM_PIN, 50);  // Сеть 50 Гц
        dimmer.setPower(50);                // 50% мощности
    }
    void loop() {
        // Плавное изменение
        for (int p = 10; p <= 95; p++) {
            dimmer.setPower(p);
            delay(30);
        }
        for (int p = 95; p >= 10; p--) {
            dimmer.setPower(p);
            delay(30);
        }
    }


    Вариант B: Задний фронт — ручная реализация на Arduino AVR

    Когда: передний фронт вызывает проблемы с LED и нужно переключиться на задний фронт без замены модуля (некоторые MOSFET-модули поддерживают это аппаратно).

    cpp
    // Платформа: Arduino Uno / Mega (только AVR)
    // Реализация: задний фронт через ручное управление ISR перехода через ноль
    // ВНИМАНИЕ: работает только с MOSFET-модулями — НЕ с TRIAC!
    // Для ESP32 используйте rbdimmerESP32 (передний фронт)
    #define ZC_PIN  2   // переход через ноль — только пины 2 или 3 на Uno
    #define DIM_PIN 11  // пин управления затвором MOSFET
    volatile int brightness = 50;  // 0–100%
    // Прерывание по переходу через ноль
    void zeroCrossISR() {
        // Задний фронт: открываем в начале, закрываем через (brightness/100) * half_period
        // 50 Гц: half_period = 10 000 мкс
        // 60 Гц: half_period = 8 333 мкс
        int on_time = (brightness * 10000L) / 100;  // 50 Гц
        digitalWrite(DIM_PIN, HIGH);    // открываем MOSFET сразу
        delayMicroseconds(on_time);     // удерживаем открытым
        digitalWrite(DIM_PIN, LOW);     // закрываем MOSFET
    }
    void setup() {
        pinMode(DIM_PIN, OUTPUT);
        attachInterrupt(digitalPinToInterrupt(ZC_PIN),
                        zeroCrossISR, RISING);
    }
    void loop() {
        brightness = 50;  // 50%
    }

    Примечание: delayMicroseconds() внутри ISR блокирует другие прерывания. Для рабочего проекта замените задержку аппаратным таймером. Этот пример демонстрирует только принцип.



    ⚠️ Типичные ошибки с форумов

    Реальные ошибки из 3 форумных тредов (2019–2025).

    • «Переключил на задний фронт в коде — мерцание осталось»: Если у вас TRIAC-модуль (не MOSFET), программный задний фронт ничего не даст. TRIAC физически не может работать по заднему фронту — нужен MOSFET-модуль.

    • «Переключил на задний фронт — лампа стала тусклее при том же значении»: Это ожидаемо. Задний фронт работает с инвертированной логикой по сравнению с передним фронтом. При 50% заднего фронта вы получаете другую долю полупериода, чем при 50% переднего. Перекалибруйте диапазон.

    • «Нашёл библиотеку, которая делает задний фронт на том же модуле»: Если у вас стандартный TRIAC-модуль (BTA16, BT139, BTA08) — никакая библиотека не переключит его на задний фронт. Физика не позволяет.

    • «На форуме пишут: замена кода с переднего фронта RBDimmer на ручной задний фронт с переходом через ноль РЕШИЛА проблему мерцания LED без замены железа» — это работает только если у них был MOSFET-модуль, а не TRIAC.




    Краткий чек-лист

    Перед публикацией на форуме проверьте:

  • ☐ Какой у вас модуль — TRIAC или MOSFET? (посмотрите маркировку чипа)
  • ☐ TRIAC (BTA08, BTA16, BT139) — только передний фронт
  • ☐ MOSFET (IRLZ44N, IRF540) — поддерживает задний фронт
  • ☐ Ваша нагрузка резистивная (лампа накаливания) или LED с электронным драйвером?
  • ☐ Для LED с проблемами: попробуйте сначала заменить лампу на Philips/Osram —
  • это решает 80% случаев без замены модуля



    Таблица совместимости

    Метод Модуль Нагрузка Работает? Примечания
    Передний фронт TRIAC RBDimmer Лампа накаливания Отлично
    Передний фронт TRIAC RBDimmer Галоген 230В Отлично
    Передний фронт TRIAC RBDimmer Нагреватель Отлично
    Передний фронт TRIAC RBDimmer Philips/Osram LED Качественная лампа
    Передний фронт TRIAC RBDimmer Дешёвый noname LED ⚠️ Мерцание < 40%
    Задний фронт MOSFET Любой диммируемый LED Лучший результат
    Задний фронт TRIAC Любая Невозможно аппаратно



    Похожие темы



    Остались вопросы?

    Post on rbdimmer.com forum or open a GitHub Issue.

    Поделиться этой записью
    Войти оставить комментарий