Sadržaj:

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

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

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

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

Korak 1: Izradite brojač ulaza

Za ovaj korak stvaramo komponentu koja određuje razinu svjetline (kroz sat) pomoću dva prekidača: jedan za povećanje i jedan za smanjenje. Koristeći VHDL, brojač smo proizveli korištenjem 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

Priključak (trenutno_stanje: van STD_LOGIC_VECTOR (3 prema dolje 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: up_enable: završiti 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; završi ako; završi ako; kraj procesa flop; kraj Ponašanje;

Također nam je potreban sat za svaki ulaz na koji se može pričvrstiti (kad se podigne), pa smo također stvorili razdjelnik sata koji određuje koliko brzo se gumbi mogu pritisnuti između svake razine svjetline. Ovaj razdjelnik sata omogućuje nam da pravilno prikažemo pravu razinu na sedmosegmentnom zaslonu i proizvedemo odgovarajuću razinu intenziteta za svaku razinu.

entitet counter_clkDiv je

Port (clk: u std_logic; sclk: van std_logic); kraj counter_clkDiv; arhitektura my_clk_div od counter_clkDiv je konstanta 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_rub (clk)) onda if (div_cnt> = MAX_COUNT) tada tmp_clk <= nije tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; završi ako; završi ako; sclk <= tmp_clk; završi proces my_div; kraj my_clk_div;

Korak 2: Izradite LED razdjelnik sata

Za ovaj korak izrađujemo razdjelnik sata za LED žarulju kako bismo odredili 16 različitih razina intenziteta. Kad je 0 isključeno do 15 i prikazuje maksimalnu svjetlinu, razdjelnik sata povećava svaki pritisak na tipku za ono što smo postavili za razinu svjetline. Svaka povećana razina značila je povećanje sata LED žarulje. 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); kraj led_clkDiv; arhitektura Ponašanje led_clkDiv je signal tmp_clk: std_logic: = '0'; zajednička varijabla 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" => maks_broj: = 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: cijeli broj: = 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; završi ako; završi ako; led_clk <= tmp_clk; završi proces my_div; kraj Ponašanje;

Korak 3: Stvaranje LED kontrolera

Sad kad smo ovo uspjeli, vrijeme je da napokon kombiniramo 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 zaslona sa sedam segmenata zapravo se prethodno nije raspravljao jer smo VHDL datoteku zapravo posudili od dr. Bryana Mealyja zbog njezinog dugog i kompliciranog koda. Ono što u biti čini je prebacivanje ulaza s gumbima na sedmosegmentni zaslon na ploči Basys 3 tako da znamo na kojoj je razini svjetline.

Krećući se naprijed, LED kontroler koristi japanke za povećanje ili smanjenje broja koji istovremeno kontrolira i sedmosegmentni prikaz i razinu svjetline 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 dolje 0); led_clIC: out brojač kraja; 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); završna komponenta updown_counter; komponenta counter_clkDiv je Port (clk: u std_logic; sclk: out std_logic); završna 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_vector; završna komponenta sseg_dec; komponenta led_clkDiv je Port (trenutno_stanje: u STD_LOGIC_VECTOR (3 do 0); clk: u STD_LOGIC; led_clk: van STD_LOGIC); završna 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; početi 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) <= (sadašnje_stanje (0) niti 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 karta porta (clk => clk, sadašnje_stavo => sadašnje_stanje, led_clk => led_clk); clk_div: counter_clkDiv karta porta (clk => clk, sclk => sclk); kraj Ponašanje;

Korak 4: Uspostavljanje ograničenja i sastavljanje

Ograničenja

Za pravilno postavljanje i programiranje ploče Basys 3 prvo moramo postaviti datoteku ograničenja koja je priložena ovom koraku. Sljedeće postavke su prilagođene:

Gumbi

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

7 -segmentni zaslon

  • W7, W6, U8, V8, U5, V5, U7, V7 predstavljaju svaki segment jednog zaslona
  • U2, U4, V4, W4 predstavljaju svaku prikazanu anodu (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 druga žica vodi do UZEMLJENJA

Nakon što ste sve ovo postavili, sve što trebate učiniti je generirati svoj tok bitova (s bilo kojim softverom koji koristite, tj. Vivado), programirati ploču i bum! Dobili ste radnu ploču.

Napomena: Mapiranje pinova može se pronaći na podatkovnom listu Basys 3 ovdje.

Skupština

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

Ako sve ide dobro, trebali biste imati potpuno funkcionalan sustav zatamnjivanja. Ukratko, pritiskom na gornji gumb povećat ćete svjetlinu (sve do 15), a pritiskom na tipku za dolje smanjiti ćete svjetlinu (sve do 0). Nadam se da će sve biti u redu s vašim sada opuštenim vidom!

Preporučeni: