 | Antena 09.03.2025 18:46
|
| 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. |
|