Forum: Mikrocontroller und Digitale Elektronik Variable PWM-Ausgabe auf ATtiny


von Squeezer (Gast)


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!

von Stone (Gast)


Lesenswert?

Schau mal nach ctc Modul.  Damit kannst am besten variable Frequenzen 
erzeugen, und  Beim Überlauf des Timers eine neuen Wert setzten.

Gruß Matthias

von Boris O. (bohnsorg) Benutzerseite


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

Vielleicht sagst du erst mal um welchen Frequenzbereich und um welchen 
ATTIny
es hier geht.

MfG Spess

von Dietrich L. (dietrichl)


Lesenswert?

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

von Squeezer (Gast)


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.

von wendelsberg (Gast)


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

von Rolf M. (rmagnus)


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.

von Squeezer (Gast)


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!

von spess53 (Gast)


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

von Squeezer (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

Erkläre einfach mal genau was du vor hast oder was das werden soll.

MfG Spess

von Squeezer (Gast)


Lesenswert?

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

von Rolf M. (rmagnus)


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?

von Squeezer (Gast)


Lesenswert?

Nein, das merkt er nicht, aber ich muss die Anzahl der Schritte 
mitzählen, um die aktuelle Position zu ermitteln.

von Sudo (Gast)


Lesenswert?

Das Zählen kannst du in der ISO machen und bei 10kHz seh ich da kein 
Problem.  10.000 Schritte pro Sekunde wird er eh nicht schaffen. ;)

von spess53 (Gast)


Lesenswert?

Hi

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

Gibt es schon von Atmel:

AppNote:   http://www.atmel.com/Images/doc8017.pdf
Software:  http://www.atmel.com/images/AVR446.zip

MfG Spess

von Squeezer (Gast)


Lesenswert?

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.

von spess53 (Gast)


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

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.