Оглавление:

Регулируемая яркость светодиода с использованием платы Basys 3: 5 шагов
Регулируемая яркость светодиода с использованием платы Basys 3: 5 шагов

Видео: Регулируемая яркость светодиода с использованием платы Basys 3: 5 шагов

Видео: Регулируемая яркость светодиода с использованием платы Basys 3: 5 шагов
Видео: Понижающий преобразователь с регулировкой тока и напряжения 2024, Июль
Anonim
Светодиод с регулируемой яркостью с использованием платы Basys 3
Светодиод с регулируемой яркостью с использованием платы Basys 3

В этом руководстве мы собираемся построить и управлять внешней системой затемнения светодиодов. С помощью доступных кнопок пользователь может уменьшить яркость светодиодной лампы до любой желаемой яркости. В системе используется плата Basys 3, подключенная к макетной плате, содержащей резистор и светодиодную лампу. Нажатие обозначенной кнопки «вверх» увеличит яркость, а нажатие кнопки «вниз» уменьшит яркость полностью до нуля. Это не только предотвращает ослепление пользователя от ярких, как солнце, лампочек, но и экономит энергию!

Шаг 1. Создайте счетчик ввода

Для этого шага мы создаем компонент, который определяет уровень яркости (через часы) с помощью двух переключателей: один для увеличения, а другой для уменьшения. Используя VHDL, мы создали счетчик с помощью D-триггеров. Нажатие кнопки «вверх» переводит следующее состояние в текущее состояние с выводом на семисегментный дисплей и светодиодную лампочку.

entity updown_counter - это

Порт (Present_state: out STD_LOGIC_VECTOR (3 вниз до 0); previous_state: в STD_LOGIC_VECTOR (3 downo 0); next_state: в STD_LOGIC_VECTOR (3 downo 0); clk: в STD_LOGIC; down_enable: в STD_LOGIC); конец updown_counter; архитектура Поведение updown_counter: begin flop: process (next_state, clk, up_enable, down_enable, previous_state) begin if (ising_edge (clk)) then if (up_enable = '1' and not (next_state = "0000")) then present_state <= next_state; elsif (down_enable = '1', а не (previous_state = "1111")) then present_state <= previous_state; конец, если; конец, если; флоп завершения процесса; конец Поведенческий;

Нам также нужны часы для каждого входа, который будет фиксироваться (когда он возрастает), поэтому мы также создали делитель часов, который определяет, насколько быстро можно нажимать кнопки между каждым уровнем яркости. Этот делитель часов позволяет нам правильно отображать нужный уровень на семисегментном дисплее и обеспечивать нужный уровень интенсивности для каждого уровня.

entity counter_clkDiv - это

Порт (clk: in std_logic; sclk: out std_logic); конец counter_clkDiv; архитектура my_clk_div counter_clkDiv постоянна max_count: integer: = (10000000); сигнал tmp_clk: std_logic: = '0'; begin my_div: process (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; end my_clk_div;

Шаг 2: Создайте светодиодный разделитель часов

Для этого шага мы создаем тактовый делитель для светодиодной лампы, чтобы определять 16 различных уровней интенсивности. Если от 0 до 15, отображающей максимальную яркость, делитель часов увеличивает каждое нажатие кнопки на то, что мы установили как уровни яркости. Каждый повышающийся уровень означал увеличение часов для светодиодной лампы. Помня, что яркость не увеличивается линейно, мы установили часы на максимальное значение, на которое они могли подняться, и соответственно уменьшили их.

Примечание: мы используем синий светодиод. Использование другого цвета (например, красного) потребует совсем немного других часов; настройка средней яркости для синего уже может быть максимальной яркостью для красного. Это происходит потому, что разные длины волн света потребуют разного количества энергии: более холодные цвета, такие как фиолетовый и синий, требуют больше энергии, а более теплые цвета, такие как красный и оранжевый, требуют меньше энергии.

объект led_clkDiv - это порт (present_state: в STD_LOGIC_VECTOR (от 3 до 0); clk: в STD_LOGIC; led_clk: из STD_LOGIC); конец led_clkDiv; архитектура Поведение led_clkDiv - это сигнал tmp_clk: std_logic: = '0'; общая переменная max_count: integer; begin count_stuff: process (present_state) begin case present_state - это когда "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 Controller.

Подводя итог, используются следующие компоненты:

  • Входной счетчик (updown_counter)
  • Делитель часов (counter_clkDiv)
  • Светодиодный делитель часов (led_clkDiv)
  • Драйвер семисегментного дисплея (sseg_dec) (прикрепленный файл)

Драйвер семисегментного дисплея фактически ранее не обсуждался, потому что мы фактически позаимствовали файл VHDL у доктора Брайана Мили из-за его длинного и сложного кода. По сути, он передает наши кнопки на семисегментный дисплей на плате Basys 3, чтобы мы знали, какой уровень яркости включен.

Двигаясь вперед, светодиодный контроллер использует триггеры для увеличения или уменьшения счетчика, который одновременно управляет как семисегментным дисплеем, так и уровнем яркости светодиодной лампы.

счетчик сущностей - это порт (clk: в STD_LOGIC; up_enable: в STD_LOGIC; down_enable: в STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 вниз до 0); DISP_EN: из STD_LOGIC_VECTOR (3 вниз до 0); led_clk: вне STD_CLOG); концевой счетчик; архитектура Поведение счетчика - это компонент updown_counter - это порт (present_state: out STD_LOGIC_VECTOR (от 3 до 0); previous_state: в STD_LOGIC_VECTOR (от 3 до 0); next_state: в STD_LOGIC_VECTOR (3 вниз до 0); up_enable: в STD_LOGIC); конечный компонент updown_counter; компонент counter_clkDiv - это порт (clk: in std_logic; sclk: out std_logic); конечный компонент counter_clkDiv; компонент sseg_dec - это порт (ALU_VAL: в std_logic_vector (7 вниз до 0); SIGN: в std_logic; VALID: в std_logic; CLK: в std_logic; DISP_EN: из std_logic_vector (3 вниз до 0); SEGMENTS: out std_logic) (7 вниз std_logic); конечный компонент sseg_dec; компонент led_clkDiv - это порт (present_state: в STD_LOGIC_VECTOR (от 3 до 0); clk: в STD_LOGIC; led_clk: из STD_LOGIC); конечный компонент led_clkDiv; состояние_сигнала: STD_LOGIC_VECTOR (от 3 до 0): = "0000"; сигнал next_state: STD_LOGIC_VECTOR (от 3 до 0): = "0000"; предыдущее_состояние сигнала: STD_LOGIC_VECTOR (от 3 до 0): = "0000"; сигнал Alu_Val: STD_LOGIC_VECTOR (от 7 до 0); сигнал sclk: STD_LOGIC; begin Alu_Val (от 7 до 4) <= "0000"; Alu_Val (от 3 до 0) <= present_state; следующее_состояние (0) <= нет (настоящее_состояние (0)); следующее_состояние (1) <= настоящее_состояние (0) xor настоящее_состояние (1); next_state (2) <= (present_state (0) и present_state (1)) xor present_state (2); next_state (3) <= (present_state (0) и present_state (1) and present_state (2)) xor present_state (3); предыдущее_состояние (0) <= нет (настоящее_состояние (0)); предыдущее_состояние (1) <= настоящее_состояние (0) xnor настоящее_состояние (1); предыдущее_состояние (2) <= (настоящее_состояние (0) и настоящее_состояние (1)) xor настоящее_состояние (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_div: карта портов led_clkDiv (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: карта портов counter_clkDiv (clk => clk, sclk => sclk); конец Поведенческий;

Шаг 4: Установление ограничений и сборка

Ограничения

Чтобы правильно настроить и запрограммировать плату Basys 3, мы должны сначала настроить наш файл ограничений, который прилагается к этому шагу. Были изменены следующие настройки:

Кнопки

  • Поменял Т18 на "up_enable" (увеличить яркость)
  • Изменен U17 на "down_enable" (уменьшение яркости)

7-сегментный дисплей

  • W7, W6, U8, V8, U5, V5, U7, V7 представляют каждый сегмент одного дисплея
  • U2, U4, V4, W4 представляют каждый отображаемый анод (активны только 2, потому что наше наибольшее число - 15)

Заголовок PMOD JC

JC7 - это место, где мы подключаем один из проводов светодиодной лампы, а другой провод ведет к ЗАЗЕМЛЕНИЮ

После настройки все, что вам нужно сделать, это сгенерировать свой битовый поток (с любым программным обеспечением, которое вы используете, например, Vivado), запрограммировать свою плату и бум! У вас есть рабочая доска.

Примечание. Назначение контактов можно найти в техническом описании Basys 3 здесь.

сборка

Шаг 5: Использование переключателя яркости

Если все идет хорошо, у вас должна быть полностью работающая система диммера. Подводя итог, нажатие верхней кнопки увеличит яркость (полностью до 15), а нажатие кнопки вниз уменьшит яркость (полностью до 0). Надеюсь, у вашего теперь расслабленного зрения все хорошо!

Рекомендуемые: