Forum: Mikrocontroller und Digitale Elektronik Frequenzen Wobbel´n


von Mr-400-Volt (Gast)


Lesenswert?

Hallo, ich habe mir mit dem AD9835 einen DDS Funktionsgenerator gebaut, 
der auch soweit läuft. Ich wollte noch die Funktion des Wobbeln´s mit 
einfügen, weiss aber nicht so recht wie. Die eingabe der Start und 
Endfrequenz ist ja kein problem, aber wie schaffe ich es, das der MC 
kontinuirlich zwischen diesen Frequenzen hin und her wandert ?
Programmiert ist das ganze mit Bascom.

Bitte um hilfe !

Danke!!

von Karl H. (kbuchegg)


Lesenswert?

Timer aufsetzen, der in regelmässigen Zeitabständen
einen Interrupt auslöst. Im Interrupt die Vorgabefrequenz
um einen bestimmen Betrag erhöhen oder erniedrigen.

von Mr-400-Volt (Gast)


Lesenswert?

Kann ich die Zeitabstände im Programm ändern ?

von Karl H. (kbuchegg)


Lesenswert?

Ob du das kannst, weis ich nicht :-)
Prinzipiell kann man das, klar.

Ich empfehle mal einen Blick ins Handbuch bzw.
die online Hilfe zu werfen.

von Mr-400-Volt (Gast)


Lesenswert?

Wenn ich die Wobbelgeschw. in Hz angebe, wie berechne ich daraus die 
Timerwerte ?

von Karl H. (kbuchegg)


Lesenswert?

Dazu musst du erst mal sagen, in welchem Modus du den
Timer betreiben willst.
Wenn's nicht BASCOM wäre, hätte ich den CTC Modus des
Timer 1 vorgeschlagen (Timer zählt bis zu einem
vorgegebenem Wert, wenn Wert erricht: Timer auf 0 zurücksetzen
und Interrupt auslösen). Wie dieser Modus bei BASCOM heist
musst du schon selbst rausfinden.

Um auszurechnen wie weit der Timer zählen soll und welchen
Vorteiler:
Du hast die Wobbelfrequenz. In einem Wobbeldurchgang
muss die Freuenz einmal von langsam nach schnell und
wieder zurück verändert werden. In wievielen Stufen
gedenkst du das zu tun?
Wenn du das weist, kannst du dir ausrechnen, wieviel
Zeit von einer Freuenzänderung zur nächsten vergehen muss.
DIe Taktfrequenz deines µC kennst du. Du jetzt weist
in welchen Zeitabständen du einen Interrupt brauchst
kannst du über die Prozessorfreuenz (und einem ev. Vorteiler)
ausrechnen wie weit der Zähler zählen muss. Diesen Wert
als Endwert für den CTC Modus vorgeben und fertig.

Keine Angst: Die notwendigen Berechnungen gehen über
die 4 Grundrechnungsarten nicht hinaus. Mit ein
bischen nachdenken folgt eins völlig logisch aus dem
anderen. Man muss nur ein bischen nachdenken was man
da eigentlich tut und was man erreichen möchte.

von Mr-400-Volt (Gast)


Lesenswert?

Im angehangenen Testprogramm zählt er zwar hoch, aber nicht runter ????
Warum ??? Ist nicht leicht mit den Timern....


$regfile = "m8def.dat"
$crystal = 7372800

Dim Fstart As Long , Fende As Long , F1 As Long
Dim I As Byte , Z As Byte

Cls

Fstart = 1000
Fende = 2000
I = 0
Z = 10


Config Timer1 = Timer , Prescale = 64
On Timer1 Timer_irq
Const Timervorgabe = 54016

Enable Timer1
Enable Interrupts


Do
Upperline
Lcd "F=" ; F1
Loop

Timer_irq:
  Timer1 = Timervorgabe

  If I = 0 Then
   F1 = Fstart
   Fstart = Fstart + Z

      If Fstart = Fende Then
         I = 1
      End If
  End If

  If I = 1 Then
   Fstart = Fstart - z
      If Fstart = F1 Then
         I = 0
      End If
   End If

Return

von Karl H. (kbuchegg)


Lesenswert?

> Timer_irq:
>   Timer1 = Timervorgabe
>
>   If I = 0 Then
>    F1 = Fstart
>    Fstart = Fstart + Z
>
>       If Fstart = Fende Then
>          I = 1
>       End If
>   End If
>
>   If I = 1 Then
>    Fstart = Fstart - z
>       If Fstart = F1 Then
>          I = 0
>       End If
>    End If

Lass die Werte für Fstart und Fende in Ruhe.
Du willst nur in jedem Timerinterrupt F1 hochzählen
oder erniedrigen.

Wenn das Richtungsflag auf 'nach oben' steht, willst du
F1 erhöhen. Erreichst du dadurch Fende, dann wird die
Richtung auf 'nach unten' umgeschaltet. Wird beim
Runterzählen wieder Fstart erreicht, wird die Richtung
wieder auf 'nach oben' umgestellt.

In keinem Fall musst du aber Fstart oder Fende verändern.
Das willst du auch nicht, denn das sind deine Eckdaten
an denen die Richtung umgestellt wird.

Im übrigen: Ist garantiert, dass Fstart + n * z
(n ganzzahlig, z beliebig) immer Fende ergibt?
Ich denke mal: eher nicht. Das heist es wird nicht
sehr schlau sein, die Richtungsumschaltung dann zu machen
wenn F1 exakt Fende ist.
Bsp:
  FStart 1000
  FEnde  2000
  z       300

F1 nimmt dann die Werte an:
   1000
   1300
   1600
   1900
   2200

Mit 2200 bist du schon grösser als die geforderten 2000.
Allerdings war F1 niemals exakt gleich 2000 und daher wird
auch die Umschaltung auf 'nach unten' nie durchgeführt.



von Mr-400-Volt (Gast)


Lesenswert?

Mag ja vieleicht blöd klingen, aber wie stelle ich die zählrichtung um ?

von Karl H. (kbuchegg)


Lesenswert?

Deine Grundidee war doch gar nicht schlecht.
Nur die Ausführung war lausig :-)


 Timer_irq:
   Timer1 = Timervorgabe

   If I = 0 Then
     F1 = F1 + z
     if F1 >= Fende then
       I = 1
     end if

   else
     F1 = F1 - z
     if F1 <= Fstart then
       I = 0
     end if
   end if



Wenn der Wobbler eingeschaltet wird, setzt
du F1 auf Fstart und I auf 0

von Mr-400-Volt (Gast)


Lesenswert?

Oh klasse, danke dir für deine hilfe............Er Wobbelt :-))

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.