Variable PWM-Ausgabe auf ATtiny

Gast #4234734
Lesenswert?

Hi,

wie ich Frequenzen mit einem ATTiny ausgebe, habe ich in der Doku 
gesehen. Allerdings will ich jetzt keine stabile Frequenz abgeben, 
sondern diese variabel gestalten, also dass diese nach jeder Periode um 
einen gewissen Betrag größer oder kleiner wird.

Jedes mal die Register neu programmieren klappt nicht, das ist zu 
langsam. Deswegen meine Frage: kann man das auch den ATTiny machen 
lassen, also dass dieser selbsttätig die PWM-Parameter (linear) so 
ändert, dass sich die Frequenz entsprechend ändert?

Ach ja, alles ist 50% Duty Cycle, kleine Abweichungen im 
Puls-Pause-Verhältnis wären auch kein Problem.

Danke!
Gast #4235026
Lesenswert?

spess53 schrieb:
> Vielleicht sagst du erst mal um welchen Frequenzbereich und um welchen
> ATTIny es hier geht.

Es ist ein ATTiny85 und die höchste zu erreichende Frequenz sollte bei 
mindestens 10 kHz liegen, gerne auch mehr. Weniger als 5 Hz am unteren 
Ende sind nicht nötig.
Gast #4235042
Lesenswert?

1. die Kombination aus "höchste zu erreichende Frequenz" und 
"mindestens" ist nicht sinnvoll.

2. Im Datenblatt steht ganz sicher, mit welchem Takt der/die Timer 
versorgt werden koennen. Wenn Du dann den Timer auf 1 stellst und 
jeweils einen Ausgangspin umschalten laesst, sollte 0,5*Takt als 
hoechste Frequenz herauskommen.

wendelsberg
#4235048
Lesenswert?

Dietrich L. schrieb:
> Squeezer schrieb:
>> Ach ja, alles ist 50% Duty Cycle, kleine Abweichungen im
>> Puls-Pause-Verhältnis wären auch kein Problem.
>
> Dann solltest du das nicht PWM nennen und die Leser verunsichern ...

Wollte ich auch schon sagen. Er will offenbar die Frequenz ändern, aber 
nicht das Tastverhältnis. Genau das Gegenteil von dem, was man mit einer 
PWM normalerweise macht.

wendelsberg schrieb:
> 1. die Kombination aus "höchste zu erreichende Frequenz" und
> "mindestens" ist nicht sinnvoll.

Warum nicht?

> 2. Im Datenblatt steht ganz sicher, mit welchem Takt der/die Timer
> versorgt werden koennen. Wenn Du dann den Timer auf 1 stellst und
> jeweils einen Ausgangspin umschalten laesst, sollte 0,5*Takt als
> hoechste Frequenz herauskommen.

Dann allerdings nur in extrem groben Schritten verstellbar.
Gast #4235059
Lesenswert?

wendelsberg schrieb:
> 1. die Kombination aus "höchste zu erreichende Frequenz" und
> "mindestens" ist nicht sinnvoll.

Was ist daran nicht sinnvoll? Es geht um einen darzustellenen 
Frequenzbereich, dessen oberes Ende (=höchste zu erreichende Frequenz) 
bei 10 kHz liegen soll (=mindestens), aber auch mehr sein darf 
(=mindestens).

Ich habe mir den CTC-Modus jetzt mal angesehen: 
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR#CTC_Clear_Timer_on_Compare_Match_.28Auto_Reload.29 
beschreibt fast genau was ich haben will, allerdings möchte ich das ohne 
Auto-Reload machen (um in der ISR den nächsten, anderen 
Couter-Schwellwert setzten zu können und erst dann den Timer wieder 
loslaufen zu lassen). Wie kann ich den Auto-Reload also abschalten? Oder 
läuft der Timer generell nicht weiter, so lange ich mich in der ISR 
befinde?

Danke!
Gast #4235072
Lesenswert?

Hi

>Es ist ein ATTiny85 und die höchste zu erreichende Frequenz sollte bei
>mindestens 10 kHz liegen, gerne auch mehr.

Der ATTiny hat eine integrierte PLL. Da kann der Timer1 mit 64 MHz 
laufe. Das ergibt ein maximale Frequenz bei CTC von 32MHz.

Reicht das?

> allerdings möchte ich das ohne
>Auto-Reload machen (um in der ISR den nächsten, anderen
>Couter-Schwellwert setzten zu können und erst dann den Timer wieder
>loslaufen zu lassen). Wie kann ich den Auto-Reload also abschalten? Oder
>läuft der Timer generell nicht weiter, so lange ich mich in der ISR
>befinde?

Der Timer läuft weiter. Aber wo ist das Problem?

MfG spess
Gast #4235082
Lesenswert?

spess53 schrieb:
> Der Timer läuft weiter. Aber wo ist das Problem?

Es ist ein Rechenzeitproblem: sollte bei höheren Frequenzen der Code in 
der ISR aus irgend welchen Gründen nicht rechtzeitig den neuen 
Timer-Compare-Wert berechnen können, so ist es besser, wenn der nächste 
Takt etwas verzögert beginnt als wenn der letzte Takt noch mal 
wiederholt werden würde (was ja theoretisch passieren könnte, wenn der 
Timer sofort weiterläuft).

Außerdem stellt sich mir die Frage: was passiert, wenn der Timer 
weiterläuft, wieder den Timer-Compare-Wert erreicht aber der Code die 
ISR vom vorherigen Takt noch nicht verlassen hat?

(Ja ich weiß dass ISR-Code so kurz wie möglich sein soll, ich würde es 
halt nur gerne wissen).
#4235141
Lesenswert?

Squeezer schrieb:
> Das ist schnell erklärt: ich will einen Schrittmotor ansteuern
> (Step/Direction-Signale mit Anfahr- und Abbremsrampen).

Und du denkst, daß es da zwingend erforderlich ist, daß die Frequenz 
nach jedem einzelnen Step neu berechnet wird?
Glaubst du ernsthaft, daß dein Schrittmotor es merken wird, ob du seine 
Geschwindigkeit 10.000 mal pro Sekunde änderst oder "nur" 1.000 mal pro 
Sekunde?
Gast #4235332
Lesenswert?

Hi

>Hm, ich weiß nicht, was diese Impementierung genau macht, aber die
>verwendet 4 Ausgangsleitungen - mit einer Step/Direction-Steuerung hat
>das scheinbar nix zu tun.

Das hat nur mit der Schrittmorsteuerung zu tun. Die befindet sich in den 
Dateien sm_driver.c/h. Die eigentlich Berechnung der Rampen findet in 
speed_ctl.c/h statt.

Also einfach die Schrittmotorsteuerung ändern und fertig ist die Laube.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren