Forum: Mikrocontroller und Digitale Elektronik Variablen Puls mit Timer generieren


von Benjamin Ihrig (Gast)


Lesenswert?

Hallo zusammen,

ich bin ziemlich neu in der Programmierung von Mikrocontrollern und bin 
in folgender Fragestellung leider nicht fündig geworden.

Ich arbeite mit einem ATTINY 2313.

Ich muss Impulse an einen Ausgang (PD2) legen. Deren Geschwindigkeit ist 
abhängig vom Wert einer Variablen (8bit, also 0-255). Der Abstand 
zwischen den Pulsen soll von 2s (Wert 1) bis 20ms (Wert 255) gehen (also 
0,5Hz bis 50Hz). Beim Wert 0 sollen keine Pulse erzeugt werden. Beim 
hochfahren des Wertes soll sich die Frequenz möglichst linear dazu 
steigern.

Ich betreibe den ATTINY mit einem 16Mhz Quarz. Die Pulse sollen in 
TIMER1 generiert werden.

Kann mir jemand helfen, oder einen Tipp geben? Falls ihr weitere Infos 
benötigt, einfach Fragen.

Danke im Voraus!
Benjamin

von Karl H. (kbuchegg)


Lesenswert?

Benjamin Ihrig schrieb:

> Der Abstand
> zwischen den Pulsen soll von 2s (Wert 1) bis 20ms (Wert 255) gehen (also
> 0,5Hz bis 50Hz).

Mit welchen Abstufungen? Wie lange sollen die Pulse sein?

> Beim Wert 0 sollen keine Pulse erzeugt werden. Beim
> hochfahren des Wertes soll sich die Frequenz möglichst linear dazu
> steigern.
>
> Ich betreibe den ATTINY mit einem 16Mhz Quarz. Die Pulse sollen in
> TIMER1 generiert werden.

Ist doch schon ein Ansatz.

Sieh dir zb mal die kurze Abhandlung über Timer hier an
FAQ: Timer
und wie man zb eine PWM da einsetzen könnte. Die PWM wird ein bischen 
zweckentfremdet, indem sie immer einen 50% Dutycycle generiert und dafür 
wird dann der TOP Wert geändert um die Wiederholfrequenz zu variieren.

Und dann musst du eben mal ein bischen rechnen, ob du damit die 2s bei 
16Mhz noch hinkriegst.
Wenn nicht, dann muss man den Pin eben "händisch" schalten. Ist auch 
kein Beinbruch, vor allen Dingen dann nicht, wenn der Tiny sonst nicht 
viel zu tun hat.

: Bearbeitet durch User
von Benjamin Ihrig (Gast)


Lesenswert?

Danke für die Antwort, die FAQs sind echt informativ. Die zwei Sekunden 
bekomme ich aber mit PWM nicht hin. Bei 16Mhz Takt und einem Prescaler 
von 1024 bin ich immernoch bei 15625 Ausführungen pro Sekunde.

Wie würde ich das ganze am besten angehen, wenn ich es händisch lösen 
wollte?

von m.n. (Gast)


Lesenswert?

Benjamin Ihrig schrieb:
> Kann mir jemand helfen, oder einen Tipp geben?

PD2 ist ein etwas ungünstiger Ausgang; aber gehen würde es auch damit.
Ohne Dir jetzt irgendwelche Hausaufgaben zu lösen, ein Link auf eine 
Anzahl verschiedener Impuls-/Frequenzgeneratoren mit AVRs.
http://www.mino-elektronik.de/Generator/takte_impulse.htm

Wenn Du die Funktion/Programme nachvollziehen kannst, sollte Dir eine 
eigene Lösung nicht mehr schwer fallen.

von Karl H. (kbuchegg)


Lesenswert?

Benjamin Ihrig schrieb:
> Danke für die Antwort, die FAQs sind echt informativ. Die zwei Sekunden
> bekomme ich aber mit PWM nicht hin. Bei 16Mhz Takt und einem Prescaler
> von 1024 bin ich immernoch bei 15625 Ausführungen pro Sekunde.

falsch gerechnet.

Welchen Top Wert brauchst du, damit bei einer Frequenz von 16Mhz und 
einem Vorteiler von 1024 damit ein PWM Zyklus 2s (also 2000ms) dauert?

2000 * 16000 / 1024 = 31250

31250 ist in Reichweite eines 16 Bit Wertes. Wenn du also einen PWM 
Modus nimmst, bei dem du den Top Wert vorgeben kannst, zb Modus 14, dann 
stellst du das ICR1 Register auf 31250 und du kriegst bei 16Mhz und 
einem Vorteiler von 1024 genau 2 PWM Zyklen in der Sekunde. Jeder PWM 
Zyklus ist eine komplette SChwingung, ergo ergeben sich 2Hz am Pin.

Da du allerdings den PWM Pin nicht frei hast, sondern am Pin PD2 
rausgehen willst, kann der Timer das nicht selber regeln, sondern du 
musst dich an die Interrupts halten, und in der ISR den Pin selbst 
umschalten.

Tja. Und der Rest ist jetzt nur noch eine Herleitung der Formel, wie du 
den Stellbereich von 0 bis 255 auf den Zeitbereich von 20 bis 2000 
abbildest und das wiederrum weiter zu einem TOP (Register ICR1) Wert 
umrechnest. Den setzt du und wenn alles richtig ist, dann toggelt der 
Pin in den gewünschten Zeiten. D.h. plus minus ein kleiner Fehler, weil 
sich die Umrechnungen nicht in ganzzahligen Vielfachen ausgehen.
Bei den kleineren Zeiten kann es auch sinnvoll sein, einen kleineren 
Vorteiler zu nehmen, weil du ja deine Zeitabstufung nur in Schritten 
dieses Vorteilers möglich ist. Das kann man aber zb in Excel alles mal 
mit verschiedenen Vorteilern durchspielen und dort ablesen, ab welchen 
Zeiten (und damit ab welchen Stellwerten) ein kleinerer Vorteiler 
möglich ist. Generell willst du immer den kleinsten Vorteiler nehmen, 
der geht. Ein Vorteiler ist dann geeignet, wenn du damit einen TOP Wert 
erhältst, der kleiner als 65536 ist.

: Bearbeitet durch User
von Benjamin Ihrig (Gast)


Lesenswert?

Karl Heinz schrieb:
> Welchen Top Wert brauchst du, damit bei einer Frequenz von 16Mhz und
> einem Vorteiler von 1024 damit ein PWM Zyklus 2s (also 2000ms) dauert?
>
> 2000 * 16000 / 1024 = 31250

Ich glaube ich habe Verstanden wie es gemeint ist, aber wäre die Formel 
mit 16MHz nicht folgende?

2000ms * 16000000Hz / 1024 = 31250000

Das wäre dann bei 16bit schon wieder ein Problem. Muss ich dann einen 
zusätzlichen Zähler laufen lassen?

von Benjamin Ihrig (Gast)


Lesenswert?

Benjamin Ihrig schrieb:
> Ich glaube ich habe Verstanden wie es gemeint ist, aber wäre die Formel
> mit 16MHz nicht folgende?
>
> 2000ms * 16000000Hz / 1024 = 31250000
>
> Das wäre dann bei 16bit schon wieder ein Problem. Muss ich dann einen
> zusätzlichen Zähler laufen lassen?

Nein, mein Fehler! Sorry!

von Peter D. (peda)


Lesenswert?

Benjamin Ihrig schrieb:
> 2000ms * 16000000Hz / 1024 = 31250000

Formel richtig, Ergebnis falsch.
Tipps mal in den Taschenrechner ein.

von Karl H. (kbuchegg)


Lesenswert?

Peter Dannegger schrieb:
> Benjamin Ihrig schrieb:
>> 2000ms * 16000000Hz / 1024 = 31250000
>
> Formel richtig, Ergebnis falsch.
> Tipps mal in den Taschenrechner ein.

Fast. Auf die Einheiten kommts an.

von Thomas E. (thomase)


Lesenswert?

Karl Heinz schrieb:
> zb Modus 14, dann
> stellst du das ICR1 Register auf 31250 und du kriegst bei 16Mhz und
> einem Vorteiler von 1024 genau 2 PWM Zyklen in der Sekunde.

Ich will ja nicht pedantisch sein.
Aber damit erhält man nur ungefähr 2 Zyklen pro Sekunde.

mfg.

von Karl H. (kbuchegg)


Lesenswert?

Thomas Eckmann schrieb:
> Karl Heinz schrieb:
>> zb Modus 14, dann
>> stellst du das ICR1 Register auf 31250 und du kriegst bei 16Mhz und
>> einem Vorteiler von 1024 genau 2 PWM Zyklen in der Sekunde.
>
> Ich will ja nicht pedantisch sein.
> Aber damit erhält man nur ungefähr 2 Zyklen pro Sekunde.

:-)
Ich hatte beim Überlegen was ich schreiben will noch daran gedacht, und 
es dann doch wieder verschwitzt.
Danke für die Ermahnung.
Natürlich muss das ICR1 mit 31249 geladen werden, wenn der Timer von 0 
beginnend 31250 Zyklen abzählen soll.

: Bearbeitet durch User
von Amateur (Gast)


Lesenswert?

Wenn Du nicht unbedingt mit 150 km/h vor den Baum fahren musst 
(Rechenleistung), fahr doch einfach ein bisschen langsamer.
Mit einem 8MHz Quatsch geht’s gemütlicher und die minimale Zeit geht 
runter.

Ist Dir das immer noch zu "schnell": Angeblich soll es Quarze mit noch 
geringerer Frequenz geben.

Übrigens: Die Sache mit dem linearen Zusammenhang zwischen Zählerwerten 
und Zeiten kannst Du Dir ruhig abschminken.

von Karl H. (kbuchegg)


Lesenswert?

Amateur schrieb:

> Übrigens: Die Sache mit dem linearen Zusammenhang zwischen Zählerwerten
> und Zeiten kannst Du Dir ruhig abschminken.

Linear kann er es schon machen. Nur gibt es Quantisierungsfehler weil 
1800 und 256 leider keinen gemeinsamen ganzzahligen Teiler haben. Kommt 
drauf an, wofür er es braucht, ob das relevant ist oder nicht.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Benjamin Ihrig schrieb:
> Beim
> hochfahren des Wertes soll sich die Frequenz möglichst linear dazu
> steigern.

Das ergibt dann eine Schrittweite von 0,195Hz.

von Benjamin Ihrig (Gast)


Lesenswert?

So, ich habe es geschaft, mit CTC-Modus und einem Prescaler von 1024. 
Danke an alle die geholfen und Tipps gegeben haben!

Gruß,
Benjamin

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.