Sadržaj:

Prigušiva LED dioda pomoću Basys 3 ploče: 5 koraka
Prigušiva LED dioda pomoću Basys 3 ploče: 5 koraka

Video: Prigušiva LED dioda pomoću Basys 3 ploče: 5 koraka

Video: Prigušiva LED dioda pomoću Basys 3 ploče: 5 koraka
Video: Lesson 98: Arduino 10 LED Push button Projects, Potentiometer LED Voltmeter and Traffic Light 2024, Novembar
Anonim
LED za zatamnjivanje pomoću ploče Basys 3
LED za zatamnjivanje pomoću ploče Basys 3

U ovom vodiču ćemo izgraditi i kontrolirati vanjski LED sistem zatamnjivanja. Pomoću dostupnih tipki korisnik može zatamniti LED žarulju na bilo koju željenu svjetlinu. Sustav koristi Basys 3 ploču, a spojen je na matičnu ploču koja sadrži otpornik i LED žarulju. Pritiskom na označeno dugme "gore" povećavate svjetlinu, a pritiskom na tipku "dolje" svjetlinu ćete smanjiti sve do nule. Ovo ne samo da sprječava korisnika da zaslijepi žarulje poput sunca, već i štedi energiju!

Korak 1: Kreirajte ulazni brojač

Za ovaj korak stvaramo komponentu koja određuje nivo svjetline (kroz sat) pomoću dva prekidača: jedan za povećanje i jedan za smanjenje. Koristeći VHDL, napravili smo brojač upotrebom D japanki. Pritiskom na tipku "gore" pomiče se sljedeće stanje u sadašnje stanje, izlaz na zaslon sa sedam segmenata i LED žarulju.

entitet updown_counter je

Port (trenutno_stanje: van STD_LOGIC_VECTOR (3 prema 0); prethodno_stanje: u STD_LOGIC_VECTOR (3 do 0); sljedeće_stanje: u STD_LOGIC_VECTOR (3 do 0); clk: u STD_LOGIC; dolje_omogućeno: u STD_LOGIC; up_enable: u end updown_counter; arhitektura Ponašanje updown_counter -a je start flop: proces (next_state, clk, up_enable, down_enable, previous_state) begin if (rise_edge (clk)) then if (up_enable = '1', a ne (next_state = "0000")) then present_state <= next_state; elsif (down_enable = '1', a ne (previous_state = "1111")) then present_state <= previous_state; end if; end if; kraj procesa flop; end Behavioral;

Također nam je potreban sat za svaki ulaz na koji se može pričvrstiti (kada se podigne), pa smo također stvorili razdjelnik sata koji određuje koliko brzo se tipke mogu pritisnuti između svakog nivoa svjetline. Ovaj razdjelnik sata nam omogućava da pravilno prikažemo pravi nivo na sedmosegmentnom ekranu i proizvedemo pravi nivo intenziteta za svaki nivo.

entitet counter_clkDiv je

Port (clk: u std_logic; sclk: van std_logic); end counter_clkDiv; arhitektura my_clk_div od counter_clkDiv je konstantna max_count: integer: = (10000000); signal tmp_clk: std_logic: = '0'; započeti my_div: process (clk, tmp_clk) varijabla div_cnt: integer: = 0; započeti if (rastući_red (clk)) onda if (div_cnt> = MAX_COUNT) tada tmp_clk <= nije tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; end if; end if; sclk <= tmp_clk; završi proces my_div; kraj my_clk_div;

Korak 2: Kreirajte LED razdjelnik sata

Za ovaj korak stvaramo razdjelnik sata za LED sijalicu kako bismo odredili 16 različitih nivoa intenziteta. Kada je 0 isključeno do 15 i prikazuje maksimalnu svjetlinu, razdjelnik sata povećava svaki pritisak na dugme za ono što smo postavili za nivoe svjetline. Svaki povećani nivo značio je povećanje takta LED sijalice. Sjećajući se da se svjetlina ne povećava linearno, okrenuli smo sat do najveće moguće vrijednosti i u skladu s tim smanjili naše satove.

Napomena: koristimo plavu LED diodu. Korištenje druge boje (poput crvene) zahtijevat će potpuno drugačije satove; postavka srednje svjetline za plavu već bi mogla biti najveća svjetlina za crvenu. To se događa jer će različite valne duljine svjetlosti zahtijevati različite količine energije, a hladnije boje poput ljubičaste i plave zahtijevaju više energije, dok toplije boje poput crvene i narančaste zahtijevaju manje energije.

entitet led_clkDiv je Port (trenutno_stanje: u STD_LOGIC_VECTOR (3 do 0); clk: u STD_LOGIC; led_clk: van STD_LOGIC); end led_clkDiv; arhitektura Ponašanje led_clkDiv je signal tmp_clk: std_logic: = '0'; deljena promenljiva max_count: integer; start count_stuff: process (present_state) begin case present_state je kada je "0000" => max_count: = 0; kada je "0001" => max_count: = 2; kada je "0010" => max_count: = 4; kada je "0011" => max_count: = 6; kada je "0100" => max_count: = 8; kada je "0101" => max_count: = 10; kada je "0110" => max_count: = 12; kada je "0111" => max_count: = 14; kada je "1000" => max_count: = 16; kada je "1001" => max_count: = 25; kada je "1010" => max_count: = 50; kada je "1011" => max_count: = 100; kada je "1100" => max_count: = 150; kada je "1101" => max_count: = 200; kada je "1110" => max_count: = 250; kada je "1111" => max_count: = 300; završni slučaj; kraj procesa count_stuff; my_div: process (clk, tmp_clk, present_state) varijabla div_cnt: integer: = 0; start if (rise_edge (clk)) then if (div_cnt> = max_count) then tmp_clk <= not tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; end if; end if; led_clk <= tmp_clk; završi proces my_div; end Behavioral;

Korak 3: Kreiranje LED kontrolera

Sada kada smo ovo dogurali, vrijeme je da konačno spojimo sve komponente koje smo do sada stvorili u datoteku LED kontrolera.

Ukratko, korištene su sljedeće komponente:

  • Brojač ulaza (updown_counter)
  • Razdjelnik sata (counter_clkDiv)
  • LED razdjelnik sata (led_clkDiv)
  • Upravljački program za prikaz u sedam segmenata (sseg_dec) (priložena datoteka)

Upravljački program za prikaz od sedam segmenata zapravo se ranije nije raspravljao jer smo VHDL datoteku zapravo posudili od dr. Bryana Mealyja zbog dugačkog i komplikovanog koda. Ono što u suštini radi je prebacivanje ulaza sa dugmeta na sedmo-segmentni ekran na Basys 3 ploči, tako da znamo na kom nivou osvetljenosti je uključen.

Krećući se naprijed, LED kontroler koristi japanke za povećanje ili smanjenje broja koji istovremeno kontrolira i sedmosegmentni prikaz i razinu osvjetljenja LED žarulje.

brojač entiteta je Port (clk: u STD_LOGIC; up_enable: u STD_LOGIC; down_enable: u STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 downto 0); DISP_EN: out STD_LOGIC_VECTOR (3 downto 0); led_clIC: out STD_LLIC: out STD_LLOGIC; end counter; arhitektura Ponašanje brojača je komponenta updown_counter je Port (present_state: out STD_LOGIC_VECTOR (3 downto 0); previous_state: in STD_LOGIC_VECTOR (3 downto 0); next_state: in STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; down_ up_enable: u STD_LOGIC); krajnja komponenta updown_counter; komponenta counter_clkDiv je Port (clk: u std_logic; sclk: out std_logic); krajnja komponenta counter_clkDiv; komponenta sseg_dec je Port (ALU_VAL: u std_logic_vector (7 downto 0); SIGN: in std_logic; VALID: in std_logic; CLK: in std_logic; DISP_EN: out std_logic_vector (3 downto 0); SEGMENTS: out std_logic_ve; krajnja komponenta sseg_dec; komponenta led_clkDiv je Port (trenutno_stanje: u STD_LOGIC_VECTOR (3 prema dolje 0); clk: u STD_LOGIC; led_clk: van STD_LOGIC); krajnja komponenta led_clkDiv; signal prisutno_stanje: STD_LOGIC_VECTOR (3 do 0): = "0000"; signal next_state: STD_LOGIC_VECTOR (3 do 0): = "0000"; signal previous_state: STD_LOGIC_VECTOR (3 do 0): = "0000"; signal Alu_Val: STD_LOGIC_VECTOR (7 do 0); sclk signala: STD_LOGIC; start Alu_Val (7 downto 4) <= "0000"; Alu_Val (3 downto 0) <= trenutno_stanje; next_state (0) <= not (present_state (0)); next_state (1) <= present_state (0) xor present_state (1); next_state (2) <= (present_state (0) i present_state (1)) xor present_state (2); next_state (3) <= (present_state (0) i present_state (1) i present_state (2)) xor present_state (3); prethodno_stanje (0) <= nije (trenutno_stanje (0)); prethodno_stanje (1) <= sadašnje_stanje (0) xnor sadašnje_stanje (1); prethodno_stanje (2) <= (trenutno_stanje (0) ni sadašnje_stanje (1)) xor sadašnje_stanje (2); previous_state (3) sclk, next_state => next_state, previous_state => previous_state, up_enable => up_enable, down_enable => down_enable, present_state => present_state); prikaz: sseg_dec karta porta (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_div: led_clkDiv mapa porta (clk => clk, prezent_status => sadašnje_stanje, led_clk => led_clk); clk_div: counter_clkDiv karta porta (clk => clk, sclk => sclk); end Behavioral;

Korak 4: Uspostavljanje ograničenja i sastavljanje

Ograničenja

Da bismo pravilno postavili i programirali Basys 3 ploču, prvo moramo postaviti našu datoteku ograničenja koja je priložena ovom koraku. Sljedeće postavke su prilagođene:

Buttons

  • Promijenjeno T18 u "up_enable" (povećanje svjetline)
  • Promijenjeno U17 u "down_enable" (smanjenje svjetline)

7 -segmentni ekran

  • W7, W6, U8, V8, U5, V5, U7, V7 predstavljaju svaki segment jednog ekrana
  • U2, U4, V4, W4 predstavljaju svaku anodu prikazanu (samo 2 su aktivne jer je naš najveći broj 15)

PMOD zaglavlje JC

JC7 je mjesto gdje spajamo jednu od žica LED žarulje, a drugu žicu vodimo do UZEMLJENJA

Nakon što ste sve ovo postavili, sve što trebate učiniti je generirati vaš bitstream (sa bilo kojim softverom koji koristite, tj. Vivado), programirati vašu ploču i bum! Nabavio si radnu ploču.

Napomena: Mapiranje pinova može se naći na Basys 3 tablici podataka ovdje.

Montaža

Korak 5: Upotreba prekidača za prigušivanje svjetla

Ako sve prođe u redu, trebali biste imati potpuno funkcionalan sistem zatamnjivanja. Da rezimiramo, pritiskom na gornje dugme povećavate svjetlinu (sve do 15), a pritiskom na tipku za dolje smanjit ćete svjetlinu (sve do 0). Nadam se da će sve biti u redu s vašim sada opuštenim vidom!

Preporučuje se: