Frequenzen Wobbel´n

Gast #459906
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!!
#459924
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.
Gast #459927
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
#459928
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.


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