Mục lục:

Đèn LED có thể điều chỉnh độ sáng sử dụng Bảng điều khiển Basys 3: 5 bước
Đèn LED có thể điều chỉnh độ sáng sử dụng Bảng điều khiển Basys 3: 5 bước

Video: Đèn LED có thể điều chỉnh độ sáng sử dụng Bảng điều khiển Basys 3: 5 bước

Video: Đèn LED có thể điều chỉnh độ sáng sử dụng Bảng điều khiển Basys 3: 5 bước
Video: Diode hoạt động như thế nào? | Diode là gì và ứng dụng ? | Điện tử cơ bản | Tri thức nhân loại 2024, Tháng mười một
Anonim
Đèn LED có thể điều chỉnh độ sáng sử dụng bảng Basys 3
Đèn LED có thể điều chỉnh độ sáng sử dụng bảng Basys 3

Trong hướng dẫn này, chúng tôi sẽ xây dựng và điều khiển hệ thống làm mờ LED bên ngoài. Với các nút có sẵn, người dùng có thể làm mờ bóng đèn LED đến bất kỳ độ sáng mong muốn nào. Hệ thống sử dụng bảng Basys 3 và nó được kết nối với bảng mạch có chứa điện trở và bóng đèn LED. Nhấn nút "lên" được chỉ định sẽ tăng độ sáng và nhấn nút "xuống" sẽ giảm độ sáng về 0. Điều này không chỉ giúp người dùng không bị lóa mắt bởi bóng đèn sáng như mặt trời mà còn tiết kiệm năng lượng!

Bước 1: Tạo bộ đếm đầu vào

Đối với bước này, chúng tôi tạo thành phần xác định mức độ sáng (thông qua đồng hồ) bằng cách sử dụng hai công tắc: một để tăng và một để giảm. Sử dụng VHDL, chúng tôi đã sản xuất bộ đếm thông qua việc sử dụng dép xỏ ngón D. Nhấn nút "lên" sẽ đẩy trạng thái tiếp theo sang trạng thái hiện tại, xuất ra màn hình bảy đoạn và bóng đèn LED.

thực thể updown_counter mới là

Port (current_state: out STD_LOGIC_VECTOR (3 xuống 0); trước_state: trong STD_LOGIC_VECTOR (3 xuống 0); next_state: trong STD_LOGIC_VECTOR (3 xuống 0); clk: trong STD_LOGIC; down_enable: trong STD_LOGIC; lên_enable: trong STD_LOGIC); end updown_counter; kiến trúc Hành vi của updown_counter là bắt đầu thất bại: process (next_state, clk, up_enable, down_enable, before_state) begin if (ising_edge (clk)) then if (up_enable = '1' and not (next_state = "0000")) then present_state <= trạng_thái tiếp theo; elsif (down_enable = '1' and not (before_state = "1111")) then present_state <= before_state; kết thúc nếu; kết thúc nếu; kết thúc quá trình thất bại; cuối Hành vi;

Chúng tôi cũng cần một đồng hồ cho mỗi đầu vào được chốt vào (khi nó tăng lên), vì vậy chúng tôi cũng tạo một bộ chia đồng hồ để xác định tốc độ có thể nhấn các nút giữa mỗi mức độ sáng. Bộ chia đồng hồ này cho phép chúng tôi hiển thị đúng mức phù hợp trên màn hình bảy phân đoạn và tạo ra mức cường độ phù hợp cho mỗi mức.

thực thể counter_clkDiv mới là

Port (clk: in std_logic; sclk: out std_logic); end counter_clkDiv; kiến trúc my_clk_div của counter_clkDiv là hằng số max_count: integer: = (10000000); tín hiệu tmp_clk: std_logic: = '0'; begin my_div: process (clk, tmp_clk) biến div_cnt: integer: = 0; begin if (ising_edge (clk)) then if (div_cnt> = MAX_COUNT) then tmp_clk <= not tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; kết thúc nếu; kết thúc nếu; sclk <= tmp_clk; kết thúc quá trình my_div; end my_clk_div;

Bước 2: Tạo dải phân cách đồng hồ LED

Đối với bước này, chúng tôi tạo một bộ chia đồng hồ cho bóng đèn LED để xác định 16 mức cường độ khác nhau. Với 0 được tắt đến 15 hiển thị độ sáng tối đa, vạch chia đồng hồ tăng mỗi lần nhấn nút bằng những gì chúng tôi đặt là các mức độ sáng. Mỗi mức tăng đồng nghĩa với việc tăng đồng hồ cho bóng đèn LED. Hãy nhớ rằng độ sáng không tăng tuyến tính, chúng tôi đã xoay đồng hồ lên mức cao nhất có thể và giảm đồng hồ của chúng tôi tương ứng.

Lưu ý: chúng tôi đang sử dụng đèn LED màu xanh lam. Sử dụng một màu khác (như màu đỏ) sẽ yêu cầu đồng hồ hơi khác một chút; cài đặt độ sáng trung bình cho màu xanh lam đã có thể là độ sáng tối đa cho màu đỏ. Điều này xảy ra vì các bước sóng ánh sáng khác nhau sẽ yêu cầu lượng năng lượng khác nhau, với các màu lạnh hơn như tím và xanh lam cần nhiều năng lượng hơn, trong khi các màu ấm hơn như đỏ và cam cần ít năng lượng hơn.

thực thể led_clkDiv là Port (current_state: in STD_LOGIC_VECTOR (3 xuống 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); end led_clkDiv; Kiến trúc Hành vi của led_clkDiv là tín hiệu tmp_clk: std_logic: = '0'; biến chia sẻ max_count: integer; begin count_stuff: process (present_state) bắt đầu trường hợp hiện_state là khi "0000" => max_count: = 0; khi "0001" => max_count: = 2; khi "0010" => max_count: = 4; khi "0011" => max_count: = 6; khi "0100" => max_count: = 8; khi "0101" => max_count: = 10; khi "0110" => max_count: = 12; khi "0111" => max_count: = 14; khi "1000" => max_count: = 16; khi "1001" => max_count: = 25; khi "1010" => max_count: = 50; khi "1011" => max_count: = 100; khi "1100" => max_count: = 150; khi "1101" => max_count: = 200; khi "1110" => max_count: = 250; khi "1111" => max_count: = 300; trường hợp kết thúc; kết thúc quy trình đếm_thước; my_div: process (clk, tmp_clk, present_state) biến div_cnt: integer: = 0; bắt đầu if (tăng_edge (clk)) sau đó if (div_cnt> = max_count) then tmp_clk <= not tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; kết thúc nếu; kết thúc nếu; led_clk <= tmp_clk; kết thúc quá trình my_div; cuối Hành vi;

Bước 3: Tạo Bộ điều khiển LED

Bây giờ chúng tôi đã làm được điều đó đến nay, cuối cùng đã đến lúc kết hợp tất cả các thành phần mà chúng tôi đã tạo cho đến nay vào tệp Bộ điều khiển LED.

Tóm lại, các thành phần được sử dụng như sau:

  • Bộ đếm đầu vào (updown_counter)
  • Bộ chia đồng hồ (counter_clkDiv)
  • Bộ chia đồng hồ LED (led_clkDiv)
  • Trình điều khiển hiển thị bảy đoạn (sseg_dec) (tệp đính kèm)

Trình điều khiển hiển thị bảy đoạn thực sự không được thảo luận trước đây vì chúng tôi thực sự đã mượn tệp VHDL từ Tiến sĩ Bryan Mealy do mã dài và phức tạp của nó. Những gì nó thực hiện về cơ bản là điều khiển các đầu vào nút của chúng tôi đến màn hình bảy phân đoạn trên bảng Basys 3 để chúng tôi biết mức độ sáng đang bật.

Về phía trước, Bộ điều khiển LED sử dụng flip flops để tăng hoặc giảm số lượng điều khiển đồng thời cả hiển thị bảy đoạn và mức độ sáng của bóng đèn LED.

bộ đếm thực thể là Cổng (clk: trong STD_LOGIC; up_enable: trong STD_LOGIC; xuống_enable: trong STD_LOGIC; SEGMENTS: ra STD_LOGIC_VECTOR (7 xuống 0); DISP_EN: ra STD_LOGIC_VECTOR (3 xuống 0); led_clk: ra STD_LOGIC); bộ đếm cuối; kiến trúc Hành vi của bộ đếm là thành phần updown_counter là Port (current_state: out STD_LOGIC_VECTOR (3 down xuống 0); trước_state: in STD_LOGIC_VECTOR (3 down xuống 0); next_state: in STD_LOGIC_VECTOR (3 down xuống 0); clk: in STD_OG_LOGIC: xuống STD_LOGIC: trong STD_LOGIC); up_enable: trong STD_LOGIC); thành phần cuối updown_counter; thành phần counter_clkDiv là Port (clk: in std_logic; sclk: out std_logic); thành phần cuối counter_clkDiv; component sseg_dec là 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_ 0); thành phần cuối sseg_dec; component led_clkDiv là Port (current_state: in STD_LOGIC_VECTOR (3 xuống 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); thành phần cuối led_clkDiv; signal present_state: STD_LOGIC_VECTOR (3 xuống 0): = "0000"; signal next_state: STD_LOGIC_VECTOR (3 xuống 0): = "0000"; signal before_state: STD_LOGIC_VECTOR (3 xuống 0): = "0000"; signal Alu_Val: STD_LOGIC_VECTOR (7 xuống 0); tín hiệu sclk: STD_LOGIC; begin Alu_Val (7 xuống 4) <= "0000"; Alu_Val (3 xuống 0) <= current_state; tiếp theo (0) <= not (nay_state (0)); next_state (1) <= current_state (0) xor present_state (1); next_state (2) <= (current_state (0) and present_state (1)) xor present_state (2); next_state (3) <= (current_state (0) and present_state (1) and present_state (2)) xor present_state (3); trước_state (0) <= not (current_state (0)); ngày_trước (1) <= ngày_triển_triển (0) xnor_ngày_bệnh (1); before_state (2) <= (current_state (0) hay present_state (1)) xor present_state (2); before_state (3) sclk, next_state => next_state, before_state => before_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: bản đồ cổng led_clkDiv (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: bản đồ cổng counter_clkDiv (clk => clk, sclk => sclk); cuối Hành vi;

Bước 4: Thiết lập các ràng buộc và lắp ráp

Hạn chế

Để thiết lập và lập trình bo mạch Basys 3 đúng cách, trước tiên chúng ta phải thiết lập tệp ràng buộc được đính kèm ở bước này. Các cài đặt sau đã được điều chỉnh:

nút

  • Đã thay đổi T18 thành "up_enable" (tăng độ sáng)
  • Đã thay đổi U17 thành "down_enable" (giảm độ sáng)

7 phân đoạn hiển thị

  • W7, W6, U8, V8, U5, V5, U7, V7 đại diện cho mỗi phân đoạn của một màn hình
  • U2, U4, V4, W4 đại diện cho mỗi cực dương được hiển thị (chỉ có 2 là hoạt động vì số cao nhất của chúng tôi là 15)

PMOD Header JC

JC7 là nơi chúng tôi kết nối một trong các dây của bóng đèn LED và dây còn lại dẫn đến GROUND

Sau khi thiết lập xong, tất cả những gì bạn phải làm là tạo dòng bit của mình (với bất kỳ phần mềm nào bạn đang sử dụng, tức là Vivado), lập trình bảng của bạn và bùng nổ! Bạn đã có cho mình một bảng làm việc.

Lưu ý: Bạn có thể tìm thấy ánh xạ pin trên Biểu dữ liệu Basys 3 tại đây.

cuộc họp

Bước 5: Sử dụng công tắc Dimmer của bạn

Nếu mọi việc suôn sẻ, bạn nên có một hệ thống điều chỉnh độ sáng hoạt động đầy đủ. Tóm lại, nhấn nút trên cùng sẽ tăng độ sáng của bạn (tất cả các cách lên 15) và nhấn nút xuống sẽ giảm độ sáng của bạn (tất cả các cách về 0). Hy vọng mọi việc suôn sẻ cho thị lực của bạn bây giờ thoải mái!

Đề xuất: