Hallo zusammen, sorry für den etwas langen Betreff, wußte aber nicht,wie ich's besser umschreiben könnte. MeinProblem ist folgendes: Ich möchte bei einem ATTiny26 die beiden PWM Ausgänge nutzen. Das zu erzeugende Signal soll eine Periodendauer von 20ms haben und von 0,8ms bis 2,2ms high Pegel liefern. Ich wollte nun mit möglichst hoher Präzision (Auflösung ca. 0,02ms) die Pulsdauer variieren. Bisher habe ich das Problem, dass die integrierten Timer nur 8bitter sind, ich also bei 20ms Gesamtlänge eine Auflösung von bestenfalls ~0,08ms erreichen kann. Gibt es eine Möglichkeit, die Hardware PWM etwas aufzubohren oder hilft da nur die Lösung per Software? Frohes Fest Thomas
Und was soll nach den 20 ms passieren? Das von Dir beschriebene Signal ist ja nicht periodisch... H ------------- | | | | | | | | L ---0,8 2,2----------------------------------------------------20 ...und dann? Wenn das selbe Signal dann direkt wiederholt werden soll, dann kannst Du den H-Impuls auch nach links bis auf Null schieben... H ------------- | | | | | | | | L 0 1,4--------------------------------------------------------20 ...weil da sonst eh keine Flanke ist und einfach einen 1,4 ms langen Impuls erzeugen. Das ganze dann nach 20 ms wiederholen. Aber ich vermute mal, Du willst was anderes...
Upps, da hats die Zeilen umgebrochen... Sollte eigentlich so aussehen: H ------------- | | | | | | | | L ---0,8 2,2---------------------------------------------20 bzw. H ------------- | | | | | | | | L 0 1,4-------------------------------------------------20
Das gewünschte Timing stinkt schon sehr verdächtig nach einem Servo-Timing :-) Durchsuche mal das Forum. Servo Ansteuerungen sind ein Dauerbrenner.
> Ich möchte bei einem ATTiny26 die beiden PWM Ausgänge nutzen.
ist damit gemeint
A. Ausgang OC1A und OC1A\
B. Ausgang OC1A,OC1A\,OC1B,OC1B\
Im Fall A hätte man ja einen Timer übrig.
Lässt sich eigentlich der Ausgang Timer1 als externer Takt Timer0
zuführen?
>Und was soll nach den 20 ms passieren? Das von Dir beschriebene Signal >ist ja nicht periodisch... Er will eine PWM mit folgenden Eigenschaften: ● Alle 20 ms soll der Pegel für eine kurze Zeit t auf High gehen --> Periodendauer = 20 ms ● t ist variabel und soll Werte zwischen 0.8 ms und 2.2 ms annehmen können --> 0.8 ms <= Pulsdauer <= 2.2 ms ● die Wahl von t soll in Schritten von 0.02 ms erfolgen können --> Pulsdauer-Auflösung = 0.02 ms Wegen der 8-Bittigkeit der Hardware-Timer wird er um eine Software-Lösung wohl nicht herumkommen. Aber da ein mit 8 MHz getakteter AVR während 0.02 ms immerhin noch ca. 100 Instruktionen abarbeiten kann, sollte das machbar sein. Zeitverschwendender Code ist da (= im Interrupthandler) dann allerdings fehl am Platz.
Vegiß die PMW, nimm die set or clear Pin on compare Funktion. Alles, was über 256 ist, zählst Du dann im Interrupt runter, bis dann der Pin im nächsten Compare gesetzt werden darf. Etwas tricky wirds, wenn das Compare knapp nach dem vorherigen Interrupt kommen soll, da muß man dann schon vorher den Comparewert verkürzen, so daß noch Zeit für den Interrupthandler übrig bleibt, um die Pinrichtung fürs nächste Compare umzusschalten. Z.B. 257 = 256 + 1 wäre zu knapp, also dann einfach auf 129 + 128 aufteilen. Peter
Hallo zusammen, danke erstmal für die zahlreichen Antworten. Die Fragestellung war wohl ein bischen konfus. So wie's der AVRFan erkannt hat stimmt's. Und ja, das Signal ist im Prinzip genau wie das für Servos, soll aber einem anderen Zweck dienen. Naja, und so wie's aussieht werde ich dann wohl doch ein paar Zeilen Code mehr schreiben. Euch allen ein frohes Fest Thomas
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.