Isi kandungan:

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

Video: LED Dimmable Menggunakan Papan Basys 3: 5 Langkah

Video: LED Dimmable Menggunakan Papan Basys 3: 5 Langkah
Video: Simulasi rangkaian seri dan paralel lampu led 2024, Julai
Anonim
LED Dimmable Menggunakan Papan Basys 3
LED Dimmable Menggunakan Papan Basys 3

Dalam panduan ini kita akan membina dan mengawal sistem peredupan LED luaran. Dengan butang yang tersedia, pengguna dapat meredupkan mentol LED ke kecerahan yang diinginkan. Sistem ini menggunakan papan Basys 3, dan disambungkan ke papan roti yang mengandungi perintang dan mentol LED. Menekan butang "atas" yang ditentukan akan meningkatkan kecerahan, dan menekan butang "bawah" akan menurunkan kecerahan hingga sifar. Ini bukan sahaja menghalang pengguna daripada dibutakan oleh mentol terang seperti cahaya matahari tetapi juga menjimatkan tenaga!

Langkah 1: Buat Pembilang Input

Untuk langkah ini kita membuat komponen yang menentukan tahap kecerahan (melalui jam) dengan menggunakan dua suis: satu untuk meningkat dan satu untuk menurun. Dengan menggunakan VHDL, kami menghasilkan kaunter melalui penggunaan flip-flop D. Menekan butang "atas" mendorong keadaan seterusnya ke keadaan sekarang, keluar ke paparan tujuh segmen dan mentol LED.

entiti updown_counter adalah

Pelabuhan (present_state: out STD_LOGIC_VECTOR (3 downto 0); sebelumnya_state: di STD_LOGIC_VECTOR (3 downto 0); next_state: in STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; down_enable: in STD_LOGIC; up_enog: in_enog; akhir updown_counter; arsitektur Behavioral of updown_counter is start flop: process (next_state, clk, up_enable, down_enable, sebelumnya_state) bermula jika (meningkat_kebaikan (clk)) maka jika (up_enable = '1' dan tidak (next_state = "0000")) maka present_state <= negeri_ seterusnya; elsif (down_enable = '1' and not (sebelumnya_state = "1111")) kemudian present_state <= sebelumnya_state; tamat sekiranya; tamat sekiranya; proses akhir gagal; Tingkah laku akhir;

Kami juga memerlukan jam untuk setiap input dimasukkan (ketika naik), jadi kami juga membuat pembahagi jam yang menentukan seberapa cepat butang dapat ditekan di antara setiap tingkat kecerahan. Pembahagi jam ini membolehkan kita memaparkan tahap yang betul pada paparan tujuh segmen dan menghasilkan tahap intensiti yang tepat untuk setiap tahap.

entiti counter_clkDiv adalah

Port (clk: dalam std_logic; sclk: out std_logic); tamat kaunter_clkDiv; seni bina my_clk_div of counter_clkDiv adalah max_count malar: integer: = (10000000); isyarat tmp_clk: std_logic: = '0'; mulakan my_div: proses (clk, tmp_clk) pemboleh ubah div_cnt: integer: = 0; mulakan jika (meningkat_kebaikan (clk)) maka jika (div_cnt> = MAX_COUNT) maka tmp_clk <= bukan tmp_clk; div_cnt: = 0; lain div_cnt: = div_cnt + 1; tamat sekiranya; tamat sekiranya; sclk <= tmp_clk; proses akhir my_div; tamatkan my_clk_div;

Langkah 2: Buat Pembahagi Jam LED

Untuk langkah ini, kami membuat pembahagi jam untuk mentol LED untuk menentukan 16 tahap intensiti yang berbeza. Dengan 0 hingga 15 menampilkan kecerahan maksimum, pembahagi jam menambah setiap butang tekan dengan apa yang kita tetapkan menjadi tahap kecerahan. Setiap peningkatan tahap bermaksud peningkatan jam untuk lampu LED. Mengingat bahawa kecerahan tidak meningkat secara linier, kami menggerakkan jam ke tahap tertinggi yang dapat dicapai dan menurunkan jam kami dengan sewajarnya.

Catatan: kami menggunakan LED biru. Menggunakan warna yang berbeza (seperti merah) memerlukan jam yang sedikit berbeza sama sekali; tetapan kecerahan sederhana untuk biru sudah boleh menjadi kecerahan maksimum untuk warna merah. Ini berlaku kerana panjang gelombang cahaya yang berbeza akan memerlukan jumlah tenaga yang berbeza, dengan warna yang lebih sejuk seperti ungu dan biru memerlukan lebih banyak tenaga, sementara warna yang lebih panas seperti merah dan oren memerlukan lebih sedikit tenaga.

entiti led_clkDiv adalah Port (present_state: in STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); tamat led_clkDiv; seni bina Tingkah laku led_clkDiv adalah isyarat tmp_clk: std_logic: = '0'; pemboleh ubah dikongsi max_count: integer; begin count_stuff: process (present_state) begin case present_state adalah ketika "0000" => max_count: = 0; apabila "0001" => max_count: = 2; apabila "0010" => max_count: = 4; apabila "0011" => max_count: = 6; apabila "0100" => max_count: = 8; apabila "0101" => max_count: = 10; apabila "0110" => max_count: = 12; apabila "0111" => max_count: = 14; apabila "1000" => max_count: = 16; apabila "1001" => max_count: = 25; apabila "1010" => max_count: = 50; apabila "1011" => max_count: = 100; apabila "1100" => jumlah maksimum: = 150; apabila "1101" => jumlah maksimum: = 200; apabila "1110" => jumlah maksimum: = 250; apabila "1111" => jumlah maksimum: = 300; kes akhir; proses akhir hitungan_bahan; my_div: proses (clk, tmp_clk, present_state) pemboleh ubah div_cnt: integer: = 0; mulakan jika (meningkat_kebaikan (clk)) maka jika (div_cnt> = max_count) maka tmp_clk <= bukan tmp_clk; div_cnt: = 0; lain div_cnt: = div_cnt + 1; tamat sekiranya; tamat sekiranya; led_clk <= tmp_clk; proses akhir my_div; Tingkah laku akhir;

Langkah 3: Membuat Pengawal LED

Sekarang kita berjaya sejauh ini, tiba masanya untuk menggabungkan semua komponen yang telah kita buat sejauh ini ke dalam fail Pengawal LED.

Ringkasnya, komponen yang digunakan adalah seperti berikut:

  • Pembilang input (updown_counter)
  • Pembahagi jam (counter_clkDiv)
  • Pembahagi jam LED (led_clkDiv)
  • Pemacu paparan tujuh segmen (sseg_dec) (fail terlampir)

Pemacu paparan tujuh segmen sebenarnya tidak pernah dibincangkan sebelum ini kerana kami sebenarnya meminjam fail VHDL dari Dr. Bryan Mealy kerana kodnya yang panjang dan rumit. Yang pada dasarnya adalah mendorong input butang kami ke paparan tujuh segmen di papan Basys 3 sehingga kita tahu tahap kecerahan.

Melangkah ke hadapan, Pengawal LED menggunakan flip flop untuk meningkatkan atau mengurangkan kiraan yang mengawal paparan tujuh segmen dan tahap kecerahan mentol LED secara serentak.

kaunter entiti ialah 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_clOG: out STD_LOGIC: out STD kaunter akhir; arsitektur Tingkah laku kaunter adalah komponen updown_counter adalah Port (present_state: out STD_LOGIC_VECTOR (3 downto 0); sebelumnya_state: di STD_LOGIC_VECTOR (3 downto 0); next_state: in STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; down_LOGIC; down_LOGIC; STD_LOGIC; up_enable: dalam 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: in std_logic_vector (7 downto 0); SIGN: in std_logic; VALID: in std_logic; CLK: in std_logic; DISP_EN: out std_logic_vector (3 downto 0); SEGMENTS: out std_logic; komponen akhir sseg_dec; komponen led_clkDiv adalah Port (present_state: in STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); komponen akhir led_clkDiv; signal present_state: STD_LOGIC_VECTOR (3 ke bawah 0): = "0000"; signal next_state: STD_LOGIC_VECTOR (3 ke bawah 0): = "0000"; signal sebelumnya_state: STD_LOGIC_VECTOR (3 turun 0): = "0000"; isyarat Alu_Val: STD_LOGIC_VECTOR (7 turun 0); sclk isyarat: STD_LOGIC; mulakan Alu_Val (7 ke bawah 4) <= "0000"; Alu_Val (3 ke bawah 0) <= keadaan sekarang; 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); sebelumnya_state (0) <= tidak (present_state (0)); sebelumnya_state (1) <= present_state (0) xnor present_state (1); sebelumnya_state (2) <= (present_state (0) nor present_state (1)) xor present_state (2); sebelumnya_state (3) sclk, next_state => next_state, sebelumnya_state => sebelumnya_state, up_enable => up_enable, down_enable => down_enable, present_state => present_state); paparan: peta port sseg_dec (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_div: peta port led_clkDiv (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: peta port counter_clkDiv (clk => clk, sclk => sclk); Tingkah laku akhir;

Langkah 4: Menetapkan Kekangan dan Perhimpunan

Kekangan

Untuk menetapkan dan memprogram papan Basys 3 dengan betul, kita mesti terlebih dahulu menyiapkan fail kekangan kita yang dilampirkan pada langkah ini. Tetapan berikut telah disesuaikan:

Butang

  • Diubah T18 menjadi "up_enable" (tingkatkan kecerahan)
  • Diubah U17 menjadi "down_enable" (penurunan kecerahan)

Paparan 7 segmen

  • W7, W6, U8, V8, U5, V5, U7, V7 mewakili setiap segmen satu paparan
  • U2, U4, V4, W4 mewakili setiap anod yang dipaparkan (hanya 2 yang aktif kerana bilangan tertinggi kami adalah 15)

Ketua PMOD JC

JC7 adalah tempat kita menyambungkan salah satu wayar mentol LED, dan wayar lain mengarah ke GROUND

Setelah menetapkan semua ini, yang perlu anda lakukan adalah menjana aliran bit anda (dengan perisian apa pun yang anda gunakan iaitu Vivado), atur papan anda dan boom! Anda mempunyai papan kerja.

Catatan: Pemetaan pin boleh didapati di Lembaran Data Basys 3 di sini.

perhimpunan

Langkah 5: Menggunakan Suis Dimmer Anda

Sekiranya semuanya berjalan lancar, anda harus mempunyai sistem redup yang berfungsi sepenuhnya. Untuk meringkaskan, menekan butang atas akan meningkatkan kecerahan anda (sampai ke 15), dan menekan butang bawah akan menurunkan kecerahan anda (sampai ke 0). Semoga semuanya berjalan lancar untuk penglihatan anda sekarang yang santai!

Disyorkan: