---------------------------------------------------------------------------------- -- Company: -- Engineer: -- -- Create Date: 16.03.2022 19:12:30 -- Design Name: -- Module Name: pwm_test - Behavioral -- Project Name: -- Target Devices: -- Tool Versions: -- Description: -- -- Dependencies: -- -- Revision: -- Revision 0.01 - File Created -- Additional Comments: -- ---------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.numeric_std.ALL; --use IEEE.MATH_REAL.ALL; --use IEEE.float_pkg.ALL; -- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values --use IEEE.NUMERIC_STD.ALL; -- Uncomment the following library declaration if instantiating -- any Xilinx leaf cells in this code. --library UNISIM; --use UNISIM.VComponents.all; entity regler is Port ( clk : in STD_LOGIC; --Clk -> Gibt abtastzeit vor w : in signed(63 downto 0) := (others => '0'); --Sollwert y : in signed(63 downto 0) := (others => '0'); --Istwert u : inout signed(63 downto 0) := (others => '0'); --Stellgöße KR : in signed(9 downto 0) := to_signed(1, 10); -- Verstärkung T : in signed(9 downto 0) := to_signed(1000, 10); -- Abtastzeit in us 1000us TV : signed(9 downto 0) := (others => '0'); -- Vorhaltezeit für Differenzierer interesannt TN : in signed(9 downto 0) := to_signed(1, 10)); -- Nachstellzeit end regler; architecture Behavioral of regler is --signal stepWidth : integer := 1; -- 10 us später berechnet aus Clk und Prescaler signal prescaler : signed(63 downto 0) := to_signed(1000000, 64); -- prescaler für Zeit 1000000 -- Parameter aus Sprungantwort etc. --signal KR : integer := 1; -- Verstärkung --signal T : integer := 1000; -- Abtastzeit in ns = 1ms = 1000000ns --signal TV : integer := 0; -- Vorhaltezeit für Differenzierer interesannt --signal TN : integer := 10; -- Nachstellzeit -- Konstanten Reglerparameter --signal a1 : integer ; --signal b0 : integer; --signal b1 : integer; --signal b2 : integer; --signal a1 : signed(63 downto 0) := to_signed(1, 64); --signal b0 : signed(63 downto 0) := KR *(1 + TV / T); --signal b1 : signed(63 downto 0) := -KR *(1 - T / TN + 2 * TV / T ); --signal b2 : signed(63 downto 0) := KR * TV/T; --interne Signale signal --signal u_k1 : integer := 0; -- = uk-1 = u (wurde nicht geändert) --signal e_k : integer := 0; -- aktuelle Reglerdiffferenz signal e_k1 : signed(63 downto 0) := to_signed(0, 64); -- letzte "" signal e_k2 : signed(63 downto 0) := to_signed(0, 64); -- vorletzte "" signal I_k : signed(147 downto 0) := to_signed(0, 148); -- I-Anteil -- signal u : integer := 100000; -- Eingangswert Strecke --signal x : integer := 0; -- Ausgangssignal Strecke -> Stellgröße begin process(clk) variable e_k : signed(63 downto 0) := to_signed(0, 64); -- aktuelle Reglerabweichung --variable I_k : signed(148 downto 0) := to_signed(0, 64); -- I-Anteil --variable I_k1 : integer := 0; -- letzer I-Anteil variable u_var : signed(147 downto 0) := to_signed(0, 148); begin if rising_edge(clk) then -- Konstanten Reglerparameter -- a1 <= 1; -- b0 <= KR*(1+TV/T); -- b1 <= -KR *(1 - T / TN + 2 * TV / T ); -- b2 <= KR * TV/T; e_k := w - y; --Reglerdifferenzbilden -- PID-Regler --------------------------------------- --u <= (a1*u+b0*e_k+b1*e_k1+b2*e_k2)/1000; --Stellgröße u berechnen, PID-Regler --e_k2 <= e_k1; --e_k1 <= e_k; -- PI-Regler ---------------------------------------- I_k <= I_k + T * 1 / TN * prescaler * e_k / prescaler; -- I-Anteil berechnen u_var := KR * e_k + I_k; u <= u_var(63 downto 0); ----------------------------------------------------- --u <= w; -- Regler überbrücken! end if; end process; --test end Behavioral;