Πίνακας περιεχομένων:

Dimmable LED Χρησιμοποιώντας τον πίνακα Basys 3: 5 βήματα
Dimmable LED Χρησιμοποιώντας τον πίνακα Basys 3: 5 βήματα

Βίντεο: Dimmable LED Χρησιμοποιώντας τον πίνακα Basys 3: 5 βήματα

Βίντεο: Dimmable LED Χρησιμοποιώντας τον πίνακα Basys 3: 5 βήματα
Βίντεο: Lesson 98: Arduino 10 LED Push button Projects, Potentiometer LED Voltmeter and Traffic Light 2024, Ιούλιος
Anonim
Dimmable LED Χρησιμοποιώντας τον πίνακα Basys 3
Dimmable LED Χρησιμοποιώντας τον πίνακα Basys 3

Σε αυτόν τον οδηγό πρόκειται να κατασκευάσουμε και να ελέγξουμε ένα εξωτερικό σύστημα φωτισμού LED. Με τα διαθέσιμα κουμπιά, ο χρήστης μπορεί να μειώσει τη λάμπα LED σε οποιαδήποτε επιθυμητή φωτεινότητα. Το σύστημα χρησιμοποιεί τον πίνακα Basys 3 και είναι συνδεδεμένος με μια σανίδα ψωμιού που περιέχει μια αντίσταση και τη λάμπα LED. Πατώντας το καθορισμένο κουμπί "πάνω" θα αυξηθεί η φωτεινότητα και το πάτημα του κουμπιού "κάτω" θα μειώσει τη φωτεινότητα μέχρι το μηδέν. Αυτό όχι μόνο εμποδίζει τον χρήστη να τυφλωθεί από λαμπτήρες όπως ο ήλιος, αλλά και εξοικονομεί ενέργεια!

Βήμα 1: Δημιουργία μετρητή εισόδου

Για αυτό το βήμα δημιουργούμε το στοιχείο που καθορίζει το επίπεδο φωτεινότητας (μέσω ρολογιού) χρησιμοποιώντας δύο διακόπτες: έναν για αύξηση και έναν για μείωση. Χρησιμοποιώντας VHDL, δημιουργήσαμε τον πάγκο με τη χρήση σαγιονάρων D. Πατώντας το κουμπί "επάνω" ωθεί την επόμενη κατάσταση στην παρούσα κατάσταση, εξάγοντας στην οθόνη των επτά τμημάτων και τη λάμπα LED.

οντότητα updown_counter είναι

Θύρα (παρούσα_ κατάσταση: εκτός STD_LOGIC_VECTOR (3 προς τα κάτω 0), προηγούμενη κατάσταση: σε STD_LOGIC_VECTOR (3 από 0 προς 0), επόμενη κατάσταση: σε STD_LOGIC_VECTOR (3 κάτω προς 0); τερματισμός updown_counter? αρχιτεκτονική Συμπεριφορά του updown_counter είναι έναρξη αποτυχίας: διαδικασία (next_state, clk, up_enable, down_enable, previous_state) έναρξη εάν (αυξανόμενη_κάρα (clk)) στη συνέχεια εάν (up_enable = '1' και όχι (next_state = "0000")) τότε present_state <= next_state? elsif (down_enable = '1' και όχι (previous_state = "1111")) στη συνέχεια present_state <= previous_state; τέλος εαν; τέλος εαν; τερματισμός της διαδικασίας αποτυχία? τέλος Συμπεριφορική?

Χρειαζόμαστε επίσης ένα ρολόι για κάθε είσοδο (όταν ανεβαίνει), έτσι δημιουργήσαμε επίσης ένα διαχωριστικό ρολογιού που καθορίζει πόσο γρήγορα μπορούν να πατηθούν τα κουμπιά μεταξύ κάθε επιπέδου φωτεινότητας. Αυτός ο διαχωριστής ρολογιού μας επιτρέπει να εμφανίζουμε σωστά το σωστό επίπεδο στην οθόνη των επτά τμημάτων και να παράγουμε το σωστό επίπεδο έντασης για κάθε επίπεδο.

οντότητα counter_clkDiv είναι

Θύρα (clk: σε std_logic; sclk: out std_logic); τέλος counter_clkDiv; αρχιτεκτονική my_clk_div του counter_clkDiv είναι σταθερή max_count: ακέραιος: = (10000000); σήμα tmp_clk: std_logic: = '0'; Έναρξη my_div: διαδικασία (clk, tmp_clk) μεταβλητή div_cnt: ακέραιος: = 0; ξεκινήστε εάν (αυξανόμενη_ακμή (clk)) στη συνέχεια εάν (div_cnt> = MAX_COUNT) τότε tmp_clk <= όχι tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; τέλος εαν; τέλος εαν; sclk <= tmp_clk; τερματισμός διαδικασίας my_div? τέλος my_clk_div?

Βήμα 2: Δημιουργήστε διαχωριστικό ρολογιού LED

Για αυτό το βήμα δημιουργούμε ένα διαχωριστικό ρολογιού για τη λάμπα LED για να καθορίσουμε 16 διαφορετικά επίπεδα έντασης. Με το 0 να είναι απενεργοποιημένο στο 15 και να εμφανίζει τη μέγιστη φωτεινότητα, ο διαιρέτης του ρολογιού αυξάνει κάθε πάτημα του κουμπιού με αυτό που έχουμε ορίσει ως επίπεδα φωτεινότητας. Κάθε αυξανόμενο επίπεδο σήμαινε αύξηση του ρολογιού για τη λάμπα LED. Θυμίζοντας ότι η φωτεινότητα δεν αυξάνεται γραμμικά, αυξήσαμε το ρολόι στο υψηλότερο που μπορούσε να φτάσει και μειώσαμε ανάλογα τα ρολόγια μας.

Σημείωση: χρησιμοποιούμε μπλε LED. Η χρήση διαφορετικού χρώματος (όπως το κόκκινο) θα απαιτήσει ελαφρώς διαφορετικά ρολόγια. μια ρύθμιση μέσης φωτεινότητας για το μπλε θα μπορούσε ήδη να είναι η μέγιστη φωτεινότητα για το κόκκινο. Αυτό συμβαίνει επειδή διαφορετικά μήκη κύματος φωτός θα απαιτούν διαφορετικές ποσότητες ενέργειας, με τα πιο ψυχρά χρώματα όπως το μοβ και το μπλε να απαιτούν περισσότερη ενέργεια, ενώ τα θερμότερα χρώματα όπως το κόκκινο και το πορτοκαλί απαιτούν λιγότερη ενέργεια.

οντότητα led_clkDiv is Port (present_state: σε STD_LOGIC_VECTOR (3 προς τα κάτω 0); clk: σε STD_LOGIC; led_clk: out STD_LOGIC); τέλος led_clkDiv; αρχιτεκτονική Η συμπεριφορά του led_clkDiv είναι σήμα tmp_clk: std_logic: = '0'; κοινόχρηστη μεταβλητή max_count: ακέραιος; έναρξη count_stuff: διαδικασία (present_state) αρχή περίπτωσης 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: ακέραιος: = 0; ξεκινήστε εάν (αυξανόμενη άκρη (clk)) στη συνέχεια εάν (div_cnt> = max_count) τότε tmp_clk <= όχι tmp_clk? div_cnt: = 0; else div_cnt: = div_cnt + 1; τέλος εαν; τέλος εαν; led_clk <= tmp_clk; τερματισμός διαδικασίας my_div? τέλος Συμπεριφορική?

Βήμα 3: Δημιουργία του ελεγκτή LED

Τώρα που τα καταφέραμε, ήρθε η ώρα να συνδυάσουμε επιτέλους όλα τα στοιχεία που έχουμε δημιουργήσει μέχρι τώρα στο αρχείο LED Controller.

Συνοψίζοντας, τα συστατικά που χρησιμοποιούνται είναι τα ακόλουθα:

  • Μετρητής εισαγωγής (updown_counter)
  • Διαιρέτης ρολογιού (counter_clkDiv)
  • Διαχωριστικό ρολογιού LED (led_clkDiv)
  • Πρόγραμμα οδήγησης επτά τμημάτων (sseg_dec) (συνημμένο αρχείο)

Το πρόγραμμα οδήγησης οθόνης επτά τμημάτων δεν συζητήθηκε προηγουμένως επειδή στην πραγματικότητα δανειστήκαμε το αρχείο VHDL από τον Dr. Bryan Mealy λόγω του μακρού και περίπλοκου κώδικα. Αυτό που ουσιαστικά κάνει είναι να οδηγεί τις εισόδους των κουμπιών μας στην οθόνη επτά τμημάτων στον πίνακα Basys 3, έτσι ώστε να γνωρίζουμε σε ποιο επίπεδο φωτεινότητας υπάρχει.

Προχωρώντας προς τα εμπρός, το LED Controller χρησιμοποιεί σαγιονάρες για να αυξήσει ή να μειώσει τον αριθμό που ελέγχει τόσο την οθόνη των επτά τμημάτων όσο και το επίπεδο φωτεινότητας του λαμπτήρα LED ταυτόχρονα.

ο μετρητής οντοτήτων είναι Port (clk: σε STD_LOGIC; up_enable: σε STD_LOGIC; down_enable: σε STD_LOGIC; SEGMENTS: εκτός STD_LOGIC_VECTOR (7 κάτω προς 0); DISP_EN: out STD_LOGIC_VECTO) 3 outow; τελικός μετρητής? αρχιτεκτονική Συμπεριφορά του μετρητή είναι το στοιχείο updown_counter είναι Port (present_state: out STD_LOGIC_VECTOR (3 προς τα κάτω 0), previous_state: σε STD_LOGIC_VECTOR (3 προς τα κάτω 0); next_state: σε STD_LOGIC_VECTO_DOW: up_enable: σε STD_LOGIC); τερματικό στοιχείο updown_counter? component counter_clkDiv is Port (clk: in std_logic; sclk: out std_logic); τελικό στοιχείο counter_clkDiv; το στοιχείο sseg_dec είναι Port (ALU_VAL: σε std_logic_vector (7 προς 0); ΣΗΜΑ: σε std_logic; VALID: in std_logic; CLK: in std_logic; DISP_EN: out std_logic_vector (3 downto 0); SEGMENTS: out) ? τελικό στοιχείο sseg_dec; component led_clkDiv is Port (present_state: σε STD_LOGIC_VECTOR (3 προς τα κάτω 0); clk: σε STD_LOGIC; led_clk: out STD_LOGIC); τελικό στοιχείο led_clkDiv; σήμα present_state: STD_LOGIC_VECTOR (3 κάτω προς 0): = "0000"; σήμα next_state: STD_LOGIC_VECTOR (3 προς τα κάτω 0): = "0000"; σήμα previous_state: STD_LOGIC_VECTOR (3 προς τα κάτω 0): = "0000"; σήμα Alu_Val: STD_LOGIC_VECTOR (7 προς 0); σήμα sclk: STD_LOGIC; έναρξη Alu_Val (7 προς τα κάτω 4) <= "0000"; Alu_Val (3 κάτω στο 0) <= present_state; next_state (0) <= not (present_state (0)); next_state (1) <= present_state (0) xor present_state (1); next_state (2) <= (present_state (0) και present_state (1)) xor present_state (2); next_state (3) <= (present_state (0) και present_state (1) και present_state (2)) xor present_state (3); previous_state (0) <= not (present_state (0)); previous_state (1) <= present_state (0) xnor present_state (1); previous_state (2) <= (present_state (0) ούτε present_state (1)) xor present_state (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, πρέπει πρώτα να ρυθμίσετε το αρχείο περιορισμών που επισυνάπτεται σε αυτό το βήμα. Οι ακόλουθες ρυθμίσεις έχουν προσαρμοστεί:

Κουμπιά

  • Αλλαγή T18 σε "up_enable" (αύξηση φωτεινότητας)
  • Άλλαξε το U17 σε "down_enable" (μείωση φωτεινότητας)

Οθόνη 7 τμημάτων

  • Τα W7, W6, U8, V8, U5, V5, U7, V7 αντιπροσωπεύουν κάθε τμήμα μιας οθόνης
  • U2, U4, V4, W4 αντιπροσωπεύουν κάθε άνοδο που εμφανίζεται (μόνο 2 είναι ενεργές επειδή ο μεγαλύτερος αριθμός μας είναι 15)

PMOD Header JC

Το JC7 είναι όπου συνδέουμε ένα από τα καλώδια του λαμπτήρα LED και το άλλο καλώδιο οδηγεί στο GROUND

Αφού τα ρυθμίσετε όλα αυτά, το μόνο που έχετε να κάνετε είναι να δημιουργήσετε το bitstream (με οποιοδήποτε λογισμικό χρησιμοποιείτε, δηλαδή το Vivado), να προγραμματίσετε τον πίνακα και να κάνετε έκρηξη! Έχετε έναν πίνακα εργασίας.

Σημείωση: Η αντιστοίχιση καρφιτσών βρίσκεται στο φύλλο δεδομένων Basys 3 εδώ.

Συνέλευση

Βήμα 5: Χρήση του διακόπτη dimmer σας

Εάν όλα πάνε καλά, θα πρέπει να έχετε ένα πλήρως λειτουργικό σύστημα dimmer. Συνοψίζοντας, το πάτημα του επάνω κουμπιού θα αυξήσει τη φωτεινότητά σας (μέχρι 15) και το πάτημα του κουμπιού κάτω θα μειώσει τη φωτεινότητά σας (μέχρι το 0). Ελπίζω να πάνε όλα καλά για τη χαλαρή πλέον όρασή σας!

Συνιστάται: