EMI im Griff: PWM Spreizspektrum mit einem Fibonacci LFSR

Elektronik Projekte

Scharfe Spektrallinie über der EMV Grenze. Kein Platz für zusätzliche Drosseln. Lösung: ein Fibonacci LFSR im CPLD und ein einziges Register.

Die Ausgangslage

Ein klassisches Relais zieht bei rund 12 V an und hält bei rund 5 V. Statt zwei Spannungen aufzubauen, schaltet man die Haltespannung über die volle Versorgung mit einer PWM, die Spuleninduktivität glättet den Rest. Wir liegen bei 16,25 kHz: oberhalb der Hörschwelle, langsam genug für die Freilaufdiode, und ein glatter Teiler des 4,16 MHz internen Oszillators im Lattice® MachXO2® CPLD (4,16 MHz / 256 = 16,25 kHz).

In der Praxis sind es nicht ein Relais, sondern sechzehn Kanäle. Aber zur Erklärung genügt einer. Was wir auf der EMV Messung sehen, ist eine scharfe Linie bei 16,25 kHz und die ungeraden Oberwellen: 49, 81, 113, 146, 178 kHz und so weiter. Das geregelte Band für leitungsgebundene Störungen beginnt bei 150 kHz, und die 146 und 178 kHz Linien laufen genau hinein. Eine schmale Spitze ist viel schwerer zu bestehen als dieselbe Energie verteilt über 1 kHz Bandbreite.

Also wird die PWM gespreizt.

Fibonacci, im CPLD

Die Idee: in jeder PWM Periode die Duty Cycle um einen kleinen Zufallswert variieren. Die Grundfrequenz sitzt nicht mehr auf einem einzelnen Spektrumsbin, sondern wandert über einen schmalen Bereich. Spitzenwert sinkt, Energie bleibt.

Als Zufallsquelle nimmt man kein echtes Rauschen, das wäre überdimensioniert. Es genügt eine deterministisch wirkende Pseudozufallsfolge, die alle Werte in einem Bereich gleichmässig durchläuft. Das klassische Mittel der Wahl ist das Linear Feedback Shift Register in der Fibonacci Form.

Der Name kommt von der Struktur. Ein Fibonacci LFSR berechnet jedes neue Bit als XOR Verknüpfung mehrerer ausgewählter alter Bits aus dem Schieberegister, schiebt den gesamten Inhalt um eine Stelle und legt das frische Bit an den Eingang. Genau wie Leonardo von Pisas berühmte Zahlenfolge Fn=Fn−1+Fn−2F_n = F_{n-1} + F_{n-2} wird der nächste Wert aus den vorhergehenden gebildet, nur dass die Addition durch ein XOR und die Stellenwahl durch ein Polynom ersetzt sind.

Die Mathematik dahinter ist die Theorie der endlichen Körper. Ein n Bit Register entspricht einem Polynom über F2\mathbb{F}_2. Wählt man die Rückkopplungsabgriffe so, dass das zugehörige Polynom primitiv ist, durchläuft das LFSR sämtliche 2n−12^n - 1 Zustände ungleich null genau einmal, bevor es sich wiederholt. Man nennt diese Folge eine maximum length sequence oder kurz m-sequence. Sie hat schöne Eigenschaften: gleichverteilte Bits, breites flaches Spektrum, eine Autokorrelation, die fast eine Diracfunktion ist.

Für 8 Bit ist x^8 + x^6 + x^5 + x^4 + 1 ein primitives Polynom. Das ergibt die Taps {7, 5, 4, 3} und eine Periode von 255. Genau das, was die Spreizung braucht.

Das Verilog, kommentiert

localparam [7:0] PWM_DUTY = 8'h66;       // 40 % Haltestrom (102/256)

reg [7:0] pwm_cnt;        // frei laufend 0..255, wrappt bei 16,25 kHz
reg [7:0] lfsr;           // 8 Bit Fibonacci LFSR, 255 Zustände
reg [7:0] duty_latched;   // gedithertes Duty, eine Periode stabil

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        pwm_cnt      <= 8'h00;
        lfsr         <= 8'h01;
        duty_latched <= PWM_DUTY;
    end else begin
        pwm_cnt <= pwm_cnt + 8'd1;

        // Fibonacci LFSR, Taps {7,5,4,3}, voller 255-Zyklus
        lfsr <= {lfsr[6:0], lfsr[7] ^ lfsr[5] ^ lfsr[4] ^ lfsr[3]};
        if (lfsr == 8'h00) lfsr <= 8'h01;     // Zero-Lock Guard

        // Neues Duty einmal pro PWM Periode samplen
        if (pwm_cnt == 8'h00)
            duty_latched <= PWM_DUTY + {4'h0, lfsr[3:0]};
    end
end

assign pwm_active = (pwm_cnt < duty_latched);

Verwendet werden nur die unteren vier Bit des LFSR. Das gibt 16 Duty Werte: 0x66 (40,0 %) bis 0x75 (45,7 %). Die effektive Grundfrequenz wandert pro PWM Periode über rund 750 Hz.

Der Zero Lock Guard ist eine Vorsichtsmassnahme. Aus einem Zustand ungleich null kann das LFSR den All Zero Zustand mathematisch nicht erreichen. Beim Power On könnte aber ein gestörter Startzustand auftauchen, der Guard kostet einen Komparator und garantiert, dass das LFSR nie auf der All Zero Linie hängen bleibt.

Eine Falle: das Latch

Wichtig ist duty_latched. Das LFSR taktet mit dem Systemtakt, nicht mit der PWM Periode. Würde der Komparator direkt gegen die rohe LFSR Ausgabe vergleichen, wackelte die Schwelle innerhalb einer PWM Periode 256 mal hin und her. Genau dort wo die Abfallflanke sein sollte, würde der Ausgang flackern.

Mit dem Latch ist die Schwelle innerhalb der Periode konstant, die Flanke ist sauber, und der nächste Periodenstart bekommt einen neuen Wert. Das Muster taugt allgemein: wenn eine langsam veränderliche Stellgrösse von einer schnellen Quelle gespeist wird, latcht man sie an der Grenze, an der der Konsument wrappt.

Reicht 750 Hz Spreizung?

Die Auflösungsbandbreiten (RBW) bei der Prüfung leitungsgebundener Störungen sind in CISPR 16-1-1 festgelegt:

BandFrequenzbereichRBW
A9 kHz bis 150 kHz200 Hz
B150 kHz bis 30 MHz9 kHz

Eine Spreizung wirkt nur dann, wenn sie deutlich breiter als die RBW ist, denn sonst landet die ganze gespreizte Energie wieder in einem einzigen Auflösungsbin und der Peak Detektor sieht keinen Unterschied.

Hier hilft, dass sich die Spreizung mit dem Harmonischen Index linear mitskaliert. Wenn die Grundwelle um 750 Hz wandert, wandert die N-te Harmonische um N × 750 Hz:

FrequenzBandRBWSpreizungwirksam?
16,25 kHz (Grundwelle)A200 Hz750 Hzklar wirksam
178 kHz (11. Harmonische)B9 kHz8,3 kHzgrenzwertig
1 MHzB9 kHz46 kHzdeutlich wirksam
10 MHzB9 kHz460 kHzweit überdimensioniert

Bei der typischen EMV Problemzone (oberhalb 1 MHz) ist die Massnahme also genau dort am wirksamsten, wo der Peak hoch ist. An der unteren Bandgrenze rund um 178 kHz ist sie nur knapp wirksam. Wer dort mehr Marge braucht, verwendet mehr LFSR Bits (z.B. 6 statt 4 für 64 Werte und rund 3 kHz Grundspreizung), zum Preis eines grösseren Ripples auf der Spule.

Was der Spektrumanalysator sieht

Vorher: scharfe 16,25 kHz Linie, ungerade Oberwellen bei 49, 81, 113, 146, 178 kHz und so weiter, jeweils als schmale Spitze. Ab 150 kHz greift die Messung, die 178 kHz Linie und alle höheren liegen im geregelten Bereich.

Nachher: die Grundwelle ist innerhalb der 200 Hz RBW von Band A sauber verschmiert. Im Band B oberhalb 150 kHz wird die Spreizung mit jeder Harmonischen wirksamer. Bei den hohen Harmonischen, wo die Peaks erfahrungsgemäss am ehesten anschlagen, ist die Verschmierung breit gegenüber der 9 kHz RBW und der Peak Detektor sieht eine deutlich kleinere Spitze. Die ans Relais abgegebene Energie ist identisch.

Aus “knapp” wird “komfortabel”, die Stückliste bleibt unangetastet: keine zusätzliche Drossel, kein zusätzlicher Kondensator, kein separater Taktgenerator.

Was zehn Flipflops gebracht haben

RessourceAnzahlZweck
pwm_cnt8 FFFrei laufender PWM Zähler, 256 Ticks Periode
lfsr8 FF8 Bit Fibonacci LFSR
duty_latched8 FFPeriodenstabiles gedithertes Duty
LFSR Taps4 Eingänge, 1 XORDie eigentliche Rückkopplung

24 Flipflops, die quer über alle Kanäle geteilt werden. Pro Kanal kommt nur das registrierte Ausgangs-FF dazu. Im MachXO2-640HC sind 640 LUT4 und entsprechend viele FF, der ganze PWM Block belegt unter 5 % des Bausteins.

Die Rechnung hinter der Spreizung:

Das ist die ganze Geschichte. Ein 8 Bit Fibonacci LFSR, ein Komparator, ein Latch. EMV besteht.

Quellen

Schlüsselwörter: PWM Spreizspektrum, Fibonacci LFSR, MachXO2 CPLD, EMV Filter sparen, CISPR 16, Verilog LFSR, leitungsgebundene Störaussendungen, EMV Optimierung Beratung, Lattice CPLD Design, EMI Reduktion, Elektronikentwicklung Schweiz, swissEmbedded FPGA Zürich

EMV Messung knapp daneben und die Stückliste lässt keine zusätzlichen Filter mehr zu? Wir schauen uns Schaltung, Layout und FPGA Code gemeinsam an und finden die billigen Hebel, die im Silizium schon vorhanden sind.

Kontaktieren Sie uns →