Mundarija:

Dimysable LED Basys 3 taxtasi yordamida: 5 qadam
Dimysable LED Basys 3 taxtasi yordamida: 5 qadam

Video: Dimysable LED Basys 3 taxtasi yordamida: 5 qadam

Video: Dimysable LED Basys 3 taxtasi yordamida: 5 qadam
Video: Полное руководство по МОП-транзистору AOD4184A 15 А, 400 Вт для управления двигателем или нагрузкой 2024, Iyul
Anonim
Basys 3 taxtasi yordamida dimlangan LED
Basys 3 taxtasi yordamida dimlangan LED

Ushbu qo'llanmada biz tashqi LEDni o'chirish tizimini quramiz va boshqaramiz. Mavjud tugmalar yordamida foydalanuvchi LED lampochkasini xohlagan yorqinlikka tushirishi mumkin. Tizimda Basys 3 taxtasi ishlatiladi va u rezistor va LED lampochkasi bo'lgan non paneliga ulangan. Belgilangan "yuqoriga" tugmachasini bosish yorqinlikni oshiradi va "pastga" tugmasini bosish yorqinlikni nolgacha kamaytiradi. Bu nafaqat foydalanuvchini quyosh nurli lampalar bilan ko'r bo'lishining oldini oladi, balki energiyani ham tejaydi!

1 -qadam: Kirish hisoblagichini yarating

Ushbu qadam uchun biz ikkita kalit yordamida yorqinlik darajasini aniqlaydigan komponentni (soat orqali) yaratamiz: birini oshirish va kamaytirish uchun. VHDL-dan foydalanib, biz D flip-flop yordamida hisoblagichni ishlab chiqardik. "Yuqoriga" tugmachasini bosish keyingi holatni hozirgi holatga o'tkazadi, etti segmentli displey va LED lampochkasini chiqaradi.

varaqni updown_counter

Port (hozirgi holat: STD_LOGIC_VECTOR (3 pastga 0); oldingi_ holat: STD_LOGIC_VECTOR da (3 pastga 0); keyingi_shtat: STD_LOGIC_VECTOR da (3 pastga 0 ga); clk: STD_LOGICda; pastga_enable: STD_LOGIC da; updown_counter -ni tugatish; Arxitektura updown_counter -ning xulq -atvori boshlanadi: jarayon (next_state, clk, up_enable, down_enable, previous_state) if if (ko'tarilish_kiri (clk)) keyin agar (up_enable = '1' emas, balki (next_state = "0000")) keyin present_state <= next_state; elsif (down_enable = '1' va emas (avvalgi_shtat = "1111")) keyin present_state <= oldingi_ holat; tugatish, agar; tugatish, agar; jarayonning tugashi; xulq -atvorni tugatish;

Bizga har bir kirishni ushlab turish uchun soat kerak (u ko'tarilganda), shuning uchun biz har bir yorqinlik darajasi o'rtasida tugmachalarni qanchalik tez bosilishini aniqlaydigan soat ajratgichni yaratdik. Bu soatni ajratuvchi bizga yetti segmentli displeyda to'g'ri darajani to'g'ri ko'rsatish va har bir daraja uchun to'g'ri intensivlik darajasini ishlab chiqarish imkonini beradi.

counter_clkDiv obyekti

Port (clk: std_logic; sclk: out std_logic); counter_clkDiv tugatish; counter_clkDiv ning my_clk_div arxitekturasi doimiy max_count: integer: = (10000000); signal tmp_clk: std_logic: = '0'; my_div: process (clk, tmp_clk) o'zgarmaydigan div_cnt: integer: = 0; boshlang if (ko'tarilish_ qirrasi (clk)) keyin, agar (div_cnt> = MAX_COUNT), keyin tmp_clk <= tmp_clk emas; div_cnt: = 0; boshqa div_cnt: = div_cnt + 1; tugatish, agar; tugatish, agar; sclk <= tmp_clk; my_div jarayonini tugatish; my_clk_div tugatish;

2 -qadam: LED soat taqsimlagichini yarating

Ushbu qadam uchun biz 16 xil intensivlik darajasini aniqlash uchun LED lampochkasi uchun soat ajratgichini yaratamiz. 0 dan 15 gacha maksimal yorqinlikni ko'rsatadigan bo'lsak, soat taqsimlagichi har bir tugmani bosish vaqtini biz yorqinlik darajasiga ko'taradi. Har bir o'sish darajasi LED lampochkasi uchun soatning ko'payishini anglatardi. Yorqinlik chiziqli ravishda oshmasligini eslab, biz soatni maksimal darajaga ko'tardik va shunga mos ravishda soatimizni kamaytirdik.

Eslatma: biz ko'k LEDni ishlatamiz. Boshqa rangni (qizil kabi) ishlatish uchun biroz boshqacha soatlar kerak bo'ladi; ko'k uchun o'rtacha yorqinlik sozlamasi qizil uchun maksimal yorqinlik bo'lishi mumkin. Buning sababi shundaki, har xil to'lqin uzunlikdagi yorug'lik har xil miqdordagi energiyani talab qiladi, binafsha va ko'k kabi sovuq ranglar ko'proq energiya talab qiladi, qizil va to'q sariq kabi issiq ranglar esa kam energiya talab qiladi.

led_clkDiv - bu Port (hozirgi holat: STD_LOGIC_VECTOR da (3 dan 0 gacha); clk: STD_LOGIC da; led_clk: STD_LOGICdan tashqarida); led_clkDiv tugatish; led_clkDiv xatti -harakati signal tmp_clk: std_logic: = '0'; umumiy o'zgaruvchi max_count: integer; begin count_stuff: process (present_state) start case case_state "0000" => max_count: = 0; qachon "0001" => max_count: = 2; qachon "0010" => max_count: = 4; qachon "0011" => max_count: = 6; qachon "0100" => max_count: = 8; qachon "0101" => max_count: = 10; qachon "0110" => max_count: = 12; qachon "0111" => max_count: = 14; qachon "1000" => max_count: = 16; qachon "1001" => max_count: = 25; qachon "1010" => max_count: = 50; qachon "1011" => max_count: = 100; qachon "1100" => max_count: = 150; qachon "1101" => max_count: = 200; qachon "1110" => max_count: = 250; qachon "1111" => max_count: = 300; oxirgi holat; jarayonlar sonini tugatish; my_div: jarayon (clk, tmp_clk, present_state) o'zgaruvchisi div_cnt: integer: = 0; boshlang if (ko'tarilish_kiri (clk)) keyin agar (div_cnt> = max_count) keyin tmp_clk <= tmp_clk emas; div_cnt: = 0; boshqa div_cnt: = div_cnt + 1; tugatish, agar; tugatish, agar; led_clk <= tmp_clk; my_div jarayonini tugatish; xulq -atvorni tugatish;

3 -qadam: LED boshqaruvini yaratish

Endi biz hozirgacha shu yo'lni bosib o'tdik, oxirigacha biz yaratgan barcha komponentlarni LED Controller fayliga birlashtirish vaqti keldi.

Xulosa qilib aytganda, quyidagi komponentlar ishlatiladi:

  • Kirish hisoblagichi (updown_counter)
  • Soat ajratuvchi (counter_clkDiv)
  • LED soat taqsimlagichi (led_clkDiv)
  • Etti segmentli displey drayveri (sseg_dec) (biriktirilgan fayl)

Etti segmentli displey drayveri aslida ilgari muhokama qilinmagan, chunki biz VHDL faylini doktor Bryan Mealydan uzoq va murakkab kod tufayli olganmiz. Asosan, biz tugmalarni kiritishini Basys 3 doskasidagi etti segmentli displeyga o'tkazamiz, shunda biz yorqinlik darajasini bilamiz.

Oldinga siljish paytida, LED tekshirgichi bir vaqtning o'zida etti segmentli displeyni ham, LED lampochkaning yorqinligini ham boshqaradigan sonlarni ko'paytirish yoki kamaytirish uchun flip floplardan foydalanadi.

shaxs hisoblagichi Port (clk: STD_LOGIC; up_enable: STD_LOGIC da; down_enable: in STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 ga 0 ga); DISP_EN: STD_LOGIC_VECTOR (3 pastga 0); led_LOG: tashqariga STD_LOGIC; oxirgi taymer; arxitektura hisoblagichning xulq -atvori komponent hisoblanadi updown_counter - Port (hozirgi holat: STD_LOGIC_VECTOR (3 pastga 0); oldingi_ holat: STD_LOGIC_VECTOR da (3 pastga 0); keyingi_ holat: STD_LOGIC_VECTOR da (3 pastga 0); clk: STD_LOGICda; STD_LOGIC da up_enable: STD_LOGIC da); oxirgi komponenti updown_counter; counter_clkDiv komponenti Port (clk: std_logic; sclk: out std_logic); counter_clkDiv komponentining oxiri; sseg_dec komponenti Port (ALU_VAL: std_logic_vector da (7 pastga 0); SIGN: std_logic da; VALID: std_logic da; CLK: std_logic da; DISP_EN: std_logic_vector (3 pastga 0); SEGMENTS: tashqariga std_logic); oxirgi komponent sseg_dec; led_clkDiv komponenti bu Port (hozirgi holat: STD_LOGIC_VECTOR da (3 dan 0 gacha); clk: STD_LOGIC da; led_clk: STD_LOGIC tashqarisida); tugatish komponenti led_clkDiv; signal present_state: STD_LOGIC_VECTOR (3 pastga 0 ga): = "0000"; signal next_state: STD_LOGIC_VECTOR (3 pastga 0 ga): = "0000"; signal oldingi_stat: STD_LOGIC_VECTOR (3 pastga 0 ga): = "0000"; signal Alu_Val: STD_LOGIC_VECTOR (7 dan 0 gacha); signal sklk: STD_LOGIC; boshlash Alu_Val (7 dan 4 gacha) <= "0000"; Alu_Val (3 pastdan 0gacha) <= hozirgi holat; next_state (0) <= emas (hozirgi_shtat (0)); next_state (1) <= present_state (0) xor present_state (1); next_state (2) <= (present_state (0) and present_state (1)) xor present_state (2); next_state (3) <= (present_state (0) and present_state (1) and present_state (2)) xor present_state (3); oldingi_shtat (0) <= emas (hozirgi_shtat (0)); oldingi_shtat (1) <= hozirgi_shtat (0) xnor hozirgi_shtat (1); oldingi_shtat (2) <= (hozirgi_shtat (0) na hozirgi_shtat (1)) yoki xozirgi holat (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); ko'rsatish: sseg_dec port xaritasi (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_div: led_clkDiv port xaritasi (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv port xaritasi (clk => clk, sclk => sclk); xulq -atvorni tugatish;

4 -qadam: Cheklovlar va yig'ilishlarni o'rnatish

Cheklovlar

Basys 3 taxtasini to'g'ri sozlash va dasturlash uchun biz avval ushbu bosqichga biriktirilgan cheklovlar faylini sozlashimiz kerak. Quyidagi sozlamalar to'g'rilandi:

Tugmalar

  • T18 "up_enable" ga o'zgartirildi (yorqinlikni oshirish)
  • U17: "pastga tushirish" ga o'zgartirildi (yorqinlikni pasaytiring)

7 segmentli displey

  • W7, W6, U8, V8, U5, V5, U7, V7 bitta displeyning har bir segmentini ifodalaydi.
  • U2, U4, V4, W4 ko'rsatilgan har bir anodni ifodalaydi (faqat 2 ta faol, chunki bizning eng yuqori raqamimiz 15)

PMOD sarlavhasi QK

JC7 - bu erda biz LED lampochkaning simlaridan birini ulaymiz, boshqa sim esa GROUNDga olib keladi

Bularning barchasini o'rnatganingizdan so'ng, siz o'zingizning oqim oqimini (Vivado -dan foydalanadigan har qanday dasturiy ta'minot bilan) yaratish, taxtangizni dasturlash va bumni yaratishingiz kerak! Siz o'zingizga ishchi taxtani oldingiz.

Eslatma: PIN -kod xaritasini Basys 3 ma'lumotlar jadvalida topishingiz mumkin.

O'rnatish

5 -qadam: Dimmer kalitidan foydalanish

Agar hamma narsa yaxshi bo'lsa, sizda to'liq ishlaydigan dimmer tizimi bo'lishi kerak. Xulosa qilib aytadigan bo'lsak, yuqori tugmani bosish sizning yorqinligingizni oshiradi (15gacha), pastga tugmasini bosish sizning yorqinligingizni pasaytiradi (oxirigacha 0gacha). Umid qilamanki, hozir bo'shashgan ko'rish uchun hammasi yaxshi bo'ladi!

Tavsiya: