Arduino+AD9833 code für Rechteckfestfrequenz

OP #6054922
Lesenswert?

Hallo,
für ein Amateurfunkprojekt benötige ich eine Rechteck-Spannung im 
Bereich 1.8-1.9 MHz als Ersatz für einen Quarz-Oszillator. Diese 
Festfrequenz soll nur mit einem Arduino und AD9833 erzeugt werden. Ich 
habe verschiedene Programme ausprobiert. Die laufen aber entweder nur 
mit externer hardware (Rotary Encoder oä.) oder lassen sich nur per 
Arduino Terminal Programm manipulieren. Könnt Ihr mir einen Tipp geben, 
welchen code ich nutzen kann.

Vielen Dank Karl
Gast #6054961
Lesenswert?

Schreibe dein eigenenes Programm! Dank Arduino sollte das nach etwas 
Lektüre selbst für einen Einsteiger umsetzbar sein.
Im Zweifelsfall gibt es auch Bibliotheken, die fertige Funktionen 
bereitstellen. Google hilft dir bei der Suche.
OP #6054985
Lesenswert?

Danke für die Infos. Ich habe bereits sehr viel rumprobiert und
habe zahlreiche sketches probiert, verliere dann aber total den 
Überblick. Wenn ich nur Sinus bräuchte, würde ich gut mit dem code im 
Anhang zurechtkommen. Der ist zwar für sweep-Modus geschrieben, 
funktioniert aber, wenn die Max/Min-Frequenzen gleich sind. Wenn ich den 
für Rechteck umschreiben könnte, wäre das, was ich brauche!

Schöne Grüße Karl
Angehängte Dateien:
Gast #6055023
Lesenswert?

elmo64 schrieb:
> https://github.com/Billwilliams1952/AD9833-Library-Arduino

aus den Beispielen:

1
/*
2
 * ApplySignal.ino
3
 * 2018 WLWilliams
4
 * 
5
 * This sketch demonstrates the basic use of the AD9833 DDS module library.
6
 * Using the ApplySignal to generate and/or change the signal.
7
 * 
8
 * This program is free software: you can redistribute it and/or modify it under 
9
 * the terms of the GNU General Public License as published by the Free Software Foundation,
10
 * either version 3 of the License, or (at your option) any later version. 
11
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
 * See the GNU General Public License for more details. You should have received a copy of
14
 * the GNU General Public License along with this program.
15
 * If not, see <http://www.gnu.org/licenses/>.
16
 *
17
 * This example code is in the public domain.
18
 * 
19
 * Library code found at: https://github.com/Billwilliams1952/AD9833-Library-Arduino
20
 * 
21
 */
22

23
#include <AD9833.h>     // Include the library
24

25
#define FNC_PIN 4       // Can be any digital IO pin
26

27
//--------------- Create an AD9833 object ---------------- 
28
// Note, SCK and MOSI must be connected to CLK and DAT pins on the AD9833 for SPI
29
AD9833 gen(FNC_PIN);       // Defaults to 25MHz internal reference frequency
30

31
void setup() {
32
    // This MUST be the first command after declaring the AD9833 object
33
    gen.Begin();              
34

35
    // Apply a 1600000 Hz square wave using REG0 (register set 0). There are two register sets,
36
    // REG0 and REG1. 
37
    // Each one can be programmed for:
38
    //   Signal type - SINE_WAVE, TRIANGLE_WAVE, SQUARE_WAVE, and HALF_SQUARE_WAVE
39
    //   Frequency - 0 to 12.5 MHz
40
    //   Phase - 0 to 360 degress (this is only useful if it is 'relative' to some other signal
41
    //           such as the phase difference between REG0 and REG1).
42
    // In ApplySignal, if Phase is not given, it defaults to 0.
43
    gen.ApplySignal(SQUARE_WAVE,REG0,1600000);
44
   
45
    gen.EnableOutput(true);   // Turn ON the output - it defaults to OFF
46
    // There should be a 1600000 Hz square wave on the output of the AD9833
47
}
48

49
void loop() {
50
    // To change the signal, you can just call ApplySignal again with a new frequency and/or signal
51
    // type.
52
}

sollte es tun.
Gast #6055141
Lesenswert?

Karl L. schrieb:
> Im Ordner sind jetzt die .ino-Datei und die AD9833.h-Datei.

Du liest schon die Installationsanweisungen?

[ ]  ja
[ ]  nein

Hier nochmal das Wichtigste als Raubkopie:

----------------------------------------------------------
Installation

Download the ZIP file and extract into your sketchbook/libraries
directory. Exit the Arduino program (if open) and restart it to
see the AD9833 library along with its sketch examples.
----------------------------------------------------------
OP #6055206
Lesenswert?

Danke für die Info.
Ich habe jetzt unter
https://github.com/Billwilliams1952/AD9833-Library-Arduino.git die 
zip-Datei AD9833-Library-Arduino-master in ein Verzeichnis geladen.

Es sind folgende Datein im Verzeichnes:
_config.yml
AD9833.cpp
AD9833.h
digitalWriteFast.h
keywords.txt
README.md

Weiterhin sind im Ordner: "examples" die beiden Unterordner: 
AD9833_test_suite und ApplySignal vorhanden.
Wenn ich nun das Arduino-Programm neu starte und AD9833_test_suite.ino 
lade bekomme ich bei der Überprüfung wieder die Info:

exit status 1
'AD9833' does not name a type; did you mean 'ADC3D'?

Interpretiere ich die Installationsanweisungen falsch oder was passt da 
nicht?
#6055225
Lesenswert?

Karl L. schrieb:
> Ich habe jetzt unter
> https://github.com/Billwilliams1952/AD9833-Library-Arduino.git die
> zip-Datei AD9833-Library-Arduino-master in ein Verzeichnis geladen.

nicht EIN VERZEICHNIS!

sondern dort wo deine Arduino Libs sind!

ferner muss das -master entfernt werden

keine hat -master am Ende

Adafruit-MLX90614
Adafruit_CircuitPlayground
Adafruit_GFX
Adafruit_ILI9341
Adafruit_PCD8544
Adafruit_STMPE610
arduino_994725
Bridge
DS1307new
Esplora
Ethernet
FastLED

Karl L. schrieb:
> Interpretiere ich die Installationsanweisungen falsch

ich schätze du hast sie NIE gelesen!
#6055707
Lesenswert?

Joachim B. schrieb:
> das mit dem -master entfernen steht DA nicht

Ist auch nicht erforderlich. Beim Starten durchsucht die IDE das 
libraries-Verzeichnis. Der Name der jeweiligen Unterverzeichnisse ist 
dabei egal. Habe z.B. meine eigenen in einem Verzeichnis dessen Namen 
mit den .h oder .cpp nichts zu tun hat:

Adafruit_Unified_Sensor
BH1750-master
DFRobotDFPlayerMini-master
dht11
Eigene
Gast #6055717
Lesenswert?

Aufgemergd schrieb:
> Du liest schon die Installationsanweisungen?
>
> [ ]  ja
> [ ]  nein
>
> Hier nochmal das Wichtigste als Raubkopie:
> ...

Als diese Installationsanleitung geschrieben wurde, steckte die Arduino 
IDE noch in den Kinderschuhen.

Unter Werkzeuge gibt es die Funktion Bibliotheken verwalten

Diese Funktion ist zum Verwalten von Libraries vorgesehen
[ ] ja
[ ] nein

Einfach mal ins Suchfeld AD9833 eingeben ...
#6055791
Lesenswert?

Hallo,

man kann auch das .zip aus dem github-Link einfach runterladen, in der 
IDE Skezch -> Bibliothek einbinden -> .ZIP Bibliothek hinzufügen aus dem 
Neü auswählre, das zip-File suchen und auswählen und ok sagen...
Man muß dann nichtmal die IDE neu starten.
Ich greife generell nur von Hand ein, wenn das eine Fehlermeldung 
ergibt, weil das github-Archiv keine Bibliothek enthält oder falsch 
gebaut wurde.

Gruß aus Berlin
Michael
Gast #6055922
Lesenswert?

> CTC-Mode

Informiere dich doch erstmal darueber was ein NCO ist.
Den oben erwaehnten, kann man in 1/(2^20)-Schritten der
NCO-Eingangsfrequenz durchstimmen.
Mag ja sein dass das reicht.
Der TO wuerde wohl nicht ganz umsonst erstmal eine DDC
einsetzen wollen.
OP #6058834
Lesenswert?

Besten Dank für Eure Unterstützung und Geduld. Mit dem sketch von Horst 
(Gast) bin ich echt zufrieden. Ich suchte ja einen Quarzersatz im 
Bereich von 1.8  bis 1.9 Mhz (und zum Testen 1.3 bis 2.0 Mhz). 
Abstimmschritte von 1 khz reichen mir da aus. Die Ausgabe von Sinus ist 
in diesem Bereich super. Was den Rechteck betrifft, reicht mir die 
Qualität nicht aus. Die Zuführung zum Oszi ist abgeschirmt und kurz. Das 
Überschwingen stört nicht, sondern die Oberwellen (?), siehe Foto.Ist 
das üblich? Sollte hier ein Oberwellenfilter benutzt werden oder eine 
andere Schaltungen?  Bei einem Aufbau mit Quarz (74HC04)sind keine 
Oberwellen sichtbar.

Schöne Grüße Karl
Angehängte Dateien:
Gast #6058845
Lesenswert?

Karl L. schrieb:
> sondern die Oberwellen (?), siehe Foto.

Das was an Unzulänglichkeit zu sehen ist nennt man Jitter. Es
deuted entweder eine schlechte Einstellung der Triggerung
deines Oszilloskops hin (stelle den Trigger Level auf halbe
Rechteck-Amplitude) oder auf Nebenwellen die systembedingt
(DDS, schlechter DAC) mit gewisser Stärke vorhanden sind.
Siehe auch Datenblatt des AD9833.

Ich vermute eine Misch-Erscheinung aus beiden Effekten.

Karl L. schrieb:
> Bei einem Aufbau mit Quarz (74HC04)sind keine Oberwellen sichtbar.

Du meinst keine Nebenlinien. Oberwellen sind garantiert vorhanden
sonst hättest du kein Rechteck-SIgnal.
Gast #6058891
Lesenswert?

Karl L. schrieb:
> Sollte hier ein Oberwellenfilter benutzt werden oder eine
> andere Schaltungen?

Durch ein Oberwellenfilter bekämest du kein Rechteck durch. Ein Rechteck 
lebt aber davon, dass mindestens die dritte und fünfte Oberwelle durch 
kommen.

Du wirst ein ungünstiges Verhältnis von Eingangs- zu Ausgangsfrequenz 
beim DDS-Generator haben. Dann kann der bei einer so hohen 
Rechteckfrequenz prinzipbedingt nichts anders tun, als mit der Flanke zu 
zappeln.
Gast #6059194
Lesenswert?

Karl L. schrieb:
> Die Ausgabe von Sinus ist
> in diesem Bereich super. Was den Rechteck betrifft, reicht mir die
> Qualität nicht aus.

Es schmerzt einen beim Lesen.

Zuerst ist es dir offensichtlich NICHT möglich, das Manual zum DDS-Chip 
zu lesen und die wenigen Register dieses AD9833 richtig zu beschreiben.

Dann hapert es sogar beim Kopieren von bereits vorgekautem Code.

Und jetzt begreifst du es nicht einmal, was dabei herauskommt, wenn du 
ein 33 MHz DDS benutzt, um 2 MHz Ausgangssignal zu erzeugen. Bei sowas 
hast du etwa 16 Stützstellen pro Periode - was erwartest du da, wenn du 
simple Rechteck-Ausgabe wählst?

Hättest du wenigstens mal einen einzigen Blick ins Manual geworfen, 
dann hättest du sehen können, daß dieser Chip auch nen symmetrischen 
Rechteck ausgeben kann - mit halber Frequenz. Das hätte dann wenigstens 
ein exaktes 1:1 Tastverhältnis ergeben.

Hättest du auch nur ein wenig dich um das Verstehen des 
Funktionsprinzips bemüht, dann hättest du einen ganz anderen Weg 
beschritten, nämlich so:
- den AD9833 einen Sinus ausgeben lassen
- einen ordentlichen L-C-Tiefpaß mit Grenzfrequenz von so etwa 2..3 MHz 
dahinter gesetzt. Alternativ ein echtes Bandfilter für deinen 
interessierenden Bereich.
- einen Komparator hinter den Tiefpaß gesetzt.

So würde man das machen, um ein sauberes Rechtecksignal aus diesem DDS 
zu bekommen.

W.S.
Gast #6059313
Lesenswert?

W.S. schrieb:
> Hättest du wenigstens mal einen einzigen Blick ins Manual geworfen,
> dann hättest du sehen können, daß dieser Chip auch nen symmetrischen
> Rechteck ausgeben kann - mit halber Frequenz. Das hätte dann wenigstens
> ein exaktes 1:1 Tastverhältnis ergeben.

Noch einer, der das Prinzip eines DDS-Generators nicht verstanden hat, 
aber meint, große Töne spuken zu müssen :-(

Der Rechteckausgang kann seinen Pegel nur mit Flanken des Eingangstaktes 
ändern. Ein sauberes 1:1 Testverhältnis ist also gar nicht bei jeder 
Frequenz möglich.
Gast #6059431
Lesenswert?

Um dem ganzen Hohn etwas entgegenzusetzen sei gesagt:

Der TO tat sich bereits sehr schwer überhaupt eine fertige
Arduino Lib einzubinden und zu compilieren.

Da sollte es nicht verwundern wenn er die Prinzipien einer
Digitalen Direktsynthese nicht versteht zumal dies nicht
wie bei einem regulären (analogen) Funktionsgenerator
funktioniert.

Ich gehe mal soweit zu behaupten dass ein Arduino-User der
nicht zufällig von höheren Weihen heruntersteigt es auch
prinzipiell nicht versteht wie ein DDS funktioniert selbst
wenn er es einmal (das erste Mal) erklärt bekommt.
Gast #6059450
Lesenswert?

Wolfgang schrieb:
> Der Rechteckausgang kann seinen Pegel nur mit Flanken des Eingangstaktes
> ändern. Ein sauberes 1:1 Testverhältnis ist also gar nicht bei jeder
> Frequenz möglich.

Das hat W.S. bereits ausführlich angesprochen:

W.S. schrieb:
> um 2 MHz Ausgangssignal zu erzeugen. Bei sowas
> hast du etwa 16 Stützstellen pro Periode - was erwartest du da, wenn du
> simple Rechteck-Ausgabe wählst?
Gast #6059458
Lesenswert?

Aufgemergd schrieb:
> Das hat W.S. bereits ausführlich angesprochen:
>
> W.S. schrieb:
>> um 2 MHz Ausgangssignal zu erzeugen. Bei sowas
>> hast du etwa 16 Stützstellen pro Periode - was erwartest du da, wenn du
>> simple Rechteck-Ausgabe wählst?

Liest du eigentlich, was ich geschrieben habe?

Wolfgang schrieb:
> W.S. schrieb:
>> Hättest du wenigstens mal einen einzigen Blick ins Manual geworfen,
>> dann hättest du sehen können, daß dieser Chip auch nen symmetrischen
>> Rechteck ausgeben kann - mit halber Frequenz. Das hätte dann wenigstens
>> ein exaktes 1:1 Tastverhältnis ergeben.

> ... Ein sauberes 1:1 Testverhältnis ist also gar nicht bei jeder
> Frequenz möglich.
OP #6061517
Lesenswert?

Danke für Eure Tipps und Hinweise. Ich bin an folgendem Punkt: Der 
Arduino läuft mit dem sketch von Horst (Gast). Der AD9833 gibt jetzt 
eine Sinusspannung aus. Diese wird mit einer Emitterschaltung (2N2222) 
spannungsverstärkt. Anschließend gehts noch auf 1/4 des hcf4093 (2N2222 
und 4093 an 8 Volt). Mit dem Ergebnis bin ich jetzt wirklich zufrieden 
(Spitze-Spitze 8Volt,  so wie ich das brauche - siehe Anhang).

Beste Grüße Karl
Angehängte Dateien:

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