Hallo,
ich versuche mich gerade an einer Software-PWM. Evtl wirds auch ne BCm,
das muss ich dann entscheiden wenn ich damit mehr Erfahrung hab :-)
Es sollen damit mehrere LEDs gedimmt werden. Später sollen dann
mindestens 2 RGB LEDs angesteuert werden.
Bevor ich anfange stellt sich mir die Frage, welche Frequenz ich
anstreben sollte, um kein Flackern zu haben bzw. schöne Farben zaubern
zu können.
Ich hätte gerne 10 Bit Auflösung, um dann über eine hinterlegte
logarithmische Tabelle das Ganze auf 8 Bit zu mappen.
Auserdem dachte ich erst an sportliche 200 Hz.
Laufen wird der Prozessor (ATmega32) später mit 8MHz.
Limitierend wirkt ja die Länge der ISR.
Deswegen werde ich 200Hz/10Bit wohl nicht schaffen, denn:
8000000 / (200*1024) = 39,0625.
So kurz werd ich die ISR nicht kriegen.
120 Hz würd ich momentan schaffen, da hätte meine ISR 65 Takte Zeit.
Hab nur Bedenken ob man da Flackern sieht. (Es soll ein Objekt
illuminiert werden was fest im Raum steht, d.h. die Personen die das
Objekt sehen sind in Bewegung, mit mehreren Metern Abstand).
Jetz überleg ich, soll ich mit der Auflösung runtergehen oder mit der
Frequenz?
Was meint ihr?
@ Lukas (Gast)
>ich versuche mich gerade an einer Software-PWM. Evtl wirds auch ne BCm,
Siehe Soft-PWM. Die hab ich letztes Jahr mit 20 MHz auf 24 Kanäle
und 10 Bit ausgereizt.
Beitrag "Re: DMX Steuerung 24 Kanal">anstreben sollte, um kein Flackern zu haben bzw. schöne Farben zaubern>zu können.
100 Hz sollten es schon sein und sind bei nicht bewegten LEDs meistens
ausreichend.
Den Artikel kenne ich.
Dort heißt es 10 Bit ermöglichen ein schönes weiche Fading. Deswegen
strebe ich diese auch an.
Allerdings:
>> relativ niedrigen PWM Frequenz von 100 Hz
Deswegen hatte ich bedenken wegen der Frequenz...
Ok, aber deine 24-Kanal PWM arbeitet auch mit 100 Hz. Dann glaub ich dir
mal dass des reicht.
wie schnell willst du die Helligkeit verändern?
bei 10bit Auflösung und 100Hz brauchst du 10s um den ganzen
Helligkeitsbereich zu durchfahren.
Wenn du die Helligkeit schneller änderst, musst du ein paar
Helligkeitsstufen überspringen, dann nützt dir die hohe Auflösung
nichts.
Dann wäre eine höhere Frequenz sinnvoller.
Welche Frequenz ausreichend ist, wird auch von verschiedenen Menschen
unterschiedlich empfunden.
Hallo Roland,
wie kommst du auf die 10s? Meine Vermutung 10Bit ~ 1000 Werte, 1000 *
1/100Hz = 10s. Richtig? Dann hätte ich jeden Wert einmal angefahren.
Nun, in meinem Projekt muss ich eher weniger die Farben wechseln. Meist
soll das Objekt einfach nur bunt leuchten. Evtl. bau ich aber ein paar
Wechsel als Gimmick ein. Aber das ist eben nicht primäres Ziel.
Sind dann also 10Bit @ 100Hz schon zuviel? Gäb ja auch noch die Option 9
Bit (wobei ich nicht glaube dass das 9. Bit den Aufwand rechtfertigt,
mit uint16_t Variablen arbeiten zu müssen. Soviele neue Werte mit
logarithmischen Verhältnis sind dadurch ja nicht gewonnen...)
@ Lukas (Gast)
>wie kommst du auf die 10s? Meine Vermutung 10Bit ~ 1000 Werte, 1000 *>1/100Hz = 10s. Richtig? Dann hätte ich jeden Wert einmal angefahren.
Wenn man eine nichtlineare Kennline nutzt, sind es deutlich weniger
Stufen. Eher so 128-256.
>Sind dann also 10Bit @ 100Hz schon zuviel?
Nein, passt schon.
Ok, dann werd ich des ganze mal angehen: 10Bit bei 100Hz, ATmega läuft
mit 8MHz.
Macht 78 Takte für die ISR, richtig?
Schau mer mal :-)
Was bisl doof ist: an dem Port sind bereits 2 Pins als GPIO vorgesehen.
D.h. ich kann nicht einfach meinen Wert auf den Port schreiben sondern
muss erstmal den Port einlesen, Maske setzen, mit dem neuen Wert
verodern und dann kann ich erst schreiben...
Geht das irgendwie möglichst resourcen(=takt)schonend?
So, ich nochmal...
Ich hab meine ISR jetzt soweit fertig.
Diese soll mir pro Aufruf einen vorher berechneten Wert auf einen Port
ausgeben. Wie in meinem vorherigen Post beschrieben wird aber zuerst
dieser Port eingelesen und maskiert, da auch "normale" Ausgänge an
diesem Port hängen.
Anschließend wird das Timerregister aktualisiert.
1
efc:1f92pushr1
2
efe:0f92pushr0
3
f00:0fb6inr0,0x3f;63
4
f02:0f92pushr0
5
f04:1124eorr1,r1
6
f06:0bb6inr0,0x3b;59
7
f08:0f92pushr0
8
f0a:2f93pushr18
9
f0c:8f93pushr24
10
f0e:9f93pushr25
11
f10:ef93pushr30
12
f12:ff93pushr31
13
f14:8bb1inr24,0x0b;11
14
f16:8370andir24,0x03;3
15
f18:90916504ldsr25,0x0465
16
f1c:e92fmovr30,r25
17
f1e:f0e0ldir31,0x00;0
18
f20:e35bsubir30,0xB3;179
19
f22:fb4fsbcir31,0xFB;251
20
f24:2081ldr18,Z
21
f26:8223andr24,r18
22
f28:8bb9out0x0b,r24;11
23
f2a:1092b200sts0x00B2,r1
24
f2e:8bb1inr24,0x0b;11
25
f30:880faddr24,r24
26
f32:8bb9out0x0b,r24;11
27
f34:892fmovr24,r25
28
f36:8f5fsubir24,0xFF;255
29
f38:8a30cpir24,0x0A;10
30
f3a:18f4brcc.+6;0xf42<__vector_9+0x46>
31
f3c:80936504sts0x0465,r24
32
f40:04c0rjmp.+8;0xf4a<__vector_9+0x4e>
33
f42:10926504sts0x0465,r1
34
f46:83ecldir24,0xC3;195
35
f48:8bb9out0x0b,r24;11
36
f4a:ff91popr31
37
f4c:ef91popr30
38
f4e:9f91popr25
39
f50:8f91popr24
40
f52:2f91popr18
41
f54:0f90popr0
42
f56:0bbeout0x3b,r0;59
43
f58:0f90popr0
44
f5a:0fbeout0x3f,r0;63
45
f5c:0f90popr0
46
f5e:1f90popr1
47
f60:1895reti
Ich bin nicht so der Assemblerexperte. Kann mir bitte noch jemand mit
drüber schauen?
Ich komme auf 74 Takte. Ist zwar knapp, sollte aber passen.
Habe 78 Takte zur Verfügung. Auser ich beachte grad irgendwas nicht, zB
Delays beim Einsprung in die ISR.
Kann mir bitte jemand da drüber schauen?
Timer Register aktualisieren klingt irgendwie mach normalem Timer mode.
Der Mega32 sollte genügend timer mit CTC mode haben - das spart schon
mal die Manipulation am Timer. Das ist bei kleinem Vorteiler ohnehin
problematisch.
Ein paar PWM Kanäle kann der µC auch in Hardware. Wenn die Auflösung mit
8 Bit nicht reicht, kann man ggf. hier den 8 Bit Wert in Software
Modulieren. Das ist immer noch schneller als echtes Software PWM.
Wie sieht denn der C Code aus.
Wenn man sich in ASM Anstrengt, kann man noch einiges mehr an
Geschwindigkeit raus holen. Irgendwo bei 15 Zyklen plus 5 oder 6 je LED
sollte das Limit liegen. Bei nur 6 Kanälen ggf. auch darunter.
Ein kleiner Trick, der auch in C noch gehen sollte, wäre es das unterste
Bit getrennt zu bearbeiten, und Anfangs ein Zeitfenster mit halber
Breite zu nutzen - das gibt mit relativ wenig zusätzlicher Laufzeit 1
Bit mehr an Auflösung.
Lukas schrieb:> Ich hätte gerne 10 Bit Auflösung, um dann über eine hinterlegte> logarithmische Tabelle das Ganze auf 8 Bit zu mappen.
Was meinst du damit?
DC schrieb:> Lukas schrieb:>> Ich hätte gerne 10 Bit Auflösung, um dann über eine hinterlegte>> logarithmische Tabelle das Ganze auf 8 Bit zu mappen.>> Was meinst du damit?
Kurz: Von meinen 1024 möglichen Werten pick ich mir 256 raus die
ungefähr im logarithmischen Verhältnis zueinander stehen (wobei 1024
Werte da eigentlich nicht reichen).
Dadurch kann die nicht-lineare Helligkeitswahrnehmung des Auges
ausgeglichen werden.
@ Falk: welchen Simulator? Imho gibt es momentan nur den von Atmel.
Das riecht dann nach Windows-VM mit Atmel-Studio aufsetzen :/
Oder gibts da Alternativen?
@ Lukas (Gast)
>@ Falk: welchen Simulator?AVR Studio.
> Imho gibt es momentan nur den von Atmel.>Das riecht dann nach Windows-VM mit Atmel-Studio aufsetzen :/
Na dann mal los, Herr Pinguin ;-)