PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mega 16 - unterschiedliche Frequenzen ausgeben



Omnikron
20.08.2004, 08:07
Hallo

Bin mit den AVRs noch nicht ganz so vertraut. hatte bis jetzt immer mit der ccontrol gearbeitet und möchte nun auf die avrs umsteigen. Nun suche ich eine Möglichkeit gleichzeitug unterschideliche Frequenzen auszugeben. Also so was wie an pin1 100hz, pin2 150hz, pin3 80hz.

Gibt es da eine Möglichkeit? Benutze einen Mega 16 und benötige 2 bwz. 4 unterschiedliche Frequenzen.

mfg
Omnikron

x-ryder
20.08.2004, 10:19
Hi

Was benutzt du als Compiler?

Martin

Pathfinder
20.08.2004, 12:32
Eine gute Frage, würde mich auch mal interessieren.

x-ryder
20.08.2004, 12:39
Ich hasse Leute die Beiträge schinden wollen................ [-(

20.08.2004, 13:35
Ich hase 16 jährige AVR-RISC-SUPPORTER, die dumme Kommentare von sich geben ...

@Omnikron
Für dein Problem fallen mir zwei Möglichkeiten ein:
- du nutzt die PWM des ATMegas
- du emulierst eine PWM über das Toggeln eines Pins (das Timing erfolgt durch Timer-Interrupts)

Gruss, Alex

Freiheitspirat
20.08.2004, 13:43
Du nutzt einen Timer, der nach einer besimmten Zeit ein Interrupt auslöst.
(In Bascom siehe Hilfe für CONFIG TIMER)
Die Zeit sollte der kleinste gemeinsame Nenner Deiner Takte sein.
In der Interruptbehandlung zählst Du für jeden Ausgang einen Zähler hoch, bis er den Multiplikator des Nenners erreich, schaltest den Ausgang und beginnst die entsprechende Zählung von vorne.
In Deinem Beispiel:
Gundfrequenz 6000HZ
Zähler für 80HZ = 75
Zähler für 100HZ = 60
Zähler für 150HZ = 40

Omnikron
23.08.2004, 06:33
Habe mir auch schon überlegt die pwm-Ausgänge zu nutzten. Aber ist das bei denen nicht so, dass die eigentliche Frequenz gleich bleibt und ich ledilich die pulswiete innerhalb eines vorgegebenen Bereiches ändern kann?
Brauche die unterschiedlichen Frequenzen um Schrittmotoren gleichzeitig mit unterschiedlichen Geschwindigkeiten zu fahren. Weiß nicht, wie die sich verhalten wenn ich dort eine PWM-Signal draufgebe.

Könnt ihr mir das mit den Timer Interrupts genauer erklären, dass hört sich ganz brauchbar an. Ist der Zählgeschwindigkeit des Timers nicht abängig vom Quarz?

Ich weiß noch nicht welchen Compiler ich benutzten werde, denke aber das ich es zu Beginn einmal mit Bascom probiere. Assembler ist mir für den Anfang zu aufwendig.

23.08.2004, 07:26
Bei den Vorkenntnissen empfehle ich ein Studium des Datenblattes und für den Anfang lediglich das Dimmen von LEDs. Wie du nen Stepper mit PWM ansteuern willst, ist mir ein Rätsel (oder willst du ihn im Mikroschritt-Betrieb betreiben?) ...

Gruss, Alex

Omnikron
23.08.2004, 17:52
Ich habe eine L297 Schaltung für Stepper. Die benötigen ja ein Taktsignal pro Schritt. Wenn ich die Frequenz des Taktsignals ändern kann bestimme ich gleichzeitig damit die Winkelfrequenz des Steppers. Da ich zwei Stepper mit unterschiedlichen Winkelfrequenzen benötige muss der Controller unterschiedliche Frequenzen ausgeben können. Und wie ich das am effektivsten umsetzte wollte ich mit diesem Thread in Erfahrung bringen.

mfg Omnikron

24.08.2004, 07:29
Alles klar. Deinen obigen Angaben zu folge musst du also 2 verschiedene Frequenzen ausgeben (2 Stepper?).
Halten würde ich mich an deiner Stelle an die empfohlene Methodik von "Freiheitspirat", die deine gesuchten Frequenzen aus Sicht des MC ziemlich niedrig sind. Falls du Fragen zur Timerinitialisierung oder den ISR's hast, in C (avrgcc) könnte ich dir helfen.

Gruss, Alex

Omnikron
27.08.2004, 20:25
Also ich hab jetzt den Mega 16 mit 16MHz externem Takt. Hab es auch schon geschafft niedriege "Frequenzen" auszugeben mit der wohl simpelsten Methode:

do
port = 1
waitx
port = 0
waitx
loop

nun möchte ich die Frequenz, also den Takt, mit dem Timer präzieser manipuliere.
Kann mir vielleicht jemand erklären wie so ein Code aussehen könnte?
Um hilfe wäre ich dankbar

Gruß Omnikron

recycle
27.08.2004, 20:45
nun möchte ich die Frequenz, also den Takt, mit dem Timer präzieser manipuliere.
Kann mir vielleicht jemand erklären wie so ein Code aussehen könnte?


Da gibt es vermutlich mehrere Möglichkeiten.

Guck einfach mal in der Bascom Hilfe nach. Da findest du Beispielcode für das erzeugen einer Frequenz mit Hilfe eines Timers.

Im Prinzip musst du einen Timer starten und eine Routine für den Timer-Überlauf definieren.
Immer wenn der Timer überläuft ruft er dann automatisch die Überlauf-Routine auf. In welchen Abständen der Timer Überläuft kannst du in Grenzen über den "Prescale"-Faktor steuern.
Wenn du dann in der Überlauf-Routine deinen Pin toggelst (z.B. toggle Portd.1) kannst du schon einige Frequenzen erzeugen.
Wenn du ganz bestimmte Frequenzen erzeugen willst, brauchst du natürlich noch etwas mehr mehr Programmcode,