Hi. Haben folgendes vor: Von einer SPS kommt eine Art "PWM-Signal". Jedoch mit einer länge von 2 Sek. Wir wollen daraus ein Analog-Signal machen. Wollten das so machen, dass wir während das Signal von der SPS HIGH ist einen Timer laufen lassen. Aus diesem Wert dann den Wert ableiten der das PWM im ATTiny setzt. Dann mit nem RC-Glied daraus das Analog-Signal machen. Da man beim 8-Bit Register ja nur bis 255 zählen kann währen also 2 Sekunden HIGH von der SPS der Wert 255. Beim Impuls-Pausen-Verhätnis 1:1 der Wert 127. Dazu wollten wir den Timer mit dem Prescaler etwas runtertakten und innerhalb der HIGH Periode die Überläufe die der Timer/Zähler macht zählen um im Bereich von 0-255 zu bleiben. Das ganze am Besten über den INT0 Pin vom Tiny. Wäre sowas mit dem Prozessor möglich?
> ...mit einer länge von 2 Sek....
Was ist da zwei Sekunden lang? Die Periodendauer?
An sich ist das ganze kein großes Problem und dürfte mit dem Tiny15
machbar sein, wenn keine großen Anforderungen an die Ausflösung
gestellt werden. Der µC muss dann allerdings mit einer ziemlich
niedrigen Taktfrequenz laufen, damit das mit den 2 Sekunden hinhaut...
Die Tastgradmessung kann man auch mit Software-Timer machen. Man erzeugt mit Timer0 einen stabilen Takt, pollt in dessen ISR den Eingang und zählt die Takte bis zum Pegelwechsel. Aus der Anzahl der ISR-Takte pro Low-Phase und High-Phase kann der Tastgrad ermittelt werden. Aus der Summe von High-Dauer und Low-Dauer (= Periodendauer) kann der Timer-Reload dynamisch angepasst werden, so dass bei Tastgrad 50% (1:1) 128 angstrebt wird, die ganze Periode also möglichst 256 ISR-Zyklen dauert. Man kann auch mit einem Vielfachen (Zweier-Potenz) von 256 arbeiten, dann durch Rechtsschieben herunterskalieren. Ein 16-Bit-Zähler dürfte sowiso erforderlich sein. Das ermittelte Ergebnis kann Timer1 dann im Fast-PWM-Mode ansteuern. Das geht gut, der Tiny15 kann aufgrund der PLL bis 150kHz PWM-Frequenz erzeugen, die lässt sich dann leicht filtern. Achtet aber darauf, dass der Tiny15 nur dann mit 1,6MHz taktet, wenn er sauber calibriert wurde. ...
Hallo,
>Der µC muss dann allerdings mit einer ziemlich
niedrigen Taktfrequenz laufen, damit das mit den 2 Sekunden hinhaut...
naja, seit Erfindung der Prozessorregister und der Zählschleife sollte
das kein Kriterium mehr sein. ;-)
10ms IRQ, Register in der ISR hochzählen, bei 200 Flag setzen und
Register löschen z.B.
Gruß aus Berlin
Michael
Ja. Ers mal Danke. Ich hatte so überlegt, ob man nicht den Interrupt (INT0) nicht dazu benutzen kann beim Flankenwechsel den Timer einfach zu stoppen. Dann hätte ich ja z.B. die Länge HIGH Periode vom der SPS. Diese hat eine Genauigkeit von 1%. Also furchtbar genau wirds eh nicht. Und der Tiny muss auch für unsere Zwecke keine anderen Aufgaben erledigen als diese.
Du wirst den Timrer nicht langsam genug bekommen, wenn deine Periodendauer im Sekundenbereich liegt. Deshalb der Hinweis auf Software-Timer, der mittels Interrupt des Timer0 synchronisiert wird. Durch die angesprochene Regelung der Abtastung auf 256 Zählschritte pro Periode des Empfangssignals werden auch Unterschiede in der Taktfrequenz des Tiny15 ausgeglichen. Einige Spielereien mit Tiny15 findest du auf: www.hanneslux.de/avr/ ...
Ja. deswegen wollte ich ja auch die Überläufe des Timers auswerten. Laut Datenblatt kann man den Prescaler unter anderem auf CLK/64 einstellen. dann hätte ich nen Takt von 1.6Mhz / 64 = 25kHz Dann nach 256 Takten ein Überlauf, sprich 25kHz/256 = 97 Überläufe pro Sek. Was wäre denn bei Software-Timern besser?
Der Tiny15 kann nicht in Hardware multiplizieren. Du möchtest den Tastgrad so, dass er ins Byte passt, also 0%=0, 50%=127, 100%=255 (256 passt ja nicht rein). Denn du möchtest den ermittelten Tastgrad ja in das Compare-Register des Timer1 schreiben um die schnelle PWM zu erzeugen. Wenn du nach deinem Muster arbeitest, dann erhätst du irgendwelche krummen Werte, die dazu noch vom augenblicklichen Takt des Tiny15 anhängig sind. Diese Werte musst du dann ja an die Periodendauer bei 255 skalieren, was ohne Hardware-Multiplikation zwar geht, aber eben nicht ganz so einfach. Es ist also sinnvoller, im Timer0-Interrupt die Interrupts (Timer-Überläufe) bis zum Flankenwechsel (und bis zum Periodenende!) zu zählen und anhand des Ergebnissres bis zum Periodenende den Timer-Reload (Zählumfangsbegrenzung des Timer0) so anzupassen, dass die Periode 255 Timer0-Überlauf-Interrupts dauert. Dann ist der Zählwert bis zum Impulsende (Flankenwechsel) auf 255 skaliert und kann direkt ins Timer1-Compareregister geschrieben werden um die schnelle PWM im Tastgrad einzustellen. Aber vermutlich meinen wir beide fast das Gleiche... ...
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.