Spisu treści:

Ściemnialna dioda LED za pomocą płytki Basys 3: 5 kroków
Ściemnialna dioda LED za pomocą płytki Basys 3: 5 kroków

Wideo: Ściemnialna dioda LED za pomocą płytki Basys 3: 5 kroków

Wideo: Ściemnialna dioda LED za pomocą płytki Basys 3: 5 kroków
Wideo: LED, czyli diody świecące - jak podłączać, aby ich NIE spalić? Kurs elektroniki od FORBOT [#12] » 2024, Lipiec
Anonim
Ściemnialna dioda LED za pomocą płytki Basys 3
Ściemnialna dioda LED za pomocą płytki Basys 3

W tym przewodniku zamierzamy zbudować i kontrolować zewnętrzny system ściemniania LED. Za pomocą dostępnych przycisków użytkownik może przyciemnić żarówkę LED do dowolnej jasności. System wykorzystuje płytkę Basys 3 i jest podłączony do płytki stykowej zawierającej rezystor i żarówkę LED. Naciśnięcie wyznaczonego przycisku „w górę” zwiększy jasność, a naciśnięcie przycisku „w dół” zmniejszy jasność do zera. Nie tylko zapobiega to oślepieniu użytkownika przez jasne jak słońce żarówki, ale także oszczędza energię!

Krok 1: Utwórz licznik wejściowy

W tym kroku tworzymy komponent określający poziom jasności (poprzez zegar) za pomocą dwóch przełączników: jednego do zwiększania i drugiego do zmniejszania. Korzystając z VHDL wyprodukowaliśmy licznik przy użyciu przerzutników D. Naciśnięcie przycisku „w górę” przesuwa następny stan do stanu obecnego, wyprowadzając go na siedmiosegmentowy wyświetlacz i żarówkę LED.

encja updown_counter to

Port (stan_obecny: 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_enable: in STD_LOGIC; up_enable: in STD_LOGIC; koniec licznika updown; architektura Zachowanie updown_counter to begin flop: process(next_state, clk, up_enable, down_enable, previous_state) begin if (rising_edge(clk)) then if (up_enable = '1' i not(next_state="0000")), then present_state <= następny_stan; elsif (down_enable = '1' i not(previous_state= "1111")), then present_state <= previous_state; koniec jeśli; koniec jeśli; koniec procesu flop; koniec Behawioralny;

Potrzebujemy również zegara dla każdego wejścia, które ma się zatrzasnąć (gdy się podnosi), więc stworzyliśmy również dzielnik zegara, który określa, jak szybko można naciskać przyciski między poszczególnymi poziomami jasności. Ten dzielnik zegara pozwala nam prawidłowo wyświetlać odpowiedni poziom na siedmiosegmentowym wyświetlaczu i wytwarzać odpowiedni poziom intensywności dla każdego poziomu.

jednostka counter_clkDiv to

Port (clk: in std_logic; sclk: out std_logic); koniec counter_clkDiv; architektura my_clk_div z counter_clkDiv jest stała max_count: integer:= (10000000); sygnał tmp_clk: std_logic:= '0'; początek my_div: process (clk, tmp_clk) zmienna div_cnt: integer:= 0; rozpocząć if (rising_edge(clk)) then if (div_cnt >= MAX_COUNT) then tmp_clk <= nie tmp_clk; div_cnt:= 0; w przeciwnym razie div_cnt:= div_cnt + 1; koniec jeśli; koniec jeśli; sclk <= tmp_clk; zakończ proces my_div; zakończ mój_clk_div;

Krok 2: Utwórz dzielnik zegara LED

Na tym etapie tworzymy dzielnik zegara dla żarówki LED, aby określić 16 różnych poziomów intensywności. Gdy 0 jest wyłączone do 15 wyświetlającego maksymalną jasność, dzielnik zegara zwiększa każde naciśnięcie przycisku o ustawiony przez nas poziom jasności. Każdy rosnący poziom oznaczał wzrost zegara dla żarówki LED. Pamiętając, że jasność nie wzrasta liniowo, podkręciliśmy zegar do najwyższego możliwego poziomu i odpowiednio zmniejszyliśmy nasze zegary.

Uwaga: używamy niebieskiej diody LED. Użycie innego koloru (np. czerwonego) będzie wymagało zupełnie innych zegarów; średnie ustawienie jasności dla koloru niebieskiego może już być maksymalną jasnością dla koloru czerwonego. Dzieje się tak, ponieważ różne długości fal światła będą wymagały różnych ilości energii, przy czym chłodniejsze kolory, takie jak fioletowy i niebieski, wymagają więcej energii, podczas gdy cieplejsze kolory, takie jak czerwony i pomarańczowy, wymagają mniej energii.

podmiot led_clkDiv to Port (present_state: w STD_LOGIC_VECTOR (3 do 0); clk: w STD_LOGIC; led_clk: out STD_LOGIC); koniec led_clkDiv; architektura Zachowanie led_clkDiv to sygnał tmp_clk: std_logic:= '0'; współdzielona zmienna max_count: integer;begin count_stuff: process (present_state) begin case present_state jest gdy "0000" => max_count:= 0; kiedy "0001" => max_count:= 2; kiedy "0010" => max_count:= 4; kiedy "0011" => max_count:= 6; kiedy "0100" => max_count:= 8; kiedy "0101" => max_count:= 10; kiedy "0110" => max_count:= 12; kiedy "0111" => max_count:= 14; kiedy "1000" => max_count:= 16; kiedy "1001" => max_count:= 25; gdy "1010" => max_count:= 50; gdy "1011" => max_count:= 100; kiedy "1100" => max_count:= 150; kiedy "1101" => max_count:= 200; gdy "1110" => max_count:= 250; kiedy "1111" => max_count:= 300; sprawa końcowa; koniec procesu count_stuff; my_div: process (clk, tmp_clk, present_state) zmienna div_cnt: integer:= 0; rozpocznij if (rising_edge(clk)) then if (div_cnt >= max_count) then tmp_clk <= nie tmp_clk; div_cnt:= 0; w przeciwnym razie div_cnt:= div_cnt + 1; koniec jeśli; koniec jeśli; led_clk <= tmp_clk; zakończ proces my_div; koniec Behawioralny;

Krok 3: Tworzenie kontrolera LED

Teraz, gdy zaszliśmy tak daleko, nadszedł czas, aby w końcu połączyć wszystkie komponenty, które do tej pory stworzyliśmy w pliku LED Controller.

Podsumowując, użyte komponenty są następujące:

  • Licznik wejściowy (licznik updown_counter)
  • Dzielnik zegara (counter_clkDiv)
  • Dzielnik zegara LED (led_clkDiv)
  • Siedmiosegmentowy sterownik ekranu (sseg_dec) (załączony plik)

Siedmiosegmentowy sterownik wyświetlacza nie był wcześniej omawiany, ponieważ faktycznie pożyczyliśmy plik VHDL od dr. Bryana Mealy'ego ze względu na jego długi i skomplikowany kod. Zasadniczo kieruje nasze wejścia przycisków do siedmiosegmentowego wyświetlacza na płycie Basys 3, abyśmy wiedzieli, na jakim poziomie jasności.

Idąc dalej, kontroler LED wykorzystuje klapki, aby zwiększyć lub zmniejszyć liczbę, która jednocześnie kontroluje zarówno wyświetlacz siedmiosegmentowy, jak i poziom jasności żarówki LED.

licznik jednostek to Port (clk: w STD_LOGIC; up_enable: w STD_LOGIC; down_enable: w STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 do 0); DISP_EN: out STD_LOGIC_VECTOR (3 do 0); led_clk: out STD_LOGIC); licznik końca; architektura Zachowanie licznika to komponent updown_counter to 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_LOGIC:in up_enable: w STD_LOGIC); składnik końcowy updown_counter; komponent counter_clkDiv to Port (clk: in std_logic; sclk: out std_logic); komponent końcowy counter_clkDiv; komponent sseg_dec to Port (ALU_VAL: w std_logic_vector(7 do 0); SIGN: w std_logic; VALID: w std_logic; CLK: w std_logic; DISP_EN: na std_logic_vector(3 do 0); SEGMENTS(7 na std_logic); składnik końcowy sseg_dec; komponent led_clkDiv to Port (present_state: w STD_LOGIC_VECTOR (3 do 0); clk: w STD_LOGIC; led_clk: out STD_LOGIC); komponent końcowy led_clkDiv; sygnał stan_obecny: STD_LOGIC_VECTOR (3 do 0):= "0000"; sygnał next_state: STD_LOGIC_VECTOR (3 do 0):= "0000"; sygnał poprzedni_stan: STD_LOGIC_VECTOR (3 do 0):= "0000"; sygnał Alu_Val: STD_LOGIC_VECTOR (7 do 0); sygnał sclk: STD_LOGIC; rozpocznij Alu_Val(7 do 4) <= "0000"; Alu_Val(3 do 0) <= stan_obecny; next_state(0) <= not(present_state(0)); następny_stan(1) <= obecny_stan(0) xor obecny_stan(1); next_state(2) <= (present_state(0) i present_state(1)) xor present_state(2); następny_stan(3) <= (stan_obecny(0) i stan_obecny(1) i stan_obecny(2)) xor stan_obecny(3); poprzedni_stan(0) <= not(obecny_stan(0)); poprzedni_stan(1) <= obecny_stan(0) xnor obecny_stan(1); poprzedni_stan(2) <= (stan_obecny(0) ani stan_obecny(1)) xor stan_obecny(2); poprzedni_stan(3) sclk, następny_stan => następny_stan, poprzedni_stan => poprzedni_stan, up_enable => up_enable, down_enable => down_enable, obecny_stan => obecny_stan); wyświetlanie: mapa portów sseg_dec(ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTY => SEGMENTY); led_div: mapa portów led_clkDiv(clk => clk, present_state => present_state, led_clk => led_clk); clk_div: mapa portów counter_clkDiv(clk => clk, sclk => sclk); koniec Behawioralny;

Krok 4: Ustalenie ograniczeń i montaż

Ograniczenia

Aby poprawnie skonfigurować i zaprogramować płytę Basys 3, musimy najpierw skonfigurować nasz plik z ograniczeniami, który jest dołączony do tego kroku. Zmieniono następujące ustawienia:

guziki

  • Zmieniono T18 na „up_enable” (zwiększenie jasności)
  • Zmieniono U17 na „down_enable” (zmniejszenie jasności)

7-segmentowy wyświetlacz

  • W7, W6, U8, V8, U5, V5, U7, V7 reprezentują każdy segment jednego wyświetlacza
  • U2, U4, V4, W4 reprezentują każdą wyświetlaną anodę (tylko 2 są aktywne, ponieważ nasza najwyższa liczba to 15)

PMOD nagłówek JC

JC7 to miejsce, w którym podłączamy jeden z przewodów żarówki LED, a drugi przewód prowadzi do MASY

Po skonfigurowaniu tego wszystkiego, wszystko, co musisz zrobić, to wygenerować strumień bitów (z dowolnym oprogramowaniem, którego używasz, np. Vivado), zaprogramować swoją płytę i bum! Masz deskę do pracy.

Uwaga: mapowanie pinów można znaleźć w arkuszu danych Basys 3 tutaj.

montaż

Krok 5: Korzystanie ze ściemniacza

Jeśli wszystko pójdzie dobrze, powinieneś mieć w pełni działający system ściemniacza. Podsumowując, naciśnięcie górnego przycisku zwiększy jasność (aż do 15), a naciśnięcie przycisku w dół zmniejszy jasność (aż do 0). Mam nadzieję, że wszystko pójdzie dobrze dla twojego teraz zrelaksowanego wzroku!

Zalecana: