Jump to content
View in the app

A better way to browse. Learn more.

T.M.I IThub

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Силовая электроника: между схемотехникой и энергетикой

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

Ключевое отличие от малосигнальной электроники: КПД критически важен. 99% КПД в источнике 100 кВт означает 1 кВт тепла на радиаторах — и это допустимо. 90% КПД — уже 10 кВт тепловых потерь, требующих серьёзного охлаждения.


Тиристор (SCR): управляемый диод

Тиристор (Silicon Controlled Rectifier, SCR) — четырёхслойный PNPN прибор. Включается коротким импульсом на управляющий электрод (Gate), выключается только при уменьшении тока ниже тока удержания (обычно — переходом через ноль в сети AC).

Анод (A) ─── P ─── N ─── P ─── N ─── Катод (K)
                    │
               Управляющий электрод (G)

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

  • Включается: короткий импульс IG > IGT (обычно 10–100 мА)

  • Выключается: ток анода < IH (ток удержания), обычно при переходе AC через ноль

  • Прямое напряжение в открытом состоянии: 1–3В (значительные потери!)

  • Применение: однофазные и трёхфазные выпрямители, регуляторы мощности

Фазовое управление тиристором

Основной метод управления мощностью с тиристором в сети AC:

Угол включения α=0°:  Полная мощность (100%)
Угол включения α=90°: Половинная мощность (~50%)
Угол включения α=150°: Малая мощность (~6%)
Угол включения α=180°: Минимальная мощность (0%)

Средняя мощность ≈ P_max × (1 + cos α) / 2

Схема фазового управления на Arduino/STM32:

// Детектор перехода через ноль (Zero-Crossing Detector)
// Подключён к INT0 (PD2) через оптопару
// При каждом переходе через ноль — прерывание

volatile bool zero_cross  = false;
volatile uint8_t power_pct = 50;  // 0-100%

// Прерывание от детектора нуля
ISR(INT0_vect)  // AVR / адаптируй под STM32/ESP32
{
    zero_cross = true;
}

void setup()
{
    // Выход на оптотиристор/оптосимистор (через ограничительный резистор ~300Ом)
    pinMode(9, OUTPUT);
    digitalWrite(9, LOW);
    
    // Прерывание INT0 по фронту (или обоим — зависит от схемы)
    attachInterrupt(0, zero_cross_ISR, RISING);
    
    // Таймер 1: генерирует прерывание через N микросекунд после нуля
    // Для сети 50 Гц: полупериод = 10 000 мкс
    // Угол 90° = 5 000 мкс задержка
}

void zero_cross_ISR()
{
    zero_cross = true;
}

void loop()
{
    if (zero_cross)
    {
        zero_cross = false;
        
        // Рассчитываем задержку включения
        // power_pct = 100 → delay = 0 мкс (включить немедленно)
        // power_pct = 50  → delay = 5000 мкс (угол 90°)
        // power_pct = 0   → delay = 10000 мкс (не включать)
        
        uint32_t delay_us = (100 - power_pct) * 100;  // 0-10000 мкс
        
        if (power_pct > 0 && power_pct < 100)
        {
            delayMicroseconds(delay_us);
            
            // Короткий импульс управления (100-200 мкс достаточно)
            digitalWrite(9, HIGH);
            delayMicroseconds(100);
            digitalWrite(9, LOW);
        }
        else if (power_pct >= 100)
        {
            digitalWrite(9, HIGH);  // Постоянно включено
        }
        else
        {
            digitalWrite(9, LOW);   // Постоянно выключено
        }
    }
}

Проблемы фазового управления:

  • Генерирует гармоники в сети (помехи)

  • Вызывает мигание освещения

  • Создаёт радиопомехи (EMI)

Решение для нагревателей: управление по полным полупериодам (Burst Firing)


Симистор (TRIAC): для двунаправленного управления

Симистор = два тиристора включённых встречно-параллельно. Проводит ток в ОБОИХ направлениях — идеален для управления нагрузкой переменного тока без выпрямления.

        MT2
         │
   ── P ─┤
   ── N ─┤── Gate (G)
   ── P ─┤
   ── N ─┤
         │
        MT1

Управление по нулю (Zero-Crossing Control / Burst Firing)

Вместо фазового управления — включаем нагреватель на N полных периодов из M:

Мощность 33%: ██░░██░░██░░██░░  (1 из 3 периодов включён)
Мощность 50%: ████░░░░████░░░░  (2 из 4 периодов)
Мощность 75%: ██████░░██████░░  (3 из 4 периодов)
Мощность 100%: ████████████████  (все периоды)

Преимущества: нет гармоник, нет EMI, нет щелчков в контакторах. Недостатки: медленнее регулирование (минимальный шаг — полпериода = 10 мс).

Оптимально для: промышленные нагреватели, печи сопротивления, ИК-нагреватели.

// Burst Firing контроллер
class BurstController {
private:
    uint8_t window_size;    // Размер окна в полупериодах (например, 20 = 200мс)
    uint8_t on_count;       // Сколько периодов включено
    uint8_t current_period; // Счётчик текущего периода
    
public:
    BurstController(uint8_t window = 20) : window_size(window), on_count(0), current_period(0) {}
    
    void setPower(float power_pct) {
        on_count = (uint8_t)(power_pct / 100.0f * window_size + 0.5f);
        on_count = constrain(on_count, 0, window_size);
    }
    
    // Вызвать при каждом переходе через ноль
    bool onZeroCross() {
        bool turn_on = (current_period < on_count);
        current_period = (current_period + 1) % window_size;
        return turn_on;
    }
};

BurstController burster(20);  // Окно 20 полупериодов = 200 мс

void zero_cross_handler() {
    bool should_be_on = burster.onZeroCross();
    digitalWrite(TRIAC_PIN, should_be_on ? HIGH : LOW);
}

Твёрдотельное реле (SSR): простое решение

SSR (Solid-State Relay) — готовый модуль с тиристором/симистором и оптической развязкой внутри. Управление: 3–32В DC сигнал (совместимо с Arduino/ПЛК), нагрузка: до 40А/480В AC.

Выбор SSR:

Параметр

Рекомендация

Ток нагрузки

Выбирать с запасом ×2 (40А SSR для 20А нагрузки)

Тип управления

DC Control (3-32V) для ПЛК, AC Control (90-280V) для PID-регулятора с выходом AC

Тип коммутации

Zero-Cross для нагревателей, Random Fire для двигателей и трансформаторов

Напряжение нагрузки

24-380В AC (проверьте соответствие!)

Охлаждение

ОБЯЗАТЕЛЬНО радиатор! 0.5°C/Вт для алюминиевого радиатора

Тепловой расчёт SSR:

def calculate_ssr_heatsink(load_current_a: float, ambient_temp_c: float = 40.0,
                            max_case_temp_c: float = 80.0) -> dict:
    """
    Расчёт требуемого теплового сопротивления радиатора для SSR.
    
    SSR: прямое напряжение ~1.2В (Fotek, Crydom)
    """
    
    # Тепловыделение SSR
    vf       = 1.2    # В, прямое падение на симисторе
    p_loss   = vf * load_current_a  # Вт
    
    # Тепловое сопротивление корпус-радиатор (junction-to-case): ~0.5°C/Вт
    rth_jc = 0.5  # °C/W (из datasheet)
    
    # Максимальная температура p-n перехода обычно 125°C
    t_junction_max = 125.0
    
    # Требуемое тепловое сопротивление радиатор-воздух
    # T_ambient + P × (Rth_jc + Rth_heatsink) = T_case_max
    rth_heatsink = (max_case_temp_c - ambient_temp_c) / p_loss - rth_jc
    
    # Размер алюминиевого радиатора (грубая оценка):
    # R_th ≈ 50 / (площадь_см²) для вертикального расположения
    heatsink_area_cm2 = 50.0 / rth_heatsink if rth_heatsink > 0 else float('inf')
    
    return {
        'load_current_a':  load_current_a,
        'power_loss_w':    round(p_loss, 1),
        'rth_heatsink':    round(rth_heatsink, 2),
        'heatsink_area_cm2': round(heatsink_area_cm2, 0),
        'safe_operation':  rth_heatsink > 0,
    }

# Пример: SSR 25А нагрузки при T_окр=40°C
result = calculate_ssr_heatsink(25.0)
print(f"Потери: {result['power_loss_w']} Вт")
print(f"Требуется радиатор: {result['heatsink_area_cm2']} см²")
# Результат: 30 Вт потерь, нужен радиатор ~150 см²

IGBT: для высоких частот и больших мощностей

IGBT (Insulated Gate Bipolar Transistor) — гибрид MOSFET и биполярного транзистора. Управляется напряжением (как MOSFET), но имеет низкое напряжение насыщения при больших токах (как биполярный).

Где используется:

  • Частотные преобразователи (инвертор моста)

  • ИБП и стабилизаторы

  • Сварочные аппараты

  • Индукционные нагреватели

  • Зарядные станции для электромобилей

Ключевые характеристики при выборе IGBT:

Vce_max    — максимальное напряжение коллектор-эмиттер (выбирать ×2 от напряжения шины!)
Ic_max     — максимальный ток (с учётом теплового сопротивления!)
Vce(sat)   — напряжение насыщения (потери в открытом состоянии)
Eoff/Eon   — энергия переключения (потери на коммутацию, растут с частотой!)
toff       — время выключения (ограничивает максимальную частоту ШИМ)

Расчёт потерь IGBT:

def calculate_igbt_losses(vce_sat: float, ic_rms: float,
                           e_on_j: float, e_off_j: float,
                           fsw_hz: float, duty: float) -> dict:
    """
    Расчёт потерь IGBT.
    
    vce_sat: напряжение насыщения, В (из datasheet при Ic и Tj)
    ic_rms:  действующий ток коллектора, А
    e_on_j:  энергия включения, Дж (из datasheet)
    e_off_j: энергия выключения, Дж
    fsw_hz:  частота коммутации, Гц
    duty:    скважность ШИМ (0..1)
    """
    
    # Потери проводимости (conduction losses)
    # P_cond = Vce_sat × Ic_avg
    ic_avg  = ic_rms * duty  # Упрощение для прямоугольного тока
    p_cond  = vce_sat * ic_avg
    
    # Потери переключения (switching losses)
    # P_sw = (E_on + E_off) × fsw
    p_sw = (e_on_j + e_off_j) * fsw_hz
    
    # Суммарные потери
    p_total = p_cond + p_sw
    
    return {
        'conduction_w':  round(p_cond, 2),
        'switching_w':   round(p_sw, 2),
        'total_w':       round(p_total, 2),
        'efficiency_pct': round((1 - p_total / (vce_sat * ic_rms + p_total)) * 100, 1),
    }

# Пример: IGBT 1200В/50А в инверторе 400В
# Частотник 11 кВт: Idc ≈ 30А, fsw=8кГц, d=0.8
losses = calculate_igbt_losses(
    vce_sat = 2.0,     # В при 125°C
    ic_rms  = 30.0,    # А
    e_on_j  = 0.8e-3,  # 0.8 мДж
    e_off_j = 1.2e-3,  # 1.2 мДж
    fsw_hz  = 8000,    # 8 кГц
    duty    = 0.8
)
print(f"Потери проводимости: {losses['conduction_w']} Вт")
print(f"Потери переключения: {losses['switching_w']} Вт")
print(f"Итого: {losses['total_w']} Вт")
# При 6 IGBT в трёхфазном мосте: ×6 = итоговые потери инвертора

Снабберные цепи: защита от перенапряжений

При выключении IGBT/тиристора индуктивная нагрузка создаёт выброс напряжения: V_spike = L × dI/dt. Без защиты — мгновенная смерть транзистора.

RC-снаббер (для симистора):

Нагрузка
    │
[Симистор]
    │
 ─────────  ← RC снаббер параллельно симистору
│         │
[R ~47 Ом] [C ~47 нФ, 630В]
│         │
 ─────────
    │
   GND

Расчёт RC-снаббера:

def calculate_rc_snubber(load_inductance_h: float, 
                          switch_current_a: float,
                          supply_voltage_v: float) -> dict:
    """
    Расчёт RC-снаббера для тиристора/симистора.
    
    Критерий: выброс напряжения ≤ 2 × Vsupply
    """
    import math
    
    # Пиковое напряжение без снаббера
    # V_peak ≈ V_supply + I × sqrt(L/C_parasitic)
    # С снаббером ограничиваем до 2×V_supply
    
    v_max = 2 * supply_voltage_v
    
    # Ёмкость снаббера (минимальная для ограничения выброса)
    # C ≥ L × I² / (V_max - V_supply)²
    delta_v = v_max - supply_voltage_v
    c_min = load_inductance_h * switch_current_a**2 / delta_v**2
    c_snubber = c_min * 2  # Запас × 2, нормализуем до стандартного ряда E12
    
    # Стандартный ряд конденсаторов (нФ)
    e12 = [10, 12, 15, 18, 22, 27, 33, 39, 47, 56, 68, 82]
    c_nf = c_snubber * 1e9
    c_standard_nf = min(e12, key=lambda x: abs(x - c_nf))
    # Если нет в ряду — берём следующий больший
    for val in sorted(e12):
        if val >= c_nf:
            c_standard_nf = val
            break
    
    c_actual = c_standard_nf * 1e-9
    
    # Сопротивление снаббера
    # R ≈ sqrt(L/C) для критического затухания
    r_critical = math.sqrt(load_inductance_h / c_actual)
    r_snubber  = r_critical  # Или немного больше для надёжности
    
    # Мощность резистора
    # P = 0.5 × C × V² × f  (для каждого переключения)
    # Для AC 50Гц: f = 100 (2 перехода через ноль)
    p_resistor = 0.5 * c_actual * supply_voltage_v**2 * 100
    
    return {
        'C_nF':    c_standard_nf,
        'C_voltage': f"{int(v_max * 1.5 / 100) * 100}В",  # Округляем до стандарта
        'R_ohm':   round(r_snubber, 0),
        'R_watts': round(p_resistor * 2, 1),  # Запас × 2
    }

# Пример: управление нагревателем 5 кВт через симистор
# Нагреватель = почти чисто активная нагрузка, но есть монтажная индуктивность ~10 мкГн
result = calculate_rc_snubber(10e-6, 22.7, 220)
print(f"Снаббер: R={result['R_ohm']} Ом/{result['R_watts']} Вт, "
      f"C={result['C_nF']} нФ/{result['C_voltage']}")

Трёхфазное управление нагревателями

Для трёхфазных печей и нагревателей используют 3 SSR (по одному на каждую фазу) или специализированные трёхфазные тиристорные модули:

               L1 ──[SSR_A]──┐
               L2 ──[SSR_B]──┼── Нагреватели (треугольник или звезда)
               L3 ──[SSR_C]──┘
                   ↑  ↑  ↑
               Сигналы управления с ПЛК/контроллера

Управление: все три SSR получают одинаковый сигнал (одновременно вкл/выкл)
            → симметричная нагрузка, нет перекоса фаз

Или: поочерёдное включение фаз (phase rotation) → снижает пиковый ток пуска

Алгоритм ПИД для температуры печи с трёхфазным нагревателем:

class FurnaceController:
    """Контроллер температуры трёхфазной печи"""
    
    def __init__(self, kp=5.0, ki=0.1, kd=2.0, max_power=100.0):
        self.pid = PIDController(kp, ki, kd, ts=1.0, out_min=0, out_max=max_power)
        self.setpoint = 0.0
        
        # Защиты
        self.max_temp = 1200.0   # °C максимум печи
        self.fault    = False
    
    def control_cycle(self, temp_actual: float) -> dict:
        """Один цикл управления (вызывать каждую секунду)"""
        
        # Защита по превышению температуры
        if temp_actual > self.max_temp:
            self.fault = True
        
        if self.fault:
            return {'ssr_output': 0.0, 'fault': True, 'temp': temp_actual}
        
        # ПИД
        self.pid.set_setpoint(self.setpoint)
        power_pct = self.pid.compute(temp_actual)
        
        # Мощность → количество периодов включения (Burst Fire)
        # Окно 10 полупериодов = 100 мс
        on_periods = int(power_pct / 100 * 10 + 0.5)
        
        return {
            'ssr_output':   power_pct,
            'on_periods':   on_periods,  # из 10
            'setpoint':     self.setpoint,
            'temp_actual':  temp_actual,
            'error':        self.setpoint - temp_actual,
            'fault':        False,
        }

Тепловой расчёт: как не сжечь компоненты

Тепловая цепь аналогична электрической:

  • Температура Напряжение

  • Мощность потерь Ток

  • Тепловое сопротивление Rth Электрическое сопротивление

T_junction = T_ambient + P_loss × (Rth_j-c + Rth_c-hs + Rth_hs-a)

Где:
Rth_j-c   — тепловое сопротивление кристалл→корпус (из datasheet)
Rth_c-hs  — корпус→радиатор (зависит от термопасты, ~0.1–0.5 °C/Вт)
Rth_hs-a  — радиатор→воздух (зависит от размера и обдува)
def thermal_check(p_loss_w: float, t_ambient_c: float,
                   rth_jc: float, rth_chs: float, rth_hsa: float,
                   t_junction_max: float = 125.0) -> dict:
    """
    Проверка теплового режима силового прибора.
    """
    rth_total = rth_jc + rth_chs + rth_hsa
    
    t_junction = t_ambient_c + p_loss_w * rth_total
    t_case     = t_ambient_c + p_loss_w * rth_hsa  # Температура корпуса
    
    margin = t_junction_max - t_junction
    safe   = margin > 10.0  # Запас минимум 10°C
    
    return {
        'T_junction_c': round(t_junction, 1),
        'T_case_c':     round(t_case, 1),
        'margin_c':     round(margin, 1),
        'safe':         safe,
        'warning':      not safe,
    }

# Проверка SSR 30А:
result = thermal_check(
    p_loss_w   = 1.2 * 25,  # 1.2В × 25А = 30 Вт
    t_ambient_c = 40.0,
    rth_jc     = 0.5,        # из datasheet Fotek SSR-40DA
    rth_chs    = 0.2,        # хорошая термопаста
    rth_hsa    = 1.5,        # алюминиевый радиатор 150 см²
)
print(f"Температура перехода: {result['T_junction_c']}°C")
print(f"Запас: {result['margin_c']}°C — {'OK' if result['safe'] else 'ОПАСНО!'}")

Типичные ошибки в силовой электронике

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

  2. SSR без радиатора → перегрев за несколько минут при токе > 5А

  3. Управляющий сигнал без оптической развязки → 220В на Arduino/ПЛК = конец

  4. Не проверена полярность тиристора → не переключается или горит сразу

  5. Фазовое управление на трансформаторную нагрузку → насыщение сердечника

  6. IGBT с Vce_max = Vsupply → первый же выброс убивает → минимум ×2 запас


Заключение

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

Для начала: освойте управление нагревателем через SSR и ПИД-регулятор — это самая распространённая и безопасная задача. Потом — изучите теорию тиристорного управления. После этого — IGBT в H-мостах для двигателей. И только с хорошей теоретической базой — трёхфазные инверторы.

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

User Feedback

Create an account or sign in to leave a review

There are no reviews to display.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.