Contrôle d'Équilibrage de Tension et Atténuation des Ondulations dans les Systèmes MMC-HVDC

Architecture Fondamentale et Logique de Commutation des Cellules

Le convertisseur modulaire multiniveau (MMC) repose sur la mise en série de cellules de commutation, communément appelées sous-modules (SM). Dans une topologie en pont demi-pont (half-bridge), la gestion de l'état des interrupteurs détermine si le condensateur interne est inséré dans le circuit ou contourné. Cette flexibilité permet de synthétiser une onde de tension proche d'une sinusoïde parfaite.

from enum import Enum

class SwitchState(Enum):
    INSERTED = 1
    BYPASSED = 0

class HalfBridgeSM:
    def __init__(self):
        self.state = SwitchState.BYPASSED

    def update_state(self, target_state: SwitchState):
        self.state = target_state

    def evaluate_behavior(self, arm_current: float) -> str:
        if self.state == SwitchState.INSERTED:
            return "Charging" if arm_current > 0 else "Discharging"
        return "Bypassed"

# Initialisation et test
sm_cell = HalfBridgeSM()
sm_cell.update_state(SwitchState.INSERTED)
print(f"État du condensateur: {sm_cell.evaluate_behavior(arm_current=15.0)}")

Cette approche orientée objet modélise le comportement dynamique d'une cellule. En fonction de l'état commandé et de la direction du courant dans la branche, le système détermine si le condensateur stocke ou restitue de l'énergie.

Algorithme de Tri pour l'Équilibrage des Condensateurs

Dans les configurations monophasées, la dispersion des tensions aux bornes des condensateurs est un défi majeur qui dégrade la qualité de l'onde. L'algorithme de tri est la méthode de prédilection pour gérer cette dispersion. Contrairement à une approche statique, l'implémentation réelle doit intégrer la direction du courant dans la branche pour déterminer la séquence d'insertion optimale.

import heapq

def select_submodules(voltages: list[float], arm_current: float, num_required: int) -> list[int]:
    indexed_voltages = [(v, i) for i, v in enumerate(voltages)]

    if arm_current > 0:
        # Courant positif (charge) : insérer les cellules avec les tensions les plus faibles
        selected = heapq.nsmallest(num_required, indexed_voltages, key=lambda x: x[0])
    else:
        # Courant négatif (décharge) : insérer les cellules avec les tensions les plus élevées
        selected = heapq.nlargest(num_required, indexed_voltages, key=lambda x: x[0])

    return [index for _, index in selected]

# Simulation de l'équilibrage
measured_voltages = [205.2, 198.5, 201.0, 195.8, 203.4]
current_direction = 1.5 
to_insert = 3

chosen_indices = select_submodules(measured_voltages, current_direction, to_insert)
print(f"Indices des sous-modules à insérer : {chosen_indices}")

L'utilisation de structures de données optimisées comme les tas (heaps) permet d'extraire rapidement les tensions extrêmes. En couplant cette logique de tri avec le signe du courant de branche, le contrôleur assure une convergence rapide des tensions vers leur valeur nominale.

Suppression Active des Ondulations par Filtrage Numérique

Les ondulations de tension résiduelles, souvent liées aux fréquences de commutation ou aux harmoniques du réseau, peuvent augmenter les pertes par échauffement. Une approche efficace consiste à isoler les composantes harmoniques indésirables via un filtrage numérique spécifique, tel qu'un filtre coupe-bande (notch filter), pour injecter un signal de compensation en opposition de phase dans la boucle de modulation.

import numpy as np
from scipy import signal

def compensate_ripple(voltage_waveform: np.ndarray, sampling_rate: float, target_freq: float, quality_factor: float = 30.0) -> np.ndarray:
    # Conception d'un filtre coupe-bande pour isoler la fréquence de l'ondulation
    b_notch, a_notch = signal.iirnotch(target_freq, quality_factor, sampling_rate)

    # Extraction de la composante d'ondulation spécifique
    ripple_component = signal.filtfilt(b_notch, a_notch, voltage_waveform)

    # Génération du signal de compensation en opposition de phase
    anti_phase_signal = -ripple_component

    return anti_phase_signal

# Paramètres de simulation
fs = 10000  
t = np.arange(0, 0.1, 1/fs)
fundamental_freq = 50 
ripple_freq = 100 

# Tension de sortie synthétique avec harmonique indésirable
v_out = 100 * np.sin(2 * np.pi * fundamental_freq * t) + 5 * np.sin(2 * np.pi * ripple_freq * t)

compensation_signal = compensate_ripple(v_out, fs, ripple_freq)

L'application d'un filtre IIR coupe-bande permet d'extraire avec précision l'harmonique ciblée sans déphaser excessivement le signal fondamental. Le signal résultant, une fois inversé et sommé à la référence de modulation, annule activement la composante ondulatoire indésirable.

Étiquettes: MMC HVDC PowerElectronics VoltageBalancing SignalProcessing

Publié le 28 juillet à 18h55