Wird eine H-Brücke mit PWM angesteuert, dann muß darauf geachtet werden, dass die Transistoren z.B. des Zweiges A mit High-Side und der Low-Side niemals gleichzeitig leiten. Denn sonst kommt es zu Kurzschlussströmen und zum schnellen Tod der Halbleiter.
Daher ist es sinnvoll, die Transistoren der High- und Low-Side getrennt anzusteuern. Auf diese Art kann dann ohne Probleme eine Totzeit eingefügt werden, während der beide Transistoren eines Zweiges gesperrt sind. Diese Totzeit wird gebraucht, wenn die Transistoren eine Sperrverzugszeit haben, also nicht sofort nach dem Abschalten sperren. Nach dem Abschalten eines Transistors muß gewartet werden, bevor der jeweils andere eingeschaltet wird.
Hier ist ein VHDL-Code, der in ein PWM-Signal diese Zeiten für die Ansteuerung der Transistoren einfügt. Das Modul Totzeit verzögert die steigende Flanke des Eingangssignals Inp und damit das Einschalten des jeweiligen Transistors.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Totzeit is Generic ( tdead : integer := 5 ); -- Anzahl Takte Totzeit Port ( clk : in STD_LOGIC; inp : in STD_LOGIC; outp : out STD_LOGIC := '0'); end Totzeit; architecture Behavioral of Totzeit is signal delay : integer range 0 to tdead-1 := 0; begin process begin wait until rising_edge(clk); if (inp='0') then -- Deaktivieren: outp <= '0'; -- sofort ausschalten delay <= 0; -- Verzögerungszähler zurücksetzen else -- Aktivieren: verzögert einschalten if (delay < tdead-1) then -- Zähler abgelaufen? delay <= delay+1; -- n: weiterzählen else outp <= '1'; -- j: High end if; end if; end process; end Behavioral;
Es wird zweimal in das Modul PWM_Totzeit eingefügt, das als Eingangssignal das eigentliche PWM Signal Inp erhält, und die Ansteuersignale für die HighSide und LowSide eines Transistorzweiges ausgibt.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity PWM_Totzeit is Port ( Inp : in STD_LOGIC; HighSide : out STD_LOGIC; LowSide : out STD_LOGIC; CLK : in STD_LOGIC); end PWM_Totzeit; architecture Behavioral of PWM_Totzeit is component Totzeit is Generic ( tdead : integer := 5 ); -- Anzahl Takte Totzeit Port ( clk : in STD_LOGIC; inp : in STD_LOGIC; outp : out STD_LOGIC := '0'); end component; signal notinp : std_logic; begin hs: Totzeit PORT MAP( Inp => Inp, Outp => HighSide, CLK => CLK ); ls: Totzeit PORT MAP( Inp => notinp, Outp => LowSide, CLK => CLK ); notinp <= not Inp; end Behavioral;
Hier wurde der aktive Zustand sowohl der High- wie auch der Low-Side mit '1' definiert. Sollte das nicht zum entsprechenden Treiber passen, muß das Signal vor der Ausgabe auf den FPGA-Pin noch invertiert werden.
In der Waveform sieht man schön die Zeit, in der beide Signale HighSide und LowSide inaktiv (= '0') sind.
In dieser Waveform ist zu erkennen, dass bei zu kurzem aktiven Pegel des Inp Signals das entsprechende HighSide bzw. LowSide Signal nicht mehr aktiv werden kann.
Und hier die RTL-Schematic, in der die sehr effiziente Umsetzung gut erkennbar ist:
"Totzeit für H-Brücke" vollständig lesen »