Forum: Mikrocontroller und Digitale Elektronik Timingprobleme PWM


von hownottobeseen (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe hier schon seit längerem meinen Code für etwas genaueren und 
schnelleren PWM herumliegen.
Das Problem ist nur, dass er alles andere als genau ist...

Die Ursache dafür weiß ich - wenn zwei Helligkeitswerte nah beieinander 
sind, löst der Interrupt nicht rechtzeitig aus und es kommt zu einem 
größeren Verzug, was man sehr deutlich sieht.

Ich habe schon versucht, in die Interrupt-Verarbeitung eine Schleife 
einzubauen, die das Ganze abfangen soll, leider ohne Erfolg...


Könnt ihr mir Tipps geben, wie ich den PWM so hinbekomme, dass er 
halbwegs sauber läuft?
Wichtig ist mir, dass die relativ hohe Auflösung (die Seoul-LEDs sind 
wirklich bestialisch hell) und die hohe Frequenz (bin TFT-verwöhnt und 
dadurch flackerempfindlich geworden).

Viele Grüße

hownottobeseen

von Falk B. (falk)


Lesenswert?

@ hownottobeseen (Gast)

>Könnt ihr mir Tipps geben, wie ich den PWM so hinbekomme, dass er
>halbwegs sauber läuft?

Siehe Soft-PWM

>Wichtig ist mir, dass die relativ hohe Auflösung (die Seoul-LEDs sind
>wirklich bestialisch hell) und die hohe Frequenz (bin TFT-verwöhnt und
>dadurch flackerempfindlich geworden).

Jaja, es leben die E-Smog Sensitiven und Placebo Süchtigen . . . ;-)

MFG
Falk

von Jens (Gast)


Lesenswert?

Meine Fresse XD

Ich hock an nem 21 Zoller baujahr 98 1600*1200@75hz... hock dich da 
drann =)
mir gehts gut an dem ding =)))

von Jürgen (Gast)


Lesenswert?

Hallo Hownottobeseen,

du mußt die Timerwerte in CalcCnt so runden, daß sich die Interrupts
nicht zu nahe kommen.

Jürgen

von hownottobeseen (Gast)


Lesenswert?

Hi,

@Falk:

Den Soft-PWM-Artikel kannte ich, das "intelligente" Beispiel der Seite 
jedoch noch nicht. Problem bei dem Teil: Der Code im Interrupt ist zu 
groß, bei 16MHz CPU-Takt gehen gerade so 500Hz PWM-Frequenz bei 8 Bit 
Auflösung. Leider zu wenig.

@Jürgen:
Das mit dem Runden ist so ne Sache ;)
Ich weiß jetzt nicht auswendig, wie viele Zyklen der Code im Interrupt 
braucht, je nachdem dürfte die Rundungsungenauigkeit sehr hoch werden.
Kann man bei dem Code im Interrupt noch deutlich was an Performance 
rausreißen (evtl. auch in Richtung Assembler) oder ist da so ziemlich 
Ende Fahnenstange?


@Falk und Jens:

ja, "der Typ da hat Probleme"...
Klar, das Auge kann nur 20 Bilder/s verarbeiten, aber wenn man den Blick 
vorbeischweifen lässt, ist die erforderliche Wiederholfrequenz deutlich 
höher.
Meine Leuchte soll angenehm sein und da passt flackern einfach nicht 
dazu.

Übrigens sitze ich vor einem 21'' TFT mit 1600x1200, der die volle 
Farbtiefe nativ kann. Empfehle jedem mal, sich vor einen vernünftigen 
TFT zu sitzen, es lohnt sich ;)
Aber diesbezüglich EOD, die PWM-Frequenz und -Auflösung soll möglichst 
hoch sein, egal wie bescheuert das für so manchen klingen mag.


Viele Grüße

hownottobeseen

von Jürgen (Gast)


Lesenswert?

Viel Luft ist in deiner Interruptroutine nicht mehr.
Aber schau dir mal den Assemblercode an und schalte evtl. die 
Optimierung an.

Ich habe auf einem R8C mit 20MHz mal ca 15us Interrupt-Dauer gemessen,
das hat dann für 250 Helligkeitsstufen bei 200Hz PWM-Frequenz gereicht
(= 20us Raster).

Evtl. kann man bei niedriger Helligkeit mit Busy-Wait eine bessere 
Auflösung erreichen, dazu bin ich in dem Projekt aber nicht mehr 
gekommen.
(Nur bei niedriger Helligkeit fällt die grobe Abstufung auf.)

Jürgen

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
Noch kein Account? Hier anmelden.