Inhoudsopgave:

Dimbare LED met Basys 3 Board - Ajarnpa
Dimbare LED met Basys 3 Board - Ajarnpa

Video: Dimbare LED met Basys 3 Board - Ajarnpa

Video: Dimbare LED met Basys 3 Board - Ajarnpa
Video: Контрольная лампа переменного тока с диммером Arduino AC 2024, Juli-
Anonim
Dimbare LED met behulp van Basys 3 Board
Dimbare LED met behulp van Basys 3 Board

In deze handleiding gaan we een extern LED-dimsysteem bouwen en aansturen. Met de beschikbare knoppen kan de gebruiker de LED-lamp dimmen tot elke gewenste helderheid. Het systeem maakt gebruik van het Basys 3-bord en is verbonden met een breadboard dat een weerstand en de LED-lamp bevat. Door op de aangewezen "omhoog"-knop te drukken, wordt de helderheid verhoogd en door op de "omlaag"-knop te drukken, wordt de helderheid helemaal naar nul verlaagd. Dit voorkomt niet alleen dat de gebruiker verblind wordt door felle gloeilampen, maar het bespaart ook energie!

Stap 1: Invoerteller maken

Voor deze stap maken we het onderdeel dat het helderheidsniveau bepaalt (via een klok) door twee schakelaars te gebruiken: één om te verhogen en één om te verlagen. Met behulp van VHDL hebben we de teller geproduceerd door het gebruik van D-flip-flops. Door op de "omhoog"-knop te drukken, wordt de volgende status naar de huidige status geduwd, waarbij het display met zeven segmenten en de LED-lamp wordt weergegeven.

entiteit updown_counter is

Port (present_state: out STD_LOGIC_VECTOR (3 tot 0); previous_state: in STD_LOGIC_VECTOR (3 downto 0); next_state: in STD_LOGIC_VECTOR (3 omlaag tot 0); clk: in STD_LOGIC; down_enable: in STD_LOGIC; up_enable: in STD_enable: in STD_enable: einde updown_counter; architectuur Gedrag van updown_counter is begin flop: process(next_state, clk, up_enable, down_enable, previous_state) begin if (rising_edge(clk)) then if (up_enable = '1' and not(next_state="0000")) then present_state <= volgende_staat; elsif (down_enable = '1' en niet(previous_state= "1111")) dan present_state <= previous_state; stop als; stop als; eindproces flop; einde Gedrags;

We hebben ook een klok nodig voor elke ingang waarop moet worden vergrendeld (wanneer deze stijgt), dus hebben we ook een klokverdeler gemaakt die bepaalt hoe snel de knoppen kunnen worden ingedrukt tussen elk helderheidsniveau. Deze klokverdeler stelt ons in staat om het juiste niveau op het zevensegmentendisplay goed weer te geven en voor elk niveau het juiste intensiteitsniveau te produceren.

entiteit counter_clkDiv is

Poort (clk: in std_logic; sclk: uit std_logic); einde counter_clkDiv; architectuur my_clk_div van counter_clkDiv is constant max_count: integer:= (10000000); signaal tmp_clk: std_logic:= '0'; begin my_div: proces (clk, tmp_clk) variabele div_cnt: geheel getal:= 0; begin if (rising_edge(clk)) then if (div_cnt >= MAX_COUNT) then tmp_clk <= not tmp_clk; div_cnt:= 0; anders div_cnt:= div_cnt + 1; stop als; stop als; sclk <= tmp_clk; eindproces my_div; beëindig mijn_clk_div;

Stap 2: Maak een LED-klokverdeler

Voor deze stap maken we een klokverdeler voor de LED-lamp om 16 verschillende intensiteitsniveaus te bepalen. Met 0 uit tot 15 met maximale helderheid, verhoogt de klokverdeler elke druk op de knop met wat we hebben ingesteld als de helderheidsniveaus. Elk hoger niveau betekende een toename van de klok voor de LED-lamp. Onthoud dat de helderheid niet lineair toeneemt, we hebben de klok zo hoog mogelijk gezet en onze klokken dienovereenkomstig verlaagd.

Let op: we gebruiken een blauwe LED. Het gebruik van een andere kleur (zoals rood) vereist iets andere klokken; een gemiddelde helderheidsinstelling voor blauw zou al de maximale helderheid voor rood kunnen zijn. Dit gebeurt omdat verschillende golflengten van licht verschillende hoeveelheden energie vereisen, waarbij de koelere kleuren zoals paars en blauw meer energie nodig hebben, terwijl de warmere kleuren zoals rood en oranje minder energie nodig hebben.

entiteit led_clkDiv is Port (present_state: in STD_LOGIC_VECTOR (3 tot 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); einde led_clkDiv; architectuur Gedrag van led_clkDiv is signaal tmp_clk: std_logic:= '0'; gedeelde variabele max_count: integer;begin count_stuff: proces (present_state) begin case present_state is wanneer "0000" => max_count:= 0; wanneer "0001" => max_count:= 2; wanneer "0010" => max_count:= 4; wanneer "0011" => max_count:= 6; wanneer "0100" => max_count:= 8; wanneer "0101" => max_count:= 10; wanneer "0110" => max_count:= 12; wanneer "0111" => max_count:= 14; wanneer "1000" => max_count:= 16; wanneer "1001" => max_count:= 25; wanneer "1010" => max_count:= 50; wanneer "1011" => max_count:= 100; wanneer "1100" => max_count:= 150; wanneer "1101" => max_count:= 200; wanneer "1110" => max_count:= 250; wanneer "1111" => max_count:= 300; eindgeval; eindproces count_stuff; my_div: proces (clk, tmp_clk, present_state) variabele div_cnt: geheel getal:= 0; begin if (rising_edge(clk)) then if (div_cnt >= max_count) then tmp_clk <= not tmp_clk; div_cnt:= 0; anders div_cnt:= div_cnt + 1; stop als; stop als; led_clk <= tmp_clk; eindproces my_div; einde Gedrags;

Stap 3: De LED-controller maken

Nu we zo ver zijn gekomen, is het tijd om eindelijk alle componenten die we tot nu toe hebben gemaakt te combineren in het LED Controller-bestand.

Samengevat zijn de gebruikte componenten de volgende:

  • Invoerteller (updown_counter)
  • Klokverdeler (counter_clkDiv)
  • LED klokverdeler (led_clkDiv)
  • Zeven-segment display driver (sseg_dec) (bijgevoegd bestand)

De zeven-segment display driver is eigenlijk niet eerder besproken omdat we het VHDL-bestand eigenlijk van Dr. Bryan Mealy hebben geleend vanwege de lange en gecompliceerde code. Wat het in wezen doet, is onze knopinvoer naar het zevensegmentendisplay op het Basys 3-bord sturen, zodat we weten op welk helderheidsniveau.

In de toekomst gebruikt de LED-controller flip-flops om de telling te verhogen of te verlagen, die zowel het zevensegmentendisplay als het helderheidsniveau van de LED-lamp tegelijkertijd bestuurt.

entiteitsteller is Port (clk: in STD_LOGIC; up_enable: in STD_LOGIC; down_enable: in STD_LOGIC; SEGMENTS: uit STD_LOGIC_VECTOR (7 omlaag naar 0); DISP_EN: uit STD_LOGIC_VECTOR (3 omlaag naar 0); led_clk: uit STD_LOGIC eindteller; architectuur Gedrag van teller is component updown_counter is 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_enableLOGIC: in STD_enable: in STD_enable up_enable: in STD_LOGIC); eindcomponent updown_counter; component counter_clkDiv is Port (clk: in std_logic; sclk: uit std_logic); eindcomponent counter_clkDiv; component sseg_dec is Port (ALU_VAL: in std_logic_vector (7 tot 0); SIGN: in std_logic; VALID: in std_logic; CLK: in std_logic; DISP_EN: out std_logic_vector (3 tot 0); SEGMENTEN: out std_logic 0_vector) (7; eindcomponent sseg_dec; component led_clkDiv is Port (present_state: in STD_LOGIC_VECTOR (3 tot 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); eindcomponent led_clkDiv; signaal present_state: STD_LOGIC_VECTOR (3 tot 0):= "0000"; signaal next_state: STD_LOGIC_VECTOR (3 tot 0):= "0000"; signaal vorige_status: STD_LOGIC_VECTOR (3 tot 0):= "0000"; signaal Alu_Val: STD_LOGIC_VECTOR (7 tot 0); signaal sclk: STD_LOGIC; begin Alu_Val(7 tot 4) <= "0000"; Alu_Val (3 tot 0) <= present_state; next_state(0) <= niet(present_state(0)); next_state(1) <= present_state(0) xor present_state(1); next_state(2) <= (present_state(0) en present_state(1)) xor present_state(2); next_state(3) <= (present_state(0) en present_state(1) en present_state(2)) xor present_state(3); vorige_staat(0) <= niet(huidige_staat(0)); previous_state(1) <= present_state(0) xnor present_state(1); previous_state(2) <= (present_state(0) noch present_state(1)) xor 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 poortkaart (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTEN); led_div: led_clkDiv poortkaart (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv poortkaart (clk => clk, sclk => sclk); einde Gedrags;

Stap 4: Beperkingen en montage vaststellen

Beperkingen

Om het Basys 3-bord correct in te stellen en te programmeren, moeten we eerst ons bestand met beperkingen instellen dat bij deze stap is gevoegd. De volgende instellingen zijn aangepast:

Toetsen

  • T18 gewijzigd in "up_enable" (helderheid verhogen)
  • U17 gewijzigd in "down_enable" (helderheid verlagen)

7-segments display

  • W7, W6, U8, V8, U5, V5, U7, V7 vertegenwoordigen elk segment van één display
  • U2, U4, V4, W4 vertegenwoordigen elke weergegeven anode (slechts 2 zijn actief omdat ons hoogste aantal 15 is)

PMOD Header JC

JC7 is waar we een van de draden van de LED-lamp aansluiten en de andere draad naar GROND

Nadat je dit allemaal hebt ingesteld, hoef je alleen maar je bitstream te genereren (met welke software je ook gebruikt, bijvoorbeeld Vivado), je bord te programmeren en boem! Je hebt een werkbord.

Opmerking: de pintoewijzing is hier te vinden op de Basys 3 Datasheet.

samenkomst

Stap 5: Uw dimmerschakelaar gebruiken

Als alles goed gaat, zou je een volledig functionerend dimmersysteem moeten hebben. Om samen te vatten, als u op de bovenste knop drukt, wordt uw helderheid verhoogd (helemaal tot 15), en als u op de omlaag-knop drukt, wordt uw helderheid verlaagd (helemaal tot 0). Ik hoop dat alles goed gaat voor je nu ontspannen gezichtsvermogen!

Aanbevolen: