Was möchtest Du mir konkret sagen?
Ihm möchte dich darauf hinweisen, dass deine heiß geliebten 5ms noch in Stücke gehakt werden wollen.
Bei einer 8Bit PWM in 255 Stücke.
Bei einer 10Bit PWM in 1023 Stücke.
Und das bitte möglichst exakt.
Was möchtest Du mir konkret sagen?
Ihm möchte dich darauf hinweisen, dass deine heiß geliebten 5ms noch in Stücke gehakt werden wollen.
Bei einer 8Bit PWM in 255 Stücke.
Bei einer 10Bit PWM in 1023 Stücke.
Und das bitte möglichst exakt.
combie:
Ihm möchte dich darauf hinweisen, dass deine heiß geliebten 5ms noch in Stücke gehakt werden wollen.
Bei einer 8Bit PWM in 255 Stücke.
Bei einer 10Bit PWM in 1023 Stücke.
Und das bitte möglichst exakt.
Genau, was Combie sagt! Zu Beginn deiner 5ms dauernden Periode schaltest du High und je nach Auflösung musst du dann alle x Mikrosekunden checken, ob die vergangene Zeit schon ausreicht um das gewünschte Tastverhältnis zu erreichen, denn dann muss ausgeschaltet werden. Nach 5ms wird dann schon wieder für die nächste Periode eingeschaltet.
Mahimus:
Genau, was Combie sagt! Zu Beginn deiner 5ms dauernden Periode schaltest du High und je nach Auflösung musst du dann alle x Mikrosekunden checken, ob die vergangene Zeit schon ausreicht um das gewünschte Tastverhältnis zu erreichen, denn dann muss ausgeschaltet werden. Nach 5ms wird dann schon wieder für die nächste Periode eingeschaltet.
Bei 180 Hz PWM mit 8 Bit Auflösung beträgt die Dauer eines 1-zu-255-Pulses gut 20 Mikrosekunden.
Ein loop()-Durchlauf sollte also nicht länger als gut 20 µs sein. Um das zu erreichen muss man kein Magier sein.
Gruß
Gregor
gregorss:
Ein loop()-Durchlauf sollte also nicht länger als gut 20 µs sein.
Jetzt sind wir uns einig.
Warum sollte man die Grenzen der Software ausloten, wenn man nachher für höhere Ansprüche sowieso die eingebaute Hardware nutzen muß?
Einen loop in 20uS? Sportlich, sportlich. Dann darf er aber sonst nix machen. Das im loop ohne irq zu machen, geht nicht mal testweise richtig.
gregorss:
Ein loop()-Durchlauf sollte also nicht länger als gut 20 µs sein. Um das zu erreichen muss man kein Magier sein.
Das wage ich auch mal zu bezweifeln. Oder soll der Sketch sonst nichts wesentliches machen? Und wie hoch sind die Anforderungen an die Exaktheit der PWM-Impulse? Da spuckt ab und zu ja schon der millis-IRQ rein.
Meine Rede. Ich glaube, da hat sich jemand um Faktor 1000 vertan.
Ups, tatsächlich. 20 µs sind arg kurz. Da fehlt 'ne (i.W.: eine) Null.
Aber 5000 loop()-Durchläufe pro Sekunde sind nun wirklich kein Hexenwerk. Mein aktuelles Gebastel, das immerhin eine 7x7-LED-Matrix ansteuert und div. Muster mit 32 Helligkeitsstufen produziert, kommt immerhin auf knapp 2000.
Gruß
Gregor
PS: Mein simpler 35 Bit-Zähler zählt mit knapp 19 kHz
gregorss:
Aber 5000 loop()-Durchläufe pro Sekunde sind nun wirklich kein Hexenwerk.
Na ja, hängt davon ab, was der Arduino machen soll. Und die hier geforderte PWM (180Hz bei 255 Schritten Auflösung ) bekommst Du dann definitiv nicht mehr hin.
MicroBahner:
Na ja, hängt davon ab, was der Arduino machen soll. Und die hier geforderte PWM (180Hz bei 255 Schritten Auflösung ) bekommst Du dann definitiv nicht mehr hin.
Das stimmt. Wobei ich nicht sehe, wo der OP die 8 Bit Auflösung fordert.
Gruß
Gregor
Hallo,
wie kommt ihr vom Timer auf ein loop-Zeitproblem? :o
Die Arduino PWM Pins sind die hardwaremäßigen Timerpins. Timer entsprechend konfigurieren, fertig. Loop ist vollkommen egal.
Doc_Arduino:
wie kommt ihr vom Timer auf ein loop-Zeitproblem? :o
Durch meinen Vorschlag, die PWM sozusagen „zu Fuß“ zu erzeugen (s. #14).
Gruß
Gregor
Okay, geht halt nur wenn die loop ansonsten wenig zu tun hat. Mit 4x digitalWrite o.ä. ist es schon vorbei.
Hier würden sich Combies Pintools anbieten.