Hlavní přehled   |   Info a nápověda Přihlásit   |   Registrovat
 
 
Příspěvek umístěný v tematickém vlákně:    Generátor Figuera - Obecná diskuze   (str. 29)
 
Antena   
09.03.2025 18:46

335 10 160 
Ahoj
bohužel musím přiznat že AI k něčemu skutečně je, a to ke psaní sw. Klobou dolů, já bych to dělal rok a nakonec bych musel zapatit borce co programuje vhdl (třeba k tomu nakonec dojde) ale základ mám - generování 2 sinusovek v jazyce vhdl...pak později hallovy sondy, měření vstupu a výstupu proudů a napětí, zobrazení na VGA monitoru a PID regulace při změně zátěže na výstupu tak aby se buzení sekundáru pohybovalo ve správné oblasti magnetického toku a to mezi cca 0,15-1,48T
teď pouze generování sinusů pro desku https://www.hwkitchen.cz/fpga-kit-cyclone-iv-ep4ce6-usb-blaster-ir-ovladac/


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.MATH_REAL.ALL;

entity SinePWMGenerator is
Port (
clk : in STD_LOGIC; -- Hlavní hodinový signál
reset : in STD_LOGIC; -- Resetovací signál
PWM_sine_out : out STD_LOGIC; -- PWM výstup pro sinus
PWM_cosine_out : out STD_LOGIC -- PWM výstup pro sinus posunutý o 180°
);
end SinePWMGenerator;

architecture Behavioral of SinePWMGenerator is
-- Parametry
constant CLK_FREQ : REAL := 50000000.0; -- Frekvence hodin (50 MHz)
constant SINE_FREQ : REAL := 50.0; -- Frekvence sinusu (50 Hz)
constant STEP : REAL := 2.0 * 3.14159265359 * SINE_FREQ / CLK_FREQ; -- Krok úhlu
constant PWM_RES : INTEGER := 1024; -- Rozlišení PWM

-- Signály
signal angle : REAL := 0.0; -- Úhel pro výpočet sinusu
signal sine_value : REAL := 0.0; -- Hodnota sinusu
signal cosine_value : REAL := 0.0; -- Hodnota kosinusu (sinus posunutý o 180°)
signal counter : INTEGER := 0; -- Čítač pro PWM
signal sine_threshold : INTEGER := 0; -- PWM prahová hodnota pro sinus
signal cosine_threshold : INTEGER := 0; -- PWM prahová hodnota pro kosinus
begin
-- Proces pro generování sinusového a kosinusového signálu
process(clk, reset)
begin
if reset = '1' then
angle <= 0.0;
elsif rising_edge(clk) then
-- Zvýšení úhlu
angle <= angle + STEP;
if angle >= 2.0 * 3.14159265359 then
angle <= angle - 2.0 * 3.14159265359;
end if;

-- Výpočet hodnot
sine_value <= 3.5 * sin(angle) + 6.5;
cosine_value <= 3.5 * sin(angle + 3.14159265359) + 6.5;

-- Výpočet PWM prahů
sine_threshold <= INTEGER(sine_value * REAL(PWM_RES) / 10.5);
cosine_threshold <= INTEGER(cosine_value * REAL(PWM_RES) / 10.5);
end if;
end process;

-- Proces pro generování PWM signálů
process(clk, reset)
begin
if reset = '1' then
counter <= 0;
elsif rising_edge(clk) then
-- Zvýšení čítače PWM
counter <= counter + 1;
if counter >= PWM_RES then
counter <= 0;
end if;
end if;

-- Generování PWM výstupů
PWM_sine_out <= '1' when counter < sine_threshold else '0';
PWM_cosine_out <= '1' when counter < cosine_threshold else '0';
end process;

end Behavioral;

jestli to bude skutečně dělat to co potřebuju změřím na osciloskopu...
A.
0 Zvláštní ocenění za úsilí nebo přínos0 Pozitivní ohlasyOznačit příspěvek
  Přejít na příspěvek do vlákna      

 
 
Omforum.cz   |   Nápověda   |   Pravidla fóra   |   Podpořte chod fóra   |   Vytvořil: 2015-2026 Adam Benda
 
 
CC BY-NC-ND 3.0 CZ
Licence Creative Commons
Toto dílo podléhá licenci Creative Commons Uveďte původ-Neužívejte komerčně-Nezpracovávejte 3.0 Česká republika License