123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- ----------------------------------------------------------------------------------
- -- 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.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 integer := 0; --Sollwert
- y : in integer := 0; --Istwert
- u : inout integer := 0; --Stellgöße
- KR : in integer := 1; -- Verstärkung
- T : in integer := 1000; -- Abtastzeit in us
- TV : integer := 0; -- Vorhaltezeit für Differenzierer interesannt
- TN : in integer := 1); -- Nachstellzeit
- end regler;
-
- architecture Behavioral of regler is
-
-
- --signal stepWidth : integer := 1; -- 10 us später berechnet aus Clk und Prescaler
- signal prescaler : integer :=1000000; -- prescaler für Zeit
-
-
- -- 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 : integer := 1;
- signal b0 : integer := KR*(1+TV/T);
- signal b1 : integer := -KR *(1 - T / TN + 2 * TV / T );
- signal b2 : integer := 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 : integer := 0; -- letzte ""
- signal e_k2 : integer := 0; -- vorletzte ""
-
-
- signal I_k : integer := 0; -- I-Anteil
-
-
- -- signal u : integer := 100000; -- Eingangswert Strecke
-
- --signal x : integer := 0; -- Ausgangssignal Strecke -> Stellgröße
-
-
-
- begin
-
-
- process(clk)
-
- variable e_k : integer := 0; -- aktuelle Reglerabweichung
- --variable I_k : integer := 0; -- I-Anteil
- --variable I_k1 : integer := 0; -- letzer I-Anteil
-
- 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 <= KR * e_k + I_k;
-
- -----------------------------------------------------
- --u <= w; -- Regler überbrücken!
-
-
- end if;
-
- end process;
-
- --test
-
- end Behavioral;
|