Talaan ng mga Nilalaman:

Dimmable LED Gamit ang Basys 3 Board: 5 Hakbang
Dimmable LED Gamit ang Basys 3 Board: 5 Hakbang

Video: Dimmable LED Gamit ang Basys 3 Board: 5 Hakbang

Video: Dimmable LED Gamit ang Basys 3 Board: 5 Hakbang
Video: RobotDyn Control AC bulb with Arduino AC Dimmer 2024, Nobyembre
Anonim
Dimmable LED Gamit ang Basys 3 Board
Dimmable LED Gamit ang Basys 3 Board

Sa gabay na ito magtatayo at makokontrol namin ang isang panlabas na LED dimming system. Gamit ang mga magagamit na pindutan, maaaring madilim ng gumagamit ang LED bombilya sa anumang nais na ningning. Gumagamit ang system ng board na Basys 3, at ito ay konektado sa isang breadboard na naglalaman ng isang risistor at ang LED bombilya. Ang pagpindot sa itinalagang "pataas" na pindutan ay magpapataas ng ningning, at ang pagpindot sa "pababa" na pindutan ay magbabawas ng liwanag hanggang sa zero. Hindi lamang pinipigilan nito ang gumagamit na mabulag ng mga maliwanag na bombilya ngunit pinapanatili din nito ang enerhiya!

Hakbang 1: Lumikha ng Input Counter

Para sa hakbang na ito nilikha namin ang bahagi na tumutukoy sa antas ng ningning (sa pamamagitan ng isang orasan) sa pamamagitan ng paggamit ng dalawang switch: isa upang madagdagan at isa upang bawasan. Gamit ang VHDL, gumawa kami ng counter sa pamamagitan ng paggamit ng D flip-flops. Ang pagpindot sa pindutan na "pataas" ay itinutulak ang susunod na estado sa kasalukuyang estado, na lumalabas sa pitong segment na display at ang LED bombilya.

entity updown_counter ay

Port (present_state: out STD_LOGIC_VECTOR (3 downto 0); nakaraang_state: sa STD_LOGIC_VECTOR (3 pababa 0); susunod_state: sa STD_LOGIC_VECTOR (3 pababa sa 0); clk: sa STD_LOGIC; down_enable: sa STD_LOGIC; up_enIC); tapusin ang updown_counter; arkitektura Pag-uugali ng updown_counter ay nagsisimula flop: proseso (next_state, clk, up_enable, down_enable, nakaraang_state) magsimula kung (tumataas_edge (clk)) pagkatapos kung (up_enable = '1' at hindi (next_state = "0000")) pagkatapos present_state <= susunod_state; elsif (down_enable = '1' at hindi (nakaraang_state = "1111")) pagkatapos ay present_state <= nakaraang_state; tapusin kung; tapusin kung; tapusin ang proseso ng pag-flop; wakasan ang Pag-uugali;

Kailangan din namin ng isang orasan para sa bawat pag-input ay mai-latched (kapag tumaas ito), kaya lumikha din kami ng isang divider ng orasan na tumutukoy kung gaano kabilis ang pagpindot sa mga pindutan sa pagitan ng bawat antas ng ningning. Pinapayagan kaming magbahagi ng orasan na ito upang maipakita nang maayos ang tamang antas sa pitong segment na display at makagawa ng tamang antas ng intensidad para sa bawat antas.

entity counter_clkDiv ay

Port (clk: sa std_logic; sclk: out std_logic); tapusin ang counter_clkDiv; arkitektura my_clk_div ng counter_clkDiv ay pare-pareho ang max_count: integer: = (10000000); signal tmp_clk: std_logic: = '0'; simulan ang my_div: proseso (clk, tmp_clk) variable div_cnt: integer: = 0; simulan kung (tumataas_edge (clk)) pagkatapos kung (div_cnt> = MAX_COUNT) pagkatapos tmp_clk <= hindi tmp_clk; div_cnt: = 0; iba pa div_cnt: = div_cnt + 1; tapusin kung; tapusin kung; sclk <= tmp_clk; tapusin ang proseso my_div; tapusin ang aking_clk_div;

Hakbang 2: Lumikha ng LED Clock Divider

Para sa hakbang na ito lumikha kami ng isang oras na divider para sa LED bombilya upang matukoy ang 16 magkakaibang antas ng kasidhian. Sa 0 na hanggang sa 15 na nagpapakita ng maximum na ningning, ang paghati ng orasan ay nagdaragdag ng bawat pindutin ang pagpindot sa pamamagitan ng kung ano ang itinakda namin upang maging mga antas ng ningning. Ang bawat antas ng pagtaas ay nangangahulugang isang pagtaas ng orasan para sa LED bombilya. Naalala na ang ningning ay hindi tataas nang tuwid, nilagyan namin ang orasan sa pinakamataas na maaari nitong puntahan at nabawasan ang aming mga orasan nang naaayon.

Tandaan: gumagamit kami ng isang asul na LED. Ang paggamit ng ibang kulay (tulad ng pula) ay mangangailangan ng bahagyang iba't ibang mga orasan nang sama-sama; ang isang setting ng medium na ilaw para sa asul ay maaaring maging pinakamataas na ilaw para sa pula. Nangyayari ito dahil ang iba't ibang mga haba ng daluyong ng ilaw ay mangangailangan ng magkakaibang dami ng enerhiya, na may mga malamig na kulay tulad ng lila at asul na nangangailangan ng mas maraming enerhiya, habang ang mga mas maiinit na kulay tulad ng pula at kahel ay nangangailangan ng mas kaunting enerhiya.

entity led_clkDiv ay Port (present_state: sa STD_LOGIC_VECTOR (3 hanggang 0); clk: sa STD_LOGIC; led_clk: out STD_LOGIC); tapusin led_clkDiv; arkitektura Pag-uugali ng led_clkDiv ay signal tmp_clk: std_logic: = '0'; ibinahaging variable max_count: integer; simulan ang count_stuff: proseso (present_state) simulan ang case present_state ay kapag "0000" => max_count: = 0; kapag "0001" => max_count: = 2; kailan "0010" => max_count: = 4; kailan "0011" => max_count: = 6; kapag "0100" => max_count: = 8; kailan "0101" => max_count: = 10; kapag "0110" => max_count: = 12; kailan "0111" => max_count: = 14; kapag "1000" => max_count: = 16; kailan "1001" => max_count: = 25; kailan "1010" => max_count: = 50; kailan "1011" => max_count: = 100; kailan "1100" => max_count: = 150; kapag "1101" => max_count: = 200; kailan "1110" => max_count: = 250; kailan "1111" => max_count: = 300; kaso ng pagtatapos; tapusin ang bilang ng proseso_stuff; my_div: proseso (clk, tmp_clk, present_state) variable div_cnt: integer: = 0; simulan kung (tumataas_edge (clk)) pagkatapos kung (div_cnt> = max_count) pagkatapos tmp_clk <= hindi tmp_clk; div_cnt: = 0; iba pa div_cnt: = div_cnt + 1; tapusin kung; tapusin kung; led_clk <= tmp_clk; tapusin ang proseso my_div; wakasan ang Pag-uugali;

Hakbang 3: Lumilikha ng LED Controller

Ngayon na nagawa natin ito sa ngayon, oras na upang pagsamahin sa wakas ang lahat ng mga sangkap na nilikha namin sa ngayon sa file na LED Controller.

Upang ibuod, ang mga sangkap na ginamit ay ang mga sumusunod:

  • Input counter (updown_counter)
  • Cider divider (counter_clkDiv)
  • LED clock divider (led_clkDiv)
  • Seven-segment display driver (sseg_dec) (kalakip na file)

Ang pitong-segment na driver ng display ay hindi talaga napag-usapan dati sapagkat hiniram talaga namin ang file na VHDL mula kay Dr. Bryan Mealy dahil sa mahaba at kumplikadong code nito. Ang mahalagang ginagawa nito ay himukin ang aming mga pag-input ng pindutan sa pitong-segment na pagpapakita sa board ng Basys 3 upang malaman namin kung anong antas ng ningning.

Sumusulong, ang LED Controller ay gumagamit ng mga flip flop upang madagdagan o mabawasan ang bilang na kumokontrol sa parehong pitong segment na pagpapakita at sa antas ng ningning ng LED bombilya nang sabay-sabay.

ang entity counter ay Port (clk: sa STD_LOGIC; up_enable: sa STD_LOGIC; down_enable: sa STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 hanggang 0); DISP_EN: out STD_LOGIC_VECTOR (3 pababa sa 0); led_clk: out STD_LOGIC); pagtatapos ng counter; arkitektura Ang pag-uugali ng counter ay bahagi ng updown_counter ay Port (present_state: labas ng STD_LOGIC_VECTOR (3 pababa 0); nakaraang_state: sa STD_LOGIC_VECTOR (3 pababa sa 0); next_state: sa STD_LOGIC_VECTOR (3 pababa sa 0); clk: sa STD_LOGIC; down_enIC; up_enable: sa STD_LOGIC); tapusin ang bahagi ng pag-update ng_counter; ang bahagi ng counter_clkDiv ay Port (clk: sa std_logic; sclk: out std_logic); tapusin ang bahagi ng counter_clkDiv; sangkap sseg_dec ay Port (ALU_VAL: sa std_logic_vector (7 pababa 0); SIGN: sa std_logic; VALID: sa std_logic; CLK: sa std_logic; DISP_EN: out std_logic_vector (3 pababa 0); SEGMENTS: outcd_logic_; tapusin ang bahagi sseg_dec; Ang sangkap na led_clkDiv ay Port (present_state: sa STD_LOGIC_VECTOR (3 hanggang 0); clk: sa STD_LOGIC; led_clk: out STD_LOGIC); tapusin ang bahagi led_clkDiv; signal present_state: STD_LOGIC_VECTOR (3 pababa sa 0): = "0000"; signal next_state: STD_LOGIC_VECTOR (3 pababa sa 0): = "0000"; signal nakaraang_state: STD_LOGIC_VECTOR (3 pababa sa 0): = "0000"; signal Alu_Val: STD_LOGIC_VECTOR (7 pababa sa 0); signal sclk: STD_LOGIC; simulan ang Alu_Val (7 hanggang 4) <= "0000"; Alu_Val (3 pababa 0) <= kasalukuyan_state; next_state (0) <= not (present_state (0)); next_state (1) <= present_state (0) xor present_state (1); next_state (2) <= (present_state (0) at present_state (1)) xor present_state (2); next_state (3) <= (present_state (0) at present_state (1) at present_state (2)) xor present_state (3); nakaraang_state (0) <= hindi (present_state (0)); nakaraang_state (1) <= present_state (0) xnor present_state (1); nakaraang_state (2) <= (present_state (0) o present_state (1)) xor present_state (2); nakaraang_state (3) sclk, next_state => susunod_state, nakaraang_state => nakaraang_state, up_enable => up_enable, down_enable => down_enable, present_state => present_state); ipakita: sseg_dec port map (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS>> SEGMENTS); led_div: led_clkDiv port map (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv port map (clk => clk, sclk => sclk); wakasan ang Pag-uugali;

Hakbang 4: Ang pagtaguyod ng mga hadlang at pagpupulong

Mga hadlang

Upang maayos na mai-setup at mai-program ang board ng Basys 3, dapat muna naming i-setup ang aming mga hadlang na file na naka-attach sa hakbang na ito. Ang mga sumusunod na setting ay nabago:

Mga Pindutan

  • Pinalitan ang T18 sa "up_enable" (taasan ang ningning)
  • Pinalitan ang U17 sa "down_enable" (bawasan ang ningning)

7 segment na pagpapakita

  • Ang W7, W6, U8, V8, U5, V5, U7, V7 ay kumakatawan sa bawat segment ng isang display
  • Ang U2, U4, V4, W4 ay kumakatawan sa bawat anode na ipinakita (2 lamang ang aktibo dahil ang pinakamataas na bilang namin ay 15)

PMOD Header JC

Ang JC7 ay kung saan ikinonekta namin ang isa sa mga wires ng LED bombilya, at ang iba pang kawad ay humahantong sa GROUND

Matapos i-set up ang lahat ng ito, ang kailangan mo lang gawin ay makabuo ng iyong bitstream (sa anumang software na ginagamit mo ie Vivado), i-program ang iyong board, at boom! Nakuha mo ang iyong sarili isang nagtatrabaho board.

Tandaan: Ang pagmamapa ng pin ay matatagpuan sa Basys 3 Datasheet dito.

Assembly

Hakbang 5: Paggamit ng Iyong Dimmer Switch

Kung maayos ang lahat, dapat ay mayroon kang isang ganap na gumagana na dimmer system. Upang buod, ang pagpindot sa tuktok na pindutan ay magpapataas ng iyong ningning (hanggang sa 15), at ang pagpindot sa down na pindutan ay magbabawas ng iyong ilaw (hanggang sa 0). Inaasahan kong maayos ang lahat para sa iyong nakakarelaks na paningin ngayon!

Inirerekumendang: