Guten Tag.
Ich hab mir mal ein 0-10v in PWM Dimmer gebaut für meine LED Leisten.
Das PWM kommt aus einem ATmega8 das Programm hab ich aus diesem Forum.
Ich bin mit den unteren Dimmstufen nicht zufrieden, die Sprünge sind zu
groß.
Das liegt definitiv am ATmega und nicht an meinen 0-10v.
So jetzt hab ich hier im Forum ein Thread gefunden, wo genau das Problem
besprochen wurde und da ist sogar ein Lösungsvorschlag.
Leider kenn ich mich selber nur sehr schlecht mit dem ATmega aus und
deswegen bitte ich euch, mir zu helfen.
Könnte jemand mir helfen diesen Lösungsvorschlag in meinen Code
einzufügen.
Hier der Lösungsvorschlag von AndiH
(Beitrag "Re: AVR LED Dimmen mit Logarithmus")
die 64 Dimmstrufen auf einer 8 Bit PWM abbildet.
Willst du aber 255 Dimmstufen haben, dann geh einfach mit der PWM höher.
Auf 10 Bit, oder 12. Deine PWM ist sowieso auf den Top Wert in ICR1
eingestellt. D.h. du schreibst da 1023 rein (für 10 Bit) oder 4095 (für
12 Bit) und gehst ev. mit dem Vorteiler für den Timer etwas runter,
wenns dann flackert.
Und dann rechnest du dir eben im Excel eine neue Tabelle aus, die dir
265 Dimmstufen in den Werten von 0 bis 1023 realisiert.
Der Rest bleibt im Grunde wie er ist. Mit dem ADC Wert gehst du in diese
Tabelle und kriegst daraus den Wert raus, der ins OCR1A Register zu
schreiben ist.
Den erstrebten, fürs Auge gleichmässigen Helligkeitsverlauf, kriegst du
dann durch die Werte in der Tabelle, die die Korrektur für die
logarithmische Kennlinie des Auges machen.
Da ist nicht der ATmega dran Schuld, sondern die PWM-
Auflösung mit nur 8 Bit. Da es nun mal RELATIV größere Sprünge
bei den kleinen Pulsweiten gibt, fällt es beim Dimmen auf.
Von 255/256 zu 254/256 hast du eine Änderung um 0,04.
Von 2/256 zu 1/256 hast du eine Änderung um 0,5.
Ob man kleinere Helligkeitsunterschiede damit erzeugt, dass
man nicht von 2/256 auf 1/256 schaltet, sondern als
Zwischenstufe noch abwechelnd 2/256 und 1/256 o.ä. ausgibt,
ist Geschmackssache - ich würde eine 16-Bit PWM bevorzugen.
Bei den 8-Bit Zwischenstufen könnte dich auch bald ein Flackern
stören, da die PWM damit effektiv langsamer wird.
Nimm eine 16-Bit-PWM und alles ist gut.
Mein Problem ist, dass ich mich gar nicht auskenne damit.
Hab eben http://www.mikrocontroller.net/articles/LED-Fading mir
angeschaut. Scheint genau das Richtige zu sein weis aber gar nicht wo
ich das einfügen soll und was noch geändert werden muss.
Könnte nicht jemand bitte mein Code so bearbeiten, damit es geht.
Vielen dank für eure Hilfe
Oldie schrieb:> Ob man kleinere Helligkeitsunterschiede damit erzeugt, dass> man nicht von 2/256 auf 1/256 schaltet, sondern als> Zwischenstufe noch abwechelnd 2/256 und 1/256 o.ä. ausgibt,> ist Geschmackssache - ich würde eine 16-Bit PWM bevorzugen.
Den Unterschied braucht und sieht kein Mensch!
64 Stufen reichen dicke aus.
Oh entschuldige! Das man hier auf Blinde (Im Gehirn) Rücksicht nehmen
muß, wußte ich nicht.
Karl Heinz schrieb:> Was dich ev. weiter bringen würde, wäre die Tabelle weiter vorne im> verlinkten Thread0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16,> 18, 20, 22, 25,> 28, 30, 33, 36, 39, 42, 46, 49, 53, 56, 60, 64, 68, 72, 77, 81, 86, 90,> 95, 100, 105, 110, 116, 121, 127, 132, 138, 144, 150, 156, 163, 169,> 176, 182, 189, 196, 203, 210, 218, 225, 233, 240, 248, 255> die 64 Dimmstrufen auf einer 8 Bit PWM abbildet.
Wie kommt man nur auf so eine dämliche Tabelle?
Eine sinnvolle Helligkeit erhält man erst ab etwa 30% der Tabelle.
Und wenn man schon mit einer Tabelle arbeitet, dann sollte die
logarithmisch sein. Das Auge will es so.
Michael_ schrieb:> Den Unterschied braucht und sieht kein Mensch!> 64 Stufen reichen dicke aus.
Aha ?
Alles unter 10bit hauen meine Kunden mir um die Ohren und das zu Recht.
Es sieht einfach billig aus wenn sich Helligkeit & Farbort in Sprüngen
ändern.
Michael_ schrieb:> Und wenn man schon mit einer Tabelle arbeitet, dann sollte die> logarithmisch sein. Das Auge will es so.
Man kann mit einem 8bit Sollwert auf eine 10bit Tabelle refenzieren.
Das ändert aber wenig daran das 8bit PWM sichtbare Sprünge mit sich
bringt.
Stas S. schrieb:> Könnte nicht jemand bitte mein Code so bearbeiten, damit es geht.
Das wäre aber schade wenn das jemand tut, denn dann würdest Du nie diese
tiefe Befredigung erfahren nach langer nervenaufreibender Arbeit ein
gutes Ergebniss zu erhalten.
Ich denke das Du hier schon ganz wertvolle Tips erhalten hast wo das
Problem liegt und wie Du weitermachen solltest.
Wenn Du mehr möchtest fällt das in den Bereich 'Auftragsentwicklung' und
damit verdiene nicht nur ich mein Geld.
Also ich hab mal versucht die Tabelle mit 16bit von
http://www.mikrocontroller.net/articles/LED-Fading
in mein Code einzufügen.
Leider funktioniert das noch nicht wo sind meine Fehler?
Mein jetziger Code:
Stas S. schrieb:> Leider funktioniert das noch nicht
Was funktioniert nicht ?
> OCR1A = pgm_read_word (& pwm_table[tmp]);
Deine Zuweisung aus der PWM Tabelle.
Wo wird die aufgerufen ?
Stas S. schrieb:> OCR1A = 255-adc_read8(PC0);
Die wird in der main ständig durchlaufen.
Danke euch für euere Hilfe
Also wie gesagt ich kenn mich fast gar nicht aus damit hatte mir die
Tutorials mal durchgelesen hat mich aber bei meinem Projekt nicht weiter
gebracht.
Ist einfach zu kompliziert für mich, wenn man sich damit noch nie
beschäftigt hatte und auf einmal so was programmieren möchte.
Also ich bin auch gern lernfähig müsst mir nur sagen, wo ich das finde,
was ich brauch.
Den ersten Code hat mir hier einer aus dem Forum erstellt.
Hab gehofft das dieses Mal auch jemand mein Code editiert.
> Was funktioniert nicht ?
Also bei meinem letzten geposteten Code passiert einfach gar nix.
> Deine Zuweisung aus der PWM Tabelle.
Wo wird die aufgerufen?
Nirgendwo? Wo muss ich die den einfügen.
> Die wird in der main ständig durchlaufen.
Ist das so falsch? Ist doch mein ADC eingang mit meinen 0-5v.Oder nicht?
Stas S. schrieb:> Danke euch für euere Hilfe>> Also wie gesagt ich kenn mich fast gar nicht aus damit hatte mir die> Tutorials mal durchgelesen hat mich aber bei meinem Projekt nicht weiter> gebracht.> Ist einfach zu kompliziert für mich, wenn man sich damit noch nie> beschäftigt hatte und auf einmal so was programmieren möchte.> Also ich bin auch gern lernfähig müsst mir nur sagen, wo ich das finde,> was ich brauch.
Der springende Punkt ist, dass es in der Programmierung nicht diesen
einen Punkt gibt, den du können musst und dann ist alles gut.
Das ist wie bei einem Chirurgen. Will man sich auf Herzoperationen
spezialisieren bedeutet das nicht, das man alles andere nicht lernen
braucht. Jeder Chirurg fängt erst mal damit an, Knoten binden zu lernen.
Und wie überall, gibt es eine untere kritische Masse an Können, die man
erst mal überschreiten muss, ehe es Sinn macht, sich aus dem Übungsraum
in die freie Wildbahn hinaus zu wagen.
> Den ersten Code hat mir hier einer aus dem Forum erstellt.> Hab gehofft das dieses Mal auch jemand mein Code editiert.
So wie der aussieht hast du einfach alles irgendwie zusammenkopiert.
Deine Beste Chance ist es, wenn dir wieder jemand das komplette Programm
schreibt, auch wenn die Änderungen zu deinem Originalprogramm eigentlich
recht trivial sind. Pikanterweise ist nämlich dein Originalprogramm weit
näher an der Lösung drann, als dein letztes Konglomerat.
Allerdings: ich werds nicht sein. Aus dem Geschäft zieh ich mich mehr
und mehr zurück. Du willst was bauen - dann lerne es. Und zwar von der
Pieke auf, selbst wenn das ein paar Monate Lernen bedeutet. Musste ich
ja schliesslich auch.
Stas S. schrieb:>> Die wird in der main ständig durchlaufen.> Ist das so falsch? Ist doch mein ADC eingang mit meinen 0-5v.Oder nicht?
Genau und der ist linear und nicht logarithmisch. Also muss der lineare
Werte in die Tabelle und die spuckt dann den logarthmischen Wert zurück.
Sonst wird die Tabelle ja garnicht verwendet.
lg
Stas S. schrieb:> Den ersten Code hat mir hier einer aus dem Forum erstellt.> Hab gehofft das dieses Mal auch jemand mein Code editiert.
Dein Code ?
Und genau deswegen sollte man sowas nicht tun.
Du lernst nichts und wir müssen immer weiter damit machen 'unseren' Code
für Dich zu schreiben.
Stas S. schrieb:> Also ich bin auch gern lernfähig müsst mir nur sagen, wo ich das finde,> was ich brauch.
Du hast jetzt viele Schubser in die richtige Richtung bekommen.
Versuch doch wenigstens mal zu verstehen was da jede Zeile macht und
warum manches geht und manches nicht.
Mehr Engagement !
MCU Datenblatt lesen, C Syntax lernen.
Stas S. schrieb:> Ist einfach zu kompliziert für mich
Dann mußt Du das sein lassen