Բովանդակություն:

Dimmable LED Օգտագործելով Basys 3 տախտակը `5 քայլ
Dimmable LED Օգտագործելով Basys 3 տախտակը `5 քայլ

Video: Dimmable LED Օգտագործելով Basys 3 տախտակը `5 քայլ

Video: Dimmable LED Օգտագործելով Basys 3 տախտակը `5 քայլ
Video: Կառավարեք AC լամպը Arduino AC Dimmer- ով 2024, Հուլիսի
Anonim
Dimmable LED օգտագործելով Basys 3 տախտակը
Dimmable LED օգտագործելով Basys 3 տախտակը

Այս ուղեցույցում մենք պատրաստվում ենք կառուցել և վերահսկել արտաքին LED լուսավորման համակարգ: Առկա կոճակներով օգտվողը կարող է լուսավորել LED լամպը ցանկացած ցանկալի պայծառությամբ: Համակարգը օգտագործում է Basys 3 տախտակը, և այն միացված է տախտակին, որը պարունակում է դիմադրություն և LED լամպ: Նշված «վեր» կոճակը սեղմելը կբարձրացնի պայծառությունը, իսկ «ներքև» կոճակը սեղմելով ՝ պայծառությունը մինչև զրոյի: Սա ոչ միայն թույլ չի տալիս օգտվողին կուրացնել արևի պայծառ լամպերով, այլ նաև խնայում է էներգիան:

Քայլ 1: Ստեղծեք ներածման հաշվիչ

Այս քայլի համար մենք ստեղծում ենք այն բաղադրիչը, որը որոշում է պայծառության մակարդակը (ժամացույցի միջոցով) `օգտագործելով երկու անջատիչ` մեկը բարձրացնելու և մյուսը նվազեցնելու համար: VHDL- ի օգնությամբ մենք հաշվիչը արտադրեցինք D ֆլիպսոփների օգտագործման միջոցով: Սեղմելով «վեր» կոճակը հաջորդ վիճակը մղում է ներկա վիճակի ՝ դուրս գալով յոթ հատվածի էկրանին և LED լամպին:

واحد Updown_counter է

Նավահանգիստ (ներկա_ նահանգը ՝ դուրս STD_LOGIC_VECTOR (3 -ը 0 -ի դիմաց); նախորդ_պետականը ՝ STD_LOGIC_VECTOR- ում (3 -ից 0 -ը), հաջորդը ՝ STD_LOGIC_VECTOR- ում (3 -ից 0 -ը); clk: STD_LOGGGIC- ում; ավարտել updown_counter; architectureարտարապետություն Updown_counter- ի վարքագիծը սկսվում է տապալումից. գործընթացը (հաջորդ_պետություն, clk, up_enable, down_enable, previous_state) սկսվում է, եթե (բարձրանում_ եզր (clk)) ապա եթե (up_enable = '1' և ոչ (next_state = "0000")) ապա present_state <= հաջորդ_պետություն; elsif (down_enable = '1' և ոչ (previous_state = "1111")) ապա present_state <= նախորդ_պետություն; ավարտ, եթե; ավարտ, եթե; ավարտի գործընթացի ձախողում; վերջ Վարքագծային;

Մեզ նաև ժամացույց է պետք յուրաքանչյուր մուտքի համար (երբ այն բարձրանում է), այնպես որ մենք ստեղծեցինք նաև ժամացույցի բաժանարար, որը որոշում է, թե որքան արագ կարող են կոճակները սեղմել պայծառության յուրաքանչյուր մակարդակի միջև: Այս ժամացույցի բաժանարարը մեզ թույլ է տալիս պատշաճ կերպով ցուցադրել յոթ հատվածի ցուցադրման ճիշտ մակարդակը և յուրաքանչյուր մակարդակի համար արտադրել ինտենսիվության ճիշտ մակարդակ:

սուբյեկտ counter_clkDiv է

Պորտ (clk: std_logic; sclk: out std_logic); վերջ counter_clkDiv; counter_clkDiv- ը my_clk_div է counter_clkDiv հաստատուն max_count: integer: = (10000000); ազդանշան tmp_clk: std_logic: = '0'; սկսել my_div: գործընթացը (clk, tmp_clk) փոփոխական div_cnt: integer: = 0; սկսել եթե (բարձրանում_եզր (clk)) ապա եթե (div_cnt> = MAX_COUNT) ապա tmp_clk <= ոչ tmp_clk; div_cnt: = 0; այլապես div_cnt: = div_cnt + 1; ավարտ, եթե; ավարտ, եթե; sclk <= tmp_clk; ավարտել գործընթացը my_div; վերջ my_clk_div;

Քայլ 2: Ստեղծեք LED ժամացույցի բաժանարար

Այս քայլի համար մենք ստեղծում ենք ժամացույցի բաժանարար LED լամպի համար `որոշելու ինտենսիվության 16 տարբեր մակարդակներ: Երբ 0 -ը անջատված է մինչև 15, որը ցույց է տալիս առավելագույն պայծառությունը, ժամացույցի բաժանարարը յուրաքանչյուր կոճակ սեղմելիս ավելացնում է պայծառության մակարդակները: Յուրաքանչյուր աճող մակարդակ նշանակում էր ժամացույցի ավելացում LED լամպի համար: Հիշելով, որ պայծառությունը գծայինորեն չի աճում, մենք ժամացույցը բարձրացրինք ամենաբարձրը, որը կարող էր գնալ և համապատասխանաբար նվազեցրինք մեր ժամացույցները:

Նշում. Մենք օգտագործում ենք կապույտ LED: Այլ գույնի օգտագործումը (ինչպես կարմիրը) ընդհանրապես կպահանջի մի փոքր այլ ժամացույցներ. կապույտի միջին պայծառության պարամետրը կարող է լինել առավելագույնը կարմիրի համար: Դա տեղի է ունենում այն պատճառով, որ լույսի տարբեր ալիքների երկարությունները կպահանջեն տարբեր քանակությամբ էներգիա, իսկ մանուշակագույնի և սառը գույների համար ավելի շատ էներգիա է պահանջվում, իսկ ավելի տաք գույները, ինչպիսիք են կարմիրը և նարնջագույնը, ավելի քիչ էներգիա են պահանջում:

entity led_clkDiv is Port (present_state: in STD_LOGIC_VECTOR (3 down to 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); վերջ led_clkDiv; ճարտարապետություն led_clkDiv- ի վարքագիծը tmp_clk: std_logic: = '0'; ընդհանուր փոփոխական max_count: integer; begin count_stuff: process (present_state) begin case case_state is when "0000" => max_count: = 0; երբ "0001" => max_count: = 2; երբ "0010" => max_count: = 4; երբ "0011" => max_count: = 6; երբ "0100" => max_count: = 8; երբ "0101" => max_count: = 10; երբ "0110" => max_count: = 12; երբ "0111" => max_count: = 14; երբ "1000" => max_count: = 16; երբ "1001" => max_count: = 25; երբ "1010" => max_count: = 50; երբ "1011" => max_count: = 100; երբ "1100" => max_count: = 150; երբ "1101" => max_count: = 200; երբ "1110" => max_count: = 250; երբ "1111" => max_count: = 300; վերջնական գործ; գործընթացի ավարտը count_stuff; my_div: գործընթաց (clk, tmp_clk, present_state) փոփոխական div_cnt: integer: = 0; սկսեք եթե (բարձրանում_եզր (clk)) ապա եթե (div_cnt> = max_count) ապա tmp_clk <= ոչ tmp_clk; div_cnt: = 0; այլապես div_cnt: = div_cnt + 1; ավարտ, եթե; ավարտ, եթե; led_clk <= tmp_clk; ավարտել գործընթացը my_div; վերջ Վարքագծային;

Քայլ 3: Ստեղծեք LED վերահսկիչ

Այժմ, երբ մենք հասել ենք դրան, ժամանակն է վերջապես համատեղել մեր կողմից մինչ այժմ ստեղծված բոլոր բաղադրիչները LED Controller ֆայլի մեջ:

Ամփոփելու համար օգտագործվող բաղադրիչները հետևյալն են.

  • Մուտքի հաշվիչ (updown_counter)
  • Ockամացույցի բաժանարար (counter_clkDiv)
  • LED ժամացույցի բաժանարար (led_clkDiv)
  • Յոթ հատվածի ցուցադրման վարորդ (sseg_dec) (կցված ֆայլ)

Յոթ հատվածից ցուցադրվող վարորդը իրականում նախկինում չի քննարկվել, քանի որ մենք իրականում VHDL ֆայլը վերցրել ենք բժիշկ Բրայան Միլիից `դրա երկար և բարդ ծածկագրի պատճառով: Այն, ինչ ըստ էության, անում է, այն է, որ մեր կոճակների մուտքերը տանում է դեպի Basys 3 տախտակի յոթ հատվածի էկրան, որպեսզի իմանանք, թե պայծառության որ մակարդակի վրա է:

Առաջ շարժվելով ՝ LED վերահսկիչը օգտագործում է մատիտներ `ավելացնելու կամ նվազեցնելու համարը, որը միաժամանակ վերահսկում է ինչպես յոթ հատվածի ցուցադրումը, այնպես էլ LED լամպի պայծառության մակարդակը:

սուբյեկտի հաշվիչը Պորտ է (clk: STD_LOGIC; up_enable: STD_LOGIC; down_enable: STD_LOGIC; SEGMENTS: STD_LOGIC_VECTOR (7 ներքև 0); DISP_EN: դուրս STD_LOGIC_VECTO) 3 դուրս վերջի հաշվիչ; ճարտարապետություն Հաշվիչի վարքագծը բաղադրիչն է Updown_counter- ը Պորտ է (ներկա_կազմ. դուրս up_enable: STD_LOGIC- ում); վերջի բաղադրիչ updown_counter; բաղադրիչ counter_clkDiv is Port (clk: std_logic; sclk: out std_logic); վերջնական բաղադրիչ counter_clkDiv; բաղադրիչ sseg_dec- ն Port է (ALU_VAL: std_logic_vector- ում (7 -ից 0 -ից); ՄԱՍԻՆ `std_logic- ում; Վավեր` std_logic- ում; CLK: std_logic; DISP_EN: std_logic_vector (3 ներքև 0); SEGMENTS); վերջնական բաղադրիչ sseg_dec; բաղադրիչ led_clkDiv is Port (present_state: in STD_LOGIC_VECTOR (3 down to 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); վերջնական բաղադրիչ led_clkDiv; ազդանշան present_state: STD_LOGIC_VECTOR (3 ներքև 0): = "0000"; ազդանշան next_state: STD_LOGIC_VECTOR (3 ներքև 0): = "0000"; ազդանշան previous_state: STD_LOGIC_VECTOR (3 ներքև 0): = "0000"; ազդանշան Alu_Val: STD_LOGIC_VECTOR (7 դեպի 0); ազդանշանային sclk: STD_LOGIC; սկսել Alu_Val (7 -ից ներքև 4) <= "0000"; Ալու_Վալ (3 դեպի ներքև 0) <= ներկա_պետություն; հաջորդ_պետական (0) <= ոչ (ներկա_պետական (0)); հաջորդ_պետական (1) <= ներկա_պետություն (0) կամ ներկա_պետություն (1); next_state (2) <= (present_state (0) և present_state (1)) xor present_state (2); next_state (3) <= (present_state (0) և present_state (1) և present_state (2)) xor present_state (3); նախորդ_պետական (0) <= ոչ (ներկա_պետական (0)); նախորդ_պետական (1) <= ներկա_պետություն (0) xn կամ ներկա_պետություն (1); նախորդ_պետական (2) <= (ներկա_պետական (0) ոչ ներկա_պետական (1)) կամ ներկա_պետական (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); ցուցադրում. sseg_dec նավահանգստի քարտեզ (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_clk: led_clkDiv նավահանգստի քարտեզ (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv նավահանգստի քարտեզ (clk => clk, sclk => sclk); վերջ Վարքագծային;

Քայլ 4. Սահմանափակումների և հավաքների ստեղծում

Սահմանափակումներ

Basys 3 տախտակը ճիշտ տեղադրելու և ծրագրավորելու համար մենք նախ պետք է կարգավորենք մեր սահմանափակումների ֆայլը, որը կցված է այս քայլին: Հետևյալ կարգավորումները ճշգրտվել են.

Կոճակներ

  • T18- ը փոխեց «up_enable» (բարձրացրեք պայծառությունը)
  • U17- ը փոխեց «down_enable» (նվազեցրեք պայծառությունը)

7 հատվածի ցուցադրում

  • W7, W6, U8, V8, U5, V5, U7, V7 ներկայացնում են մեկ ցուցադրման յուրաքանչյուր հատված
  • U2, U4, V4, W4- ը ներկայացնում են ցուցադրվող յուրաքանչյուր անոդ (միայն 2 -ն են ակտիվ, քանի որ մեր ամենաբարձր թիվը 15 է)

PMOD Header JC

JC7- ն այն է, որտեղ մենք միացնում ենք LED լամպի լարերից մեկը, իսկ մյուս մետաղալարը տանում է դեպի GROUND:

Այս ամենը կարգավորելուց հետո ձեզ մնում է միայն ստեղծել ձեր բիթսթրիմը (ինչ ծրագրով էլ օգտագործեք, այսինքն ՝ Vivado), ծրագրավորել ձեր խորհուրդը և բում: Դուք ինքներդ ունեք աշխատանքային տախտակ:

Նշում. Պին քարտեզագրումը կարելի է գտնել այստեղ Basys 3 տվյալների թերթիկում:

Ժողով

Քայլ 5: Օգտագործելով ձեր dimmer անջատիչը

Եթե ամեն ինչ լավ է ընթանում, դուք պետք է ունենաք լիովին աշխատող լուսամփոփ համակարգ: Ամփոփելու համար ՝ վերին կոճակը սեղմելը կբարձրացնի ձեր պայծառությունը (մինչև 15), իսկ ներքևի կոճակը սեղմելը կնվազեցնի ձեր պայծառությունը (մինչև 0): Հուսով եմ, որ ամեն ինչ լավ է ընթանում ձեր այժմ հանգստացած տեսողության համար:

Խորհուրդ ենք տալիս: