Daftar Isi:

LED Dimmable Menggunakan Basys 3 Board: 5 Langkah
LED Dimmable Menggunakan Basys 3 Board: 5 Langkah

Video: LED Dimmable Menggunakan Basys 3 Board: 5 Langkah

Video: LED Dimmable Menggunakan Basys 3 Board: 5 Langkah
Video: How To Run Mini Led In 3v,5v,8v,12v,18v,24v,220v Using Resistor. 2024, Juli
Anonim
LED Dimmable Menggunakan Basys 3 Board
LED Dimmable Menggunakan Basys 3 Board

Dalam panduan ini kita akan membangun dan mengontrol sistem peredupan LED eksternal. Dengan tombol yang tersedia, pengguna dapat meredupkan bohlam LED ke kecerahan yang diinginkan. Sistem menggunakan papan Basys 3, dan terhubung ke papan tempat memotong roti yang berisi resistor dan bohlam LED. Menekan tombol "naik" yang ditentukan akan meningkatkan kecerahan, dan menekan tombol "turun" akan mengurangi kecerahan hingga nol. Ini tidak hanya mencegah pengguna dibutakan oleh bola lampu yang terang benderang, tetapi juga menghemat energi!

Langkah 1: Buat Penghitung Masukan

Untuk langkah ini kami membuat komponen yang menentukan tingkat kecerahan (melalui jam) dengan menggunakan dua sakelar: satu untuk naik dan satu untuk turun. Menggunakan VHDL, kami menghasilkan penghitung melalui penggunaan D flip-flop. Menekan tombol "naik" akan mendorong keadaan berikutnya ke keadaan sekarang, menghasilkan tampilan tujuh segmen dan bohlam LED.

entitas updown_counter adalah

Port (keadaan_sekarang: keluar STD_LOGIC_VECTOR (3 turun ke 0); status_sebelumnya: di STD_LOGIC_VECTOR (3 turun ke 0); keadaan_berikutnya: di STD_LOGIC_VECTOR (3 turun ke 0); clk: di STD_LOGIC; down_enable: di STD_LOGIC; up_enable: di STD_LOGIC); akhiri updown_counter; arsitektur Perilaku updown_counter adalah mulai flop: proses(next_state, clk, up_enable, down_enable, before_state) dimulai jika (rising_edge(clk)) lalu if (up_enable = '1' dan not(next_state="0000")) then present_state <= keadaan_berikutnya; elsif (down_enable = '1' dan not(previous_state= "1111")) lalu present_state <= status_sebelumnya; berakhir jika; berakhir jika; kegagalan proses akhir; akhir Perilaku;

Kami juga membutuhkan jam untuk setiap input yang akan dikunci (saat naik), jadi kami juga membuat pembagi jam yang menentukan seberapa cepat tombol dapat ditekan di antara setiap tingkat kecerahan. Pembagi jam ini memungkinkan kita untuk menampilkan tingkat yang tepat pada layar tujuh segmen dengan benar dan menghasilkan tingkat intensitas yang tepat untuk setiap tingkat.

entitas counter_clkDiv adalah

Port (clk: masuk std_logic; sclk: keluar std_logic); akhir counter_clkDiv; arsitektur my_clk_div dari counter_clkDiv adalah konstan max_count: integer:= (10000000); sinyal tmp_clk: std_logic:= '0'; mulai my_div: proses (clk, tmp_clk) variabel div_cnt: integer:= 0; mulai if (rising_edge(clk)) lalu if (div_cnt >= MAX_COUNT) maka tmp_clk <= bukan tmp_clk; div_cnt:= 0; lain div_cnt:= div_cnt + 1; berakhir jika; berakhir jika; sclk <= tmp_clk; akhiri proses my_div; akhiri my_clk_div;

Langkah 2: Buat Pembagi Jam LED

Untuk langkah ini kami membuat pembagi jam untuk bohlam LED untuk menentukan 16 tingkat intensitas yang berbeda. Dengan 0 hingga 15 menampilkan kecerahan maksimum, pembagi jam menambah setiap penekanan tombol dengan tingkat kecerahan yang kami tetapkan. Setiap peningkatan level berarti peningkatan jam untuk bohlam LED. Mengingat bahwa kecerahan tidak meningkat secara linier, kami memutar jam ke tingkat tertinggi yang bisa dicapai dan menurunkan jam kami sesuai dengan itu.

Catatan: kami menggunakan LED biru. Menggunakan warna yang berbeda (seperti merah) akan membutuhkan jam yang sedikit berbeda sama sekali; pengaturan kecerahan sedang untuk biru sudah bisa menjadi kecerahan maksimal untuk merah. Ini terjadi karena panjang gelombang cahaya yang berbeda akan membutuhkan jumlah energi yang berbeda, dengan warna yang lebih dingin seperti ungu dan biru membutuhkan lebih banyak energi, sedangkan warna yang lebih hangat seperti merah dan oranye membutuhkan lebih sedikit energi.

entitas led_clkDiv adalah Port (present_state: di STD_LOGIC_VECTOR (3 turun ke 0); clk: di STD_LOGIC; led_clk: keluar STD_LOGIC); akhir led_clkDiv; arsitektur Perilaku led_clkDiv adalah sinyal tmp_clk: std_logic:= '0'; variabel bersama max_count: integer;begin count_stuff: proses (present_state) begin case present_state adalah ketika "0000" => max_count:= 0; ketika "0001" => max_count:= 2; ketika "0010" => max_count:= 4; ketika "0011" => max_count:= 6; ketika "0100" => max_count:= 8; ketika "0101" => max_count:= 10; ketika "0110" => max_count:= 12; ketika "0111" => max_count:= 14; ketika "1000" => max_count:= 16; ketika "1001" => max_count:= 25; ketika "1010" => max_count:= 50; ketika "1011" => max_count:= 100; ketika "1100" => max_count:= 150; ketika "1101" => max_count:= 200; ketika "1110" => max_count:= 250; ketika "1111" => max_count:= 300; kasus akhir; akhiri proses count_stuff; my_div: proses (clk, tmp_clk, present_state) variabel div_cnt: integer:= 0; mulai if (rising_edge(clk)) lalu if (div_cnt >= max_count) maka tmp_clk <= bukan tmp_clk; div_cnt:= 0; lain div_cnt:= div_cnt + 1; berakhir jika; berakhir jika; led_clk <= tmp_clk; akhiri proses my_div; akhir Perilaku;

Langkah 3: Membuat Pengontrol LED

Sekarang kita telah sampai sejauh ini, saatnya untuk menggabungkan semua komponen yang telah kita buat sejauh ini ke dalam file LED Controller.

Untuk meringkas, komponen yang digunakan adalah sebagai berikut:

  • Penghitung masukan (updown_counter)
  • Pembagi jam (counter_clkDiv)
  • Pembagi jam LED (led_clkDiv)
  • Driver tampilan tujuh segmen (sseg_dec) (file terlampir)

Driver tampilan tujuh segmen sebenarnya tidak dibahas sebelumnya karena kami sebenarnya meminjam file VHDL dari Dr. Bryan Mealy karena kodenya yang panjang dan rumit. Apa yang pada dasarnya dilakukan adalah mengarahkan input tombol kami ke tampilan tujuh segmen pada papan Basys 3 sehingga kami tahu tingkat kecerahannya.

Ke depan, Kontroler LED menggunakan sandal jepit untuk menambah atau mengurangi hitungan yang mengontrol tampilan tujuh segmen dan tingkat kecerahan bohlam LED secara bersamaan.

penghitung entitas adalah Port (clk: di STD_LOGIC; up_enable: di STD_LOGIC; down_enable: di STD_LOGIC; SEGMENTS: keluar STD_LOGIC_VECTOR (7 turun ke 0); DISP_EN: keluar STD_LOGIC_VECTOR (3 turun ke 0); led_clk: keluar STD_LOGIC); penghitung akhir; arsitektur Perilaku counter adalah komponen updown_counter adalah Port (present_state: keluar STD_LOGIC_VECTOR (3 turun ke 0); sebelumnya_state: di STD_LOGIC_VECTOR (3 turun ke 0); next_state: di STD_LOGIC_VECTOR (3 turun ke 0); clk: di STD_LOGIC; down_enable: di STD_LOGIC; up_enable: di STD_LOGIC); komponen akhir updown_counter; komponen counter_clkDiv adalah Port (clk: in std_logic; sclk: out std_logic); komponen akhir counter_clkDiv; komponen sseg_dec adalah Port (ALU_VAL: di std_logic_vector(7 turun ke 0); TANDA: di std_logic; VALID: di std_logic; CLK: di std_logic; DISP_EN: keluar std_logic_vector(3 turun ke 0); SEGMEN: keluar std_logic_vector(7 downto 0)); komponen akhir sseg_dec; komponen led_clkDiv adalah Port (present_state: di STD_LOGIC_VECTOR (3 turun ke 0); clk: di STD_LOGIC; led_clk: keluar STD_LOGIC); komponen akhir led_clkDiv; sinyal present_state: STD_LOGIC_VECTOR (3 turun ke 0):= "0000"; sinyal next_state: STD_LOGIC_VECTOR (3 turun ke 0):= "0000"; sinyal status_sebelumnya: STD_LOGIC_VECTOR (3 turun ke 0):= "0000"; sinyal Alu_Val: STD_LOGIC_VECTOR (7 turun ke 0); sclk sinyal: STD_LOGIC; mulai Alu_Val(7 turun ke 4) <= "0000"; Alu_Val(3 turun ke 0) <= present_state; next_state(0) <= tidak(present_state(0)); next_state(1) <= present_state(0) xor present_state(1); next_state(2) <= (present_state(0) dan present_state(1)) xor present_state(2); next_state(3) <= (present_state(0) dan present_state(1) dan present_state(2)) xor present_state(3); keadaan_sebelumnya(0) <= tidak(keadaan_sekarang(0)); keadaan_sebelumnya(1) <= keadaan_keadaan(0) xnor keadaan_keadaan(1); keadaan_sebelumnya(2) <= (keadaan_sekarang(0) atau keadaan_keadaan(1)) xor keadaan_keadaan(2); status_sebelumnya(3) sclk, status_berikutnya => status_berikutnya, status_sebelumnya => status_sebelumnya, up_enable => up_enable, down_enable => down_enable, present_state => present_state); tampilan: peta port sseg_dec(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 peta port(clk => clk, sclk => sclk); akhir Perilaku;

Langkah 4: Menetapkan Batasan dan Perakitan

Kendala

Untuk mengatur dan memprogram papan Basys 3 dengan benar, pertama-tama kita harus mengatur file batasan kita yang dilampirkan pada langkah ini. Pengaturan berikut telah disesuaikan:

Tombol

  • Mengubah T18 menjadi "up_enable" (meningkatkan kecerahan)
  • Mengubah U17 menjadi "down_enable" (mengurangi kecerahan)

tampilan 7 segmen

  • W7, W6, U8, V8, U5, V5, U7, V7 mewakili setiap segmen dari satu tampilan
  • U2, U4, V4, W4 mewakili setiap anoda yang ditampilkan (hanya 2 yang aktif karena angka tertinggi kami adalah 15)

Header PMOD JC

JC7 adalah tempat kami menghubungkan salah satu kabel bohlam LED, dan kabel lainnya mengarah ke GROUND

Setelah mengatur ini semua, yang harus Anda lakukan adalah menghasilkan bitstream Anda (dengan perangkat lunak apa pun yang Anda gunakan yaitu Vivado), memprogram papan Anda, dan boom! Anda mendapatkan papan kerja.

Catatan: Pemetaan pin dapat ditemukan di Basys 3 Datasheet di sini.

perakitan

Langkah 5: Menggunakan Sakelar Dimmer Anda

Jika semuanya berjalan dengan baik, Anda harus memiliki sistem peredup yang berfungsi penuh. Singkatnya, menekan tombol atas akan meningkatkan kecerahan Anda (sampai 15), dan menekan tombol bawah akan mengurangi kecerahan Anda (sampai 0). Semoga semuanya berjalan dengan baik untuk penglihatan Anda yang sekarang santai!

Direkomendasikan: