Innehållsförteckning:

Dimbar LED med Basys 3 Board: 5 steg
Dimbar LED med Basys 3 Board: 5 steg

Video: Dimbar LED med Basys 3 Board: 5 steg

Video: Dimbar LED med Basys 3 Board: 5 steg
Video: Контрольная лампа переменного тока с диммером Arduino AC 2024, Juli
Anonim
Dimbar LED med Basys 3 Board
Dimbar LED med Basys 3 Board

I den här guiden ska vi bygga och styra ett externt LED -dimningssystem. Med de tillgängliga knapparna kan användaren dimma LED -lampan till önskad ljusstyrka. Systemet använder Basys 3 -kortet och det är anslutet till en brödbräda som innehåller ett motstånd och LED -lampan. Genom att trycka på den angivna "upp" -knappen ökar ljusstyrkan, och genom att trycka på "ned" -knappen sänks ljusstyrkan hela vägen till noll. Detta förhindrar inte bara att användaren blir förblindad av ljus-som-solen-glödlampor utan det sparar också energi!

Steg 1: Skapa inmatningsräknare

För detta steg skapar vi komponenten som bestämmer ljusstyrkan (genom en klocka) med hjälp av två omkopplare: en för att öka och en för att minska. Med hjälp av VHDL producerade vi räknaren genom att använda D-flip-flops. Genom att trycka på "upp" -knappen flyttas nästa tillstånd till det nuvarande läget, vilket går ut till displayen med sju segment och LED -lampan.

enhet updown_counter är

Port (present_stat: ut STD_LOGIC_VECTOR (3 ner till 0); föregående_stat: i STD_LOGIC_VECTOR (3 ner till 0); nästa_stat: i STD_LOGIC_VECTOR (3 ner till 0); clk: i STD_LOGIC; ned_aktiverad: i STD_LOGIC; upp_aktiverad: i STD_LOGIC) avsluta updown_counter; arkitektur Beteende för updown_counter börjar flop: process (next_state, clk, up_enable, down_enable, previous_state) börjar om (rising_edge (clk)) sedan om (up_enable = '1' och inte (next_state = "0000")) sedan present_state <= nästa_stat; elsif (down_enable = '1' och inte (previous_state = "1111")) sedan present_state <= previous_state; sluta om; sluta om; avsluta processfloppen; slut Beteende;

Vi behöver också en klocka för att varje ingång ska låsas fast (när den stiger), så vi skapade också en klockavdelare som avgör hur snabbt knapparna kan tryckas mellan varje ljusstyrka. Denna klockavdelare tillåter oss att korrekt visa rätt nivå på sjusegmentsdisplayen och producera rätt intensitetsnivå för varje nivå.

entitet counter_clkDiv är

Port (clk: in std_logic; sclk: out std_logic); avsluta counter_clkDiv; arkitektur my_clk_div av counter_clkDiv är konstant max_count: heltal: = (10000000); signal tmp_clk: std_logic: = '0'; börja my_div: process (clk, tmp_clk) variabel div_cnt: heltal: = 0; börja om (stigande_kant (clk)) sedan om (div_cnt> = MAX_COUNT) sedan tmp_clk <= inte tmp_clk; div_cnt: = 0; annars div_cnt: = div_cnt + 1; sluta om; sluta om; sclk <= tmp_clk; avsluta processen my_div; avsluta my_clk_div;

Steg 2: Skapa LED Clock Divider

För detta steg skapar vi en klockavdelare för LED -lampan för att bestämma 16 olika intensitetsnivåer. Eftersom 0 är avstängd till 15 som visar maximal ljusstyrka, ökar klockavdelaren varje knapptryckning med vad vi ställde in för att vara ljusstyrkan. Varje ökande nivå innebar en ökning av klockan för LED -lampan. Kom ihåg att ljusstyrkan inte ökar linjärt, vi slog klockan till det högsta den kunde gå och minskade våra klockor i enlighet därmed.

Obs: vi använder en blå lysdiod. Att använda en annan färg (som röd) kräver helt olika klockor; en medelljusstyrka för blå kan redan vara maximal ljusstyrka för rött. Detta händer eftersom olika våglängder av ljus kommer att kräva olika mängder energi, medan de kallare färgerna som lila och blå kräver mer energi, medan de varmare färgerna som rött och orange kräver mindre energi.

enhet led_clkDiv är Port (present_state: i STD_LOGIC_VECTOR (3 ner till 0); clk: i STD_LOGIC; led_clk: ut STD_LOGIC); avsluta led_clkDiv; arkitektur Beteende för led_clkDiv är signal tmp_clk: std_logic: = '0'; delad variabel max_count: heltal; börja count_stuff: process (present_state) begin case present_state är när "0000" => max_count: = 0; när "0001" => max_count: = 2; när "0010" => max_count: = 4; när "0011" => max_count: = 6; när "0100" => max_count: = 8; när "0101" => max_count: = 10; när "0110" => max_count: = 12; när "0111" => max_count: = 14; när "1000" => max_count: = 16; när "1001" => max_count: = 25; när "1010" => max_count: = 50; när "1011" => max_count: = 100; när "1100" => max_count: = 150; när "1101" => max_count: = 200; när "1110" => max_count: = 250; när "1111" => max_count: = 300; slutfall; avsluta process count_stuff; my_div: process (clk, tmp_clk, present_state) variabel div_cnt: heltal: = 0; börja om (stigande_kant (clk)) sedan om (div_cnt> = max_count) sedan tmp_clk <= inte tmp_clk; div_cnt: = 0; annars div_cnt: = div_cnt + 1; sluta om; sluta om; led_clk <= tmp_clk; avsluta processen my_div; slut Beteende;

Steg 3: Skapa LED -styrenheten

Nu när vi har kommit så här långt är det dags att äntligen kombinera alla komponenter vi har skapat hittills i LED Controller -filen.

För att sammanfatta är komponenterna som används följande:

  • Ingångsräknare (updown_counter)
  • Klockavdelare (counter_clkDiv)
  • LED klockavdelare (led_clkDiv)
  • Sju-segment displaydrivrutin (sseg_dec) (bifogad fil)

Sju-segment display-drivrutinen diskuterades faktiskt inte tidigare eftersom vi faktiskt lånade VHDL-filen från Dr Bryan Mealy på grund av dess långa och komplicerade kod. Vad den i huvudsak gör är att driva våra knappar till sju-segmentskärmen på Basys 3-kortet så att vi vet vilken ljusstyrka.

Framåt använder LED -styrenheten flip -flops för att öka eller minska antalet som styr både sju segmentdisplayen och ljusstyrkan för LED -lampan samtidigt.

entitetsräknare är Port (clk: i STD_LOGIC; up_enable: i STD_LOGIC; down_enable: i STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 ned till 0); DISP_EN: ut STD_LOGIC_VECTOR (3 ner till 0); led_clk: ut STD_LOGIC); sluträknare; arkitektur Beteende för räknare är komponent updown_counter är Port (present_stat: ut STD_LOGIC_VECTOR (3 ner till 0); föregående_stat: i STD_LOGIC_VECTOR (3 ner till 0); nästa_stat: i STD_LOGIC_VECTOR (3 ner till 0); clk: i STD_LOGIC; ned_aktiverad: up_enable: i STD_LOGIC); slutet komponent updown_counter; komponent counter_clkDiv är Port (clk: in std_logic; sclk: out std_logic); slutkomponent counter_clkDiv; komponent sseg_dec är Port (ALU_VAL: i std_logic_vector (7 ned till 0); SIGN: i std_logic; GILD: i std_logic; CLK: i std_logic; DISP_EN: ut std_logic_vector (3 nedåt 0); SEGMENTS: ut std_logic_; slutkomponent sseg_dec; komponent led_clkDiv är Port (present_stat: i STD_LOGIC_VECTOR (3 ner till 0); clk: i STD_LOGIC; led_clk: ut STD_LOGIC); slutkomponent led_clkDiv; signal present_state: STD_LOGIC_VECTOR (3 ner till 0): = "0000"; signal nästa_stat: STD_LOGIC_VECTOR (3 ner till 0): = "0000"; signal föregående_stat: STD_LOGIC_VECTOR (3 ner till 0): = "0000"; signal Alu_Val: STD_LOGIC_VECTOR (7 ner till 0); signal sclk: STD_LOGIC; börja Alu_Val (7 ned till 4) <= "0000"; Alu_Val (3 ned till 0) <= present_state; next_state (0) <= not (present_state (0)); next_state (1) <= present_state (0) xor present_state (1); nästa_stat (2) <= (present_state (0) och present_state (1)) xeller present_state (2); next_state (3) <= (present_state (0) och present_state (1) och present_state (2)) eller present_state (3); previous_state (0) <= not (present_state (0)); föregående_stat (1) <= present_state (0) xnor present_state (1); föregående_stat (2) <= (present_state (0) eller present_state (1)) eller present_state (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); display: sseg_dec port map (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_div: led_clkDiv -portkarta (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv portkarta (clk => clk, sclk => sclk); slut Beteende;

Steg 4: Fastställande av begränsningar och montering

Begränsningar

För att korrekt konfigurera och programmera Basys 3 -kortet måste vi först konfigurera vår begränsningsfil som är bifogad detta steg. Följande inställningar har justerats:

Knappar

  • Ändrade T18 till "up_enable" (öka ljusstyrkan)
  • Ändrade U17 till "down_enable" (minska ljusstyrkan)

7 segment display

  • W7, W6, U8, V8, U5, V5, U7, V7 representerar varje segment i en display
  • U2, U4, V4, W4 representerar varje anod som visas (endast 2 är aktiva eftersom vårt högsta tal är 15)

PMOD Header JC

JC7 är där vi ansluter en av ledningarna till LED -lampan, och den andra ledningen leder till JORD

Efter att du har ställt in allt detta är det bara att generera din bitström (med vilken programvara du än använder, dvs Vivado), programmera din bräda och boom! Du fick dig en arbetsstyrelse.

Obs! Stiftmappningen finns i Basys 3 -databladet här.

hopsättning

Steg 5: Använda din Dimmer Switch

Om allt går bra bör du ha ett fullt fungerande dimmersystem. För att sammanfatta, ökar din ljusstyrka genom att trycka på den övre knappen (hela vägen till 15), och genom att trycka på nedåtknappen kommer du att minska din ljusstyrka (ända till 0). Hoppas allt går bra för din nu avslappnade syn!

Rekommenderad: