Innholdsfortegnelse:

Dimmbar LED ved hjelp av Basys 3 Board: 5 trinn
Dimmbar LED ved hjelp av Basys 3 Board: 5 trinn

Video: Dimmbar LED ved hjelp av Basys 3 Board: 5 trinn

Video: Dimmbar LED ved hjelp av Basys 3 Board: 5 trinn
Video: Контрольная лампа переменного тока с диммером Arduino AC 2024, November
Anonim
Dimmbar LED ved hjelp av Basys 3 Board
Dimmbar LED ved hjelp av Basys 3 Board

I denne guiden skal vi bygge og kontrollere et eksternt LED -dimmesystem. Med de tilgjengelige knappene kan brukeren dimme LED -pæren til ønsket lysstyrke. Systemet bruker Basys 3 -kortet, og det er koblet til et brødbrett som inneholder en motstand og LED -pæren. Trykk på den angitte "opp" -knappen for å øke lysstyrken, og trykke på "ned" -knappen vil redusere lysstyrken helt til null. Dette forhindrer ikke bare at brukeren blir blindet av lyspærer som er så solrike, men det sparer også energi!

Trinn 1: Lag inndatateller

For dette trinnet lager vi komponenten som bestemmer lysstyrken (gjennom en klokke) ved å bruke to brytere: en for å øke og en for å redusere. Ved å bruke VHDL produserte vi disken gjennom bruk av D-flip-flops. Ved å trykke på "opp" -knappen, flyttes den neste tilstanden til nåværende tilstand og sendes til sju segmenters display og LED -pære.

enhet updown_counter er

Port (present_state: ut STD_LOGIC_VECTOR (3 ned til 0); forrige_stat: i STD_LOGIC_VECTOR (3 ned til 0); neste_stat: i STD_LOGIC_VECTOR (3 ned til 0); clk: i STD_LOGIC; ned_aktivering: i STD_LOGIC; up_enable: i STD_LOGIC; avslutte updown_counter; arkitektur Oppførselsoppførsel for updown_counter begynner flop: prosess (next_state, clk, up_enable, down_enable, previous_state) begynner hvis (rising_edge (clk)) deretter hvis (up_enable = '1' og ikke (next_state = "0000")) deretter present_state <= neste_stat; elsif (down_enable = '1' og ikke (previous_state = "1111")) deretter present_state <= previous_state; slutt om; slutt om; slutt prosessen flopp; slutt Behavioral;

Vi trenger også en klokke for hver inngang som skal låses på (når den stiger), så vi opprettet også en klokkeskille som bestemmer hvor raskt knappene kan trykkes mellom hvert lysstyrkenivå. Denne klokkeskilleren lar oss vise riktig nivå på syv segment display og produsere riktig intensitetsnivå for hvert nivå.

enhet counter_clkDiv er

Port (clk: in std_logic; sclk: out std_logic); avslutte counter_clkDiv; arkitektur my_clk_div av counter_clkDiv er konstant max_count: integer: = (10000000); signal tmp_clk: std_logic: = '0'; start my_div: prosess (clk, tmp_clk) variabel div_cnt: heltall: = 0; start if (rising_edge (clk)) så if (div_cnt> = MAX_COUNT) så tmp_clk <= ikke tmp_clk; div_cnt: = 0; annet div_cnt: = div_cnt + 1; slutt om; slutt om; sclk <= tmp_clk; avslutte prosessen my_div; avslutte my_clk_div;

Trinn 2: Lag LED Clock Divider

For dette trinnet lager vi en klokkeskille for LED -pæren for å bestemme 16 forskjellige intensitetsnivåer. Siden 0 er slått av til 15 som viser maksimal lysstyrke, øker klokkeskilleren hvert knappetrykk med det vi har angitt som lysstyrkenivåer. Hvert økende nivå betydde en økning i klokken for LED -pæren. Når vi husker at lysstyrken ikke øker lineært, svingte vi klokken til det høyeste den kunne gå og reduserte klokkene våre tilsvarende.

Merk: Vi bruker en blå LED. Bruk av en annen farge (som rød) vil kreve litt forskjellige klokker helt; en middels lysstyrkeinnstilling for blå kan allerede være maks lysstyrke for rødt. Dette skjer fordi forskjellige bølgelengder av lys vil kreve forskjellige energimengder, mens de kjøligere fargene som lilla og blå krever mer energi, mens de varmere fargene som rødt og oransje krever mindre energi.

enhet led_clkDiv er Port (present_state: i STD_LOGIC_VECTOR (3 ned til 0); clk: i STD_LOGIC; led_clk: ut STD_LOGIC); avslutte led_clkDiv; arkitektur Behavioral for led_clkDiv er signal tmp_clk: std_logic: = '0'; delt variabel max_count: integer; begin count_stuff: process (present_state) begin case present_state er 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; slutt saken; avslutte prosessen count_stuff; my_div: prosess (clk, tmp_clk, present_state) variabel div_cnt: heltall: = 0; start if (rising_edge (clk)) deretter if (div_cnt> = max_count) deretter tmp_clk <= ikke tmp_clk; div_cnt: = 0; annet div_cnt: = div_cnt + 1; slutt om; slutt om; led_clk <= tmp_clk; avslutte prosessen my_div; slutt Behavioral;

Trinn 3: Opprette LED -kontrolleren

Nå som vi har kommet så langt, er det på tide å endelig kombinere alle komponentene vi har laget så langt i LED Controller -filen.

For å oppsummere, er komponentene som brukes følgende:

  • Inngangsteller (updown_counter)
  • Clock divider (counter_clkDiv)
  • LED klokke divider (led_clkDiv)
  • Syv-segment skjermdriver (sseg_dec) (vedlagt fil)

Den sju-segmenters skjermdriveren ble faktisk ikke diskutert tidligere fordi vi faktisk lånte VHDL-filen fra Dr. Bryan Mealy på grunn av den lange og kompliserte koden. Det den egentlig gjør, er å drive knappinngangene våre til syv-segmentet på Basys 3-kortet, slik at vi vet hvilket lysstyrkenivå.

Fremover bruker LED -kontrolleren flip -flops for å øke eller redusere antallet som styrer både syv segmentvisning og lysstyrkenivået til LED -pæren samtidig.

enhetsteller er Port (clk: in STD_LOGIC; up_enable: in STD_LOGIC; down_enable: in STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 downto 0); DISP_EN: out STD_LOGIC_VECTOR (3 downto 0); led_clk: out STD_LOGIC); slutten teller; arkitektur Tellerens oppførsel er komponent updown_counter er Port (present_state: out STD_LOGIC_VECTOR (3 ned til 0); forrige_stat: i STD_LOGIC_VECTOR (3 ned til 0); next_state: i STD_LOGIC_VECTOR (3 ned til 0); clk: i STD_LOGIC; ned_aktiveret: up_enable: i STD_LOGIC); sluttkomponent updown_counter; komponent counter_clkDiv er Port (clk: in std_logic; sclk: out std_logic); sluttkomponent counter_clkDiv; komponent sseg_dec er Port (ALU_VAL: i std_logic_vector (7 ned til 0); SIGN: i std_logic; Gyldig: i std_logic; CLK: i std_logic; DISP_EN: out std_logic_vector (3 ned til 0); SEGMENTS: ut std_logic_; sluttkomponent sseg_dec; komponent led_clkDiv er Port (present_state: i STD_LOGIC_VECTOR (3 ned til 0); clk: i STD_LOGIC; led_clk: ut STD_LOGIC); sluttkomponent led_clkDiv; signal present_state: STD_LOGIC_VECTOR (3 ned til 0): = "0000"; signal neste_stat: STD_LOGIC_VECTOR (3 ned til 0): = "0000"; signal forrige_stat: STD_LOGIC_VECTOR (3 ned til 0): = "0000"; signal Alu_Val: STD_LOGIC_VECTOR (7 ned til 0); signal sclk: STD_LOGIC; begynne Alu_Val (7 ned til 4) <= "0000"; Alu_Val (3 ned til 0) <= present_state; next_state (0) <= not (present_state (0)); next_state (1) <= present_state (0) xor present_state (1); next_state (2) <= (present_state (0) og present_state (1)) xor present_state (2); next_state (3) <= (present_state (0) og present_state (1) og present_state (2)) eller present_state (3); previous_state (0) <= not (present_state (0)); forrige_stat (1) <= present_state (0) xnor present_state (1); forrige_stat (2) <= (present_state (0) eller present_state (1)) xeller 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 portkart (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv portkart (clk => clk, sclk => sclk); slutt Behavioral;

Trinn 4: Etablering av begrensninger og montering

Begrensninger

For å konfigurere og programmere Basys 3 -kortet riktig, må vi først sette opp begrensningsfilen som er vedlagt dette trinnet. Følgende innstillinger er justert:

Knapper

  • Endret T18 til "up_enable" (øk lysstyrken)
  • Endret U17 til "down_enable" (reduser lysstyrken)

7 segment display

  • W7, W6, U8, V8, U5, V5, U7, V7 representerer hvert segment av en skjerm
  • U2, U4, V4, W4 representerer hver anode som vises (bare 2 er aktive fordi vårt høyeste tall er 15)

PMOD Header JC

JC7 er der vi kobler en av ledningene til LED -pæren, og den andre ledningen fører til JORD

Etter at du har konfigurert alt dette, er alt du trenger å gjøre å generere bitstream (med hvilken som helst programvare du bruker, dvs Vivado), programmere brettet og boom! Du skaffer deg et arbeidsstyre.

Merk: Pin -kartleggingen finner du på Basys 3 -databladet her.

montering

Trinn 5: Bruke dimmerbryteren

Hvis alt går bra, bør du ha et fullt fungerende dimmersystem. For å oppsummere, vil du trykke på den øverste knappen for å øke lysstyrken (helt til 15), og trykke på ned -knappen for å redusere lysstyrken (helt til 0). Håper alt går bra for ditt nå avslappede syn!

Anbefalt: