You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

pwm_test.vhd 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. ----------------------------------------------------------------------------------
  2. -- Company:
  3. -- Engineer:
  4. --
  5. -- Create Date: 16.03.2022 19:12:30
  6. -- Design Name:
  7. -- Module Name: pwm_test - Behavioral
  8. -- Project Name:
  9. -- Target Devices:
  10. -- Tool Versions:
  11. -- Description:
  12. --
  13. -- Dependencies:
  14. --
  15. -- Revision:
  16. -- Revision 0.01 - File Created
  17. -- Additional Comments:
  18. --
  19. ----------------------------------------------------------------------------------
  20. library IEEE;
  21. use IEEE.STD_LOGIC_1164.ALL;
  22. use IEEE.numeric_std.ALL;
  23. --use IEEE.MATH_REAL.ALL;
  24. --use IEEE.float_pkg.ALL;
  25. -- Uncomment the following library declaration if using
  26. -- arithmetic functions with Signed or Unsigned values
  27. --use IEEE.NUMERIC_STD.ALL;
  28. -- Uncomment the following library declaration if instantiating
  29. -- any Xilinx leaf cells in this code.
  30. --library UNISIM;
  31. --use UNISIM.VComponents.all;
  32. entity regler is
  33. Port ( clk : in STD_LOGIC; --Clk -> Gibt abtastzeit vor
  34. w : in signed(63 downto 0) := (others => '0'); --Sollwert
  35. y : in signed(63 downto 0) := (others => '0'); --Istwert
  36. u : inout signed(63 downto 0) := (others => '0'); --Stellgöße
  37. KR : in signed(9 downto 0) := to_signed(1, 10); -- Verstärkung
  38. T : in signed(9 downto 0) := to_signed(1000, 10); -- Abtastzeit in us 1000us
  39. TV : signed(9 downto 0) := (others => '0'); -- Vorhaltezeit für Differenzierer interesannt
  40. TN : in signed(9 downto 0) := to_signed(1, 10)); -- Nachstellzeit
  41. end regler;
  42. architecture Behavioral of regler is
  43. --signal stepWidth : integer := 1; -- 10 us später berechnet aus Clk und Prescaler
  44. signal prescaler : signed(63 downto 0) := to_signed(1000000, 64); -- prescaler für Zeit 1000000
  45. -- Parameter aus Sprungantwort etc.
  46. --signal KR : integer := 1; -- Verstärkung
  47. --signal T : integer := 1000; -- Abtastzeit in ns = 1ms = 1000000ns
  48. --signal TV : integer := 0; -- Vorhaltezeit für Differenzierer interesannt
  49. --signal TN : integer := 10; -- Nachstellzeit
  50. -- Konstanten Reglerparameter
  51. --signal a1 : integer ;
  52. --signal b0 : integer;
  53. --signal b1 : integer;
  54. --signal b2 : integer;
  55. --signal a1 : signed(63 downto 0) := to_signed(1, 64);
  56. --signal b0 : signed(63 downto 0) := KR *(1 + TV / T);
  57. --signal b1 : signed(63 downto 0) := -KR *(1 - T / TN + 2 * TV / T );
  58. --signal b2 : signed(63 downto 0) := KR * TV/T;
  59. --interne Signale signal
  60. --signal u_k1 : integer := 0; -- = uk-1 = u (wurde nicht geändert)
  61. --signal e_k : integer := 0; -- aktuelle Reglerdiffferenz
  62. signal e_k1 : signed(63 downto 0) := to_signed(0, 64); -- letzte ""
  63. signal e_k2 : signed(63 downto 0) := to_signed(0, 64); -- vorletzte ""
  64. signal I_k : signed(147 downto 0) := to_signed(0, 148); -- I-Anteil
  65. -- signal u : integer := 100000; -- Eingangswert Strecke
  66. --signal x : integer := 0; -- Ausgangssignal Strecke -> Stellgröße
  67. begin
  68. process(clk)
  69. variable e_k : signed(63 downto 0) := to_signed(0, 64); -- aktuelle Reglerabweichung
  70. --variable I_k : signed(148 downto 0) := to_signed(0, 64); -- I-Anteil
  71. --variable I_k1 : integer := 0; -- letzer I-Anteil
  72. variable u_var : signed(147 downto 0) := to_signed(0, 148);
  73. begin
  74. if rising_edge(clk) then
  75. -- Konstanten Reglerparameter
  76. -- a1 <= 1;
  77. -- b0 <= KR*(1+TV/T);
  78. -- b1 <= -KR *(1 - T / TN + 2 * TV / T );
  79. -- b2 <= KR * TV/T;
  80. e_k := w - y; --Reglerdifferenzbilden
  81. -- PID-Regler ---------------------------------------
  82. --u <= (a1*u+b0*e_k+b1*e_k1+b2*e_k2)/1000; --Stellgröße u berechnen, PID-Regler
  83. --e_k2 <= e_k1;
  84. --e_k1 <= e_k;
  85. -- PI-Regler ----------------------------------------
  86. I_k <= I_k + T * 1 / TN * prescaler * e_k / prescaler; -- I-Anteil berechnen
  87. u_var := KR * e_k + I_k;
  88. u <= u_var(63 downto 0);
  89. -----------------------------------------------------
  90. --u <= w; -- Regler überbrücken!
  91. end if;
  92. end process;
  93. --test
  94. end Behavioral;