Forum: Mikrocontroller und Digitale Elektronik Timer, Interrupt, PWM mit ATTiny15


von Markus Remy (Gast)


Lesenswert?

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?

von johnny.m (Gast)


Lesenswert?

> ...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...

von Hannes L. (hannes)


Lesenswert?

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.

...

von Michael U. (Gast)


Lesenswert?

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

von Markus Remy (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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/

...

von Markus Remy (Gast)


Lesenswert?

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?

von Hannes L. (hannes)


Lesenswert?

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