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!
Der schwierigste Teil ist das Studium der zu Grunde liegenden
Prinzipien, aber DDS gibt 'ne Menge Treffer hier im Forum, dem Netz und
den einschlägigen Online-Nachschlagewerken.
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 ...
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.
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
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.
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!
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
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).
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?
spess53 schrieb:> Gibt es schon von Atmel:
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.
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