Hallo! Ich habe ein verzwicktes Problem, denn ich soll für ein Uni-Projekt LEDs ansteuern. Evtl. gibt es hier nette Menschen, die bereits Erfahrungen mit meinem konkreten Problem gemacht haben?! Kurz zur Erläuterung: Aufgabe: Eine RGB-LED dazu bringen, die Farben des RGB-Spektrums abzulaufen. Vorgabe: Es soll ein Altera DE2 Board mit Cyclon II (EP2C35F672C6N) Prozessor und ein R2R Netzwerk benutzt werden. Die Software dafür soll über Quartus II umgesetzt werden. Leider habe ich noch keine Erfahrungen mit dieser Software und bin etwas überfordert mit der Gesamtaufgabe. Da wir dies auch praktisch umsetzen sollen, dachte ich hier könne mir vielleicht geholfen werden! Eine einfachere Methode über PWM ist leider nicht erlaubt. Ich bräuchte eigentlich erstmal nur eine Einstiegshilfe in VHDL. Mir fehlt der Anfang - würde mich gerne reinknien ;) (Ich weiß bis jetzt, dass ich 8bit, also 0-255 als Wert benötige, damit die Genaugikeit nicht zu hoch und nicht zu niedrig ist. Und dass ich drei D/A Wandler benötige um die drei Dioden anzusprechen.) Und eine kleine Frage noch zum Schluss. Ist es über VHDL genauso einfach, wie mit C++ : Einfach rot=256 setzten und dann durch eine Schleife grün immer um "1" erhöhen? Dann rot wieder in 1er Schritten auf "0" und das dann mit allen drei Farben einmal durch?
Florian R. schrieb: > Eine einfachere Methode über PWM ist leider nicht erlaubt. Was ist daran einfacher? Oder andersrum: wenn dir das mit der PWM leicht fällt, dann mach es erst mal so. Anschließend kannst du die Ausgabe dann einfach auf den R2R DAC umbauen... Florian R. schrieb: > Und eine kleine Frage noch zum Schluss. ... Die Antwort darauf lautet: Prinzipiell ja, aber du kannst deine C Denkweise erst mal KOMPLETT vergessen. Denn die wird dich SOFORT in die falsche Richtung führen. Mein Tipp: lass die LEDs einfach erst mal Blinken. Erst eine, dann Alle, dann abwechselnd: http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html Denn wenn du dich ohne VHDL und FPGA Kenntnisse sofort die DAC Geschichte machst, fällst du auf die Nase. Garantiert. Florian R. schrieb: > (Ich weiß bis jetzt, dass ich 8bit, also 0-255 als Wert benötige, damit > die Genaugikeit nicht zu hoch und nicht zu niedrig ist. > Und dass ich drei D/A Wandler benötige um die drei Dioden anzusprechen.) Das ist nicht viel... Wie sieht die Beschaltung der LEDs aus? Willst du echt einen 8 Bit R2R DAC bauen? Evtl. sogar mit 1% Widerständen(*)? Hast du einen Schaltplan? > Es soll ein Altera DE2 Board mit Cyclon II (EP2C35F672C6N) Prozessor und > ein R2R Netzwerk benutzt werden. Die Software dafür soll über Quartus II > umgesetzt werden Das ist kein Prozessor, sondern ein FPGA. Und du erstellst dafür auch keine Software, sondern eine Hardwarebeschreibung (daher kommt das HDL in VHDL). (*)Siehe den Beitrag "R2R-Wandler mit einem PLD"
:
Bearbeitet durch Moderator
Lothar M. schrieb: > Willst du echt einen 8 Bit R2R > DAC bauen? Evtl. sogar mit 1% Widerständen(*)? > > (*)Siehe den Beitrag "R2R-Wandler mit einem PLD" Bei allem Respekt, aber der DAC muss nicht viel besser sein als das Auge. Und dafür reichen die 1% Widerstände bei weitem aus. Ich bezweifle sogar dass man den Fehler auch bei 2% Widerständen überhaupt sieht. Du hast doch sicher einen Aufbau bei dem du eine LED mit PWM ansteuern kannst. Ermittle mal den minimalen Sprung bei halber Helligkeit den du wahrnehmen kannst, d.h. 128 -> 128 + n Auf der anderen Seite hat das Auge einen hohen Dynamikumfang, die Sprünge bei kleinen Werten eines 8bit DAC sind deutlich sichtbar, d.h. 8bit sind zu wenig. 12 bit R2R DAC aufgebaut mit 1% Widerständen wäre passend, die Nichtlinearität der LED jetzt mal vernachlässigt. Bei Audio gilt übrigens die gleiche Argumentation, d.h. 12-14 Bit relative Genauigkeit bei 20-24 Bit Dynamikumfang. Reicht dann vielleicht auch am Ende der Overtüre zu Tschaikowskis 1812 nicht zu übersteuern.
Hallo, ich habe nun ein wenig ausprobiert und die angeschlossene LED zum blinken gebracht. Sie wird über insg. 18 Pins gesteuert (6x rot, 6x blau, 6x grün). Ich habe mir nun vorgenommen, es nicht auf bit-Ebene zu regeln, da ich diese Kenntnis nicht habe und ich auch keine Anleitung dazu gefunden habe (falls ihr mir dabei helfen wollt, wäre ich sehr glücklich). Ansonsten würde ich einfach versuchen alle Kombinationen aus den 18 Pins hervorzubringen. Die einzelnen Pins haben unterschiedliche Helligkeiten, alle zusammen 100% Helligkeit (nicht linearer Anstieg, wie von euch genannt). Ich weiß leider nicht, wie ich den Code vereinfachen kann, damit ich nicht jede einzelne Möglichkeit aufführen muss. Es wäre schön, wenn ihr euch den Code mal ansehen würdet und mir ein Paar Tipps gebt:
1 | library ieee; |
2 | use ieee.std_logic_1164.all; |
3 | use ieee.numeric_std.all; |
4 | |
5 | entity LED_FARB is |
6 | port( |
7 | CLOCK_50 : in STD_LOGIC; |
8 | LED_G1 : out STD_LOGIC; |
9 | |
10 | sw0, sw1, sw2, sw3, sw4, sw5, sw6, sw7, sw8, sw9, sw10, sw11, sw12, sw13, sw14 , sw15, sw16, sw17 : in std_logic; |
11 | g0, g1, g2, g3, g4, g5 : out bit; --grün=g blau=b rot=r |
12 | b0, b1, b2, b3, b4, b5 : out bit; |
13 | r0, r1, r2, r3, r4, r5 : out bit |
14 | );
|
15 | end LED_FARB; |
16 | |
17 | architecture Behavioral of LED_FARB is |
18 | signal c : integer range 0 to 24999999 := 0; -- 0,5s bei 50MHz fosc |
19 | signal x : std_logic:= '0'; |
20 | signal y : std_logic:= '1'; |
21 | signal w : integer range 0 to 12 := 0; |
22 | |
23 | -- neues ding
|
24 | begin
|
25 | |
26 | r0 <= '1' when (w = 1) else '0'; b0 <= '1' when (w = 1) else '0'; |
27 | r1 <= '1' when (w = 2) else '0'; b1 <= '1' when (w = 2) else '0'; |
28 | r2 <= '1' when (w = 3) else '0'; b2 <= '1' when (w = 3) else '0'; |
29 | r3 <= '1' when (w = 4) else '0'; b3 <= '1' when (w = 4) else '0'; |
30 | r4 <= '1' when (w = 5) else '0'; b4 <= '1' when (w = 5) else '0'; |
31 | r5 <= '1' when (w = 6) else '0'; b5 <= '1' when (w = 6) else '0'; |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | process begin |
39 | wait until rising_edge(CLOCK_50); -- warten bis zum nächsten Takt |
40 | if (c<24999999) then -- 0…24999999 = 25000000 Takte = 1/2 Sekunde bei 50MHz |
41 | c <= c+1; -- wenn kleiner: weiterzählen |
42 | |
43 | |
44 | else -- wenn Zählerende erreicht: |
45 | c <= 0; -- Zähler zurücksetzen |
46 | x <= not x; -- und Signal x togglen |
47 | y <= not y; |
48 | |
49 | |
50 | end if; |
51 | |
52 | if (c=0)then |
53 | if (w<12) then |
54 | w <= w+1; |
55 | else
|
56 | w <= 0; |
57 | end if; |
58 | end if; |
59 | |
60 | end process; |
61 | LED_G1 <= x; -- Signal x an LED ausgeben |
62 | end Behavioral; |
Florian R. schrieb: > Ich habe mir nun vorgenommen, es nicht auf bit-Ebene zu regeln, da ich > diese Kenntnis nicht habe Hört sich nach einer schlüssigen Argumentationskette an. Man könnte alternativ aber auch einfach mal was Neues lernen... Florian R. schrieb: > g0, g1, g2, g3, g4, g5 : out bit; Zwei Sachen dazu: Nimm doch statt der vielen einzelnen Bits einfach einen 6 Bit breiten Vektor als Ausgang. Und nimm wie der Rest der Welt statt des bit einen std_logic. Vergiss das bit und den bit_vector am Besten gleich ganz.
:
Bearbeitet durch Moderator
Hallo, also ich würde gerne mehr lernen, so war das nicht gemeint. Ich bin nur nicht so sehr in der Materie drin um es auf so "elegante" Weise umzusetzen, denn ich bin nicht ganz eine Woche dabei und war eigentlich recht stolz auf meine Ergebnisse. Leider kann ich mit so kurz gehaltenen Aussagen auch nicht viel anfangen. Es wäre schön, wenn du mir helfen willst, deine Aussagen einmal an einem kurzen Codebeispiel zu zeigen, ich denke dass würde Leuten in Zukunft das ganze auch leichter machen. Und nun noch eine Frage zu den Vektoren. Wenn ich 6 verschiedene Pins habe und alle unterschiedlich in der Helligkeit sind, wie bilde ich dann damit ein gutes Vektorsystem? (Am besten 1,2,12,3,13,23,123,4,14,24,124,34,134,234,1234,5,15,25,125,35...) Und dann müsste ich jede einzelne Helligkeit mit jeder der anderen Farbe einmal aufleuchten lassen um einen vollen RGB-Farbkreis zu erschaffen. Es wäre schön, wenn du mir und auch gerne jemand anders etwas helfen würde.
Florian R. schrieb: > > Und nun noch eine Frage zu den Vektoren. Wenn ich 6 verschiedene Pins > habe und alle unterschiedlich in der Helligkeit sind, wie bilde ich dann > damit ein gutes Vektorsystem? (Am besten > 1,2,12,3,13,23,123,4,14,24,124,34,134,234,1234,5,15,25,125,35...) > Und dann müsste ich jede einzelne Helligkeit mit jeder der anderen Farbe > einmal aufleuchten lassen um einen vollen RGB-Farbkreis zu erschaffen. > Um das beantworten zu können, müssen wir den Schaltplan kennen. Ein einfaches R2R Netzwerk an den FPGA Pins funktioniert übrigens mit LEDs nicht.
Zwei wichtige Faktoren aus der Farbenlehre solltest du berücksichtigen, unabhängig von der Ausgabemethode (PWM oder analog): 1.) zum Durchlaufen des Spektrums und dem besseren Verstehen, was eigentlich Farbe ist, nimm als Basis das HSV-Farbsystem. Dies trennt in Hue (Farbe auf einem Kreis von 0=Rot immer in 60-Grad-Schritten über Gelb, Grün, Cyan, Blau bis Magenta bei 300 Grad und dann zurück zu Rot bei 360=0 Grad). Es trennt weiterhin in Saturation (Sättigung, "Reinheit", geht von reiner Farbe über "blass" bis neutral, also nicht-farbig) und Value (Helligkeit von ganz intensiv bis dunkel/schwarz). So kann man rel. problemlos einen bestimmten Farbton vorgeben bzw. sich vorzustellen. Das ist so wesentlich einfacher als sich z.B. "R=100, B=50 und G=10" vorzustellen! Um das auf die LEDs auszugeben brauchst du nat. am Ende dann die RGB-Werte, dazu nimmst du z.B. die Formel aus Wikipedia oder von hier: http://www.wisotop.de/vonRGBnachHSV.shtml 2.) das Empfinden des menschlichen Auges ist logarithmisch (glaub ungefähr zur Basis 3), nicht linear. Also doppelter Strom durch die LED bedeutet noch lange nicht, dass diese auch als doppelt so hell empfunden wird. Also sieh in deiner Software vor der Ausgabe je Kanal noch eine LUT (look-up-table) zur Kennlinien-Korrektur vor!
:
Bearbeitet durch User
Frank E. schrieb: > Zwei wichtige Faktoren aus der Farbenlehre solltest du berücksichtigen Ich glaube fast, dass das zwar korrekt ist, aber himmelweit über das simple Ziel hinausschießt. Lattice User schrieb: > Ein einfaches R2R Netzwerk an den FPGA Pins funktioniert übrigens mit > LEDs nicht. Ich denke ernsthaft: für das Nievau, auf dem wir gerade sind, würde das erst mal ausreichen. Die Nichtlinearitäten kann man später klären. Florian R. schrieb: > Wenn ich 6 verschiedene Pins habe und alle unterschiedlich in der > Helligkeit sind, wie bilde ich dann damit ein gutes Vektorsystem? Nimm wie der Rest der Welt das altbekannte Zweiersystem. Damit lässt sich toll arbeiten und jeder versteht es. > (Am besten 1,2,12,3,13,23,123,4,14,24,124,34,134.......) Was sagen diese Zahlenkolonnen aus? Welches Bild hast du da im Kopf? > Wenn ich 6 verschiedene Pins habe und alle unterschiedlich in der > Helligkeit sind Zeig doch mal einen Schaltplan. Ohne sowas ist jede weitere Diskussion sinnlos. Denn es können 100 vollkommen korrekte Aussagen kommen und du kannst trotzdem nicht 1 Einzige davon verwerten. > Es wäre schön, wenn du mir und auch gerne jemand anders etwas helfen > würde. Oft ist es so, dass nicht geholfen wird, weil keiner versteht, was du denn eigentlich willst...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.