Forum: Mikrocontroller und Digitale Elektronik Arduino+AD9833 code für Rechteckfestfrequenz


von Karl L. (karl_laas)


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

: Verschoben durch Moderator
von Horst (Gast)


Lesenswert?

Nimm den Arduino-Beispielcode zum AD9833 und schmeiss alles raus, was Du 
nicht brauchst.

von elmo64 (Gast)


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.

von Karl L. (karl_laas)


Angehängte Dateien:

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

von elmo64 (Gast)


Lesenswert?


von Horst (Gast)


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.

von Karl L. (karl_laas)


Lesenswert?

Danke.
Ich habe das gleich ausprobiert und folgende Fehlermeldeung erhalten:
exit status 1
'AD9833' does not name a type; did you mean 'ADC3D'?

In das Verzeichnis liegt die .ino-Datei (und die von mir dorthin 
kopierten Datein AD9833.c und AD9833.h)

Fehlt da noch etwas?

Schöne Grüße Karl

von Aufgemergd (Gast)


Lesenswert?

Karl L. schrieb:
> Fehlt da noch etwas?

Nach dem Github Archive gibt es keine AD9833.c

Fällt dir was auf?

von Karl L. (karl_laas)


Lesenswert?

Danke!

Folgendes setup:

FNC ist D4
CLK ist D13
DATA ist D11

Im Ordner sind jetzt die .ino-Datei und die AD9833.h-Datei.

Fehlermeldung, wie oben:

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

von Aufgemergd (Gast)


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

von Karl L. (karl_laas)


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?

von Joachim B. (jar)


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!

von Aufgemergd (Gast)


Lesenswert?

Karl L. schrieb:
> Interpretiere ich die Installationsanweisungen falsch oder was passt da
> nicht?

Du sollst die Anweisungen befolgen und nicht interpretieren.

von Aufgemergd (Gast)


Lesenswert?

Wahnsinn!

Nicht einmal Copy & Paste funktioniert bei manchen Leuten.

OMG!

von Joachim B. (jar)


Lesenswert?

Aufgemergd schrieb:
> Du sollst die Anweisungen befolgen und nicht interpretieren.

der Fairness halber sollte man aber mal klarstellen;

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.

das mit dem -master entfernen steht DA nicht

: Bearbeitet durch User
von Helmut H. (helmuth)


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

: Bearbeitet durch User
von Wolfgang (Gast)


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

von Joachim B. (jar)


Lesenswert?

Wolfgang schrieb:
> Unter Werkzeuge gibt es die Funktion Bibliotheken verwalten

aber die Verwaltungsfunktion kennt nicht alle Pfade, die muss man auch 
erweitern!

von leo (Gast)


Lesenswert?

Joachim B. schrieb:
> aber die Verwaltungsfunktion kennt nicht alle Pfade, die muss man auch
> erweitern!

Das brauchte ich noch nie, genau so wenig wie "master" entfernen. Du 
machst was falsch.

leo

von Joachim B. (jar)


Lesenswert?

leo schrieb:
> Du
> machst was falsch.

ach, ich musste Anfangs noch zusätzliche Boardverwalter.url eintragen

von Michael U. (amiga)


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

von leo (Gast)


Lesenswert?

Joachim B. schrieb:
> leo schrieb:
>> Du
>> machst was falsch.
>
> ach, ich musste Anfangs noch zusätzliche Boardverwalter.url eintragen

Ja, wenn es denn nicht die "Standard-Arduinos" sind, ist das der 1. 
Schritt.

leo

von Larry (Gast)


Lesenswert?

Ein sparsamer Mensch wuerde einfach den NCO eines PIC 16LF1507/8/9
nehmen, und den dann voellig ueberfluessigen AD8933 weglassen.

von Larry (Gast)


Lesenswert?

P.S.

Den *uino braucht man dann natuerlich auch nicht mehr.

von Joachim B. (jar)


Lesenswert?

ich habe mir so langsam Atmel Studio 4.18 und ISP abgewöhnt

von Michael U. (amiga)


Lesenswert?

Hallo,

man kann aber auch einen Arduino UNO/Nano nehmen und den AD8933 
weglassen.
mit dem CTC-Mode reichen da wenige Zeilen Programm und aus dem Pin kommt 
das Rechteck raus.

Gruß aus Berlin
Michael

von leo (Gast)


Lesenswert?

Michael U. schrieb:
> man kann aber auch einen Arduino UNO/Nano nehmen und den AD8933
> weglassen.

"Rechteck-Spannung im Bereich 1.8-1.9 MHz"

Im Prinzip ja, wenn es denn genauer spezifiziert weare. Da reicht ein 
ATtin13A locker auch aus.

leo

von Wolfgang (Gast)


Lesenswert?

Michael U. schrieb:
> man kann aber auch einen Arduino UNO/Nano nehmen und den AD8933
> weglassen.

Das kommt wohl sehr drauf an, mit welcher Auflösung die Ausgangsfrequenz 
eingestellt werden soll. Ein ATmega328 ist da mit seinen Bordmitteln 
schnell am Ende.

von Larry (Gast)


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.

von Wolfgang (Gast)


Lesenswert?

leo schrieb:
> "Rechteck-Spannung im Bereich 1.8-1.9 MHz"
>
> Im Prinzip ja, wenn es denn genauer spezifiziert weare. Da reicht ein
> ATtin13A locker auch aus.

Woher weisst du, wie fein die Frequenzschritte in dieser Bereich 
eingestellt werden soll?

von leo (Gast)


Lesenswert?

Wolfgang schrieb:

> Woher weisst du, wie fein die Frequenzschritte in dieser Bereich
> eingestellt werden soll?

Darum habe ich geschrieben ...

> wenn es denn genauer spezifiziert weare.

leo

von Karl L. (karl_laas)


Angehängte Dateien:

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

von Aufgemergd (Gast)


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.

von Wolfgang (Gast)


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.

von W.S. (Gast)


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.

von Wolfgang (Gast)


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.

von Aufgemergd (Gast)


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.

von Wolfgang (Gast)


Lesenswert?

Aufgemergd schrieb:
> 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 sprach von W.S.

von Aufgemergd (Gast)


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?

von Aufgemergd (Gast)


Lesenswert?

Aufgemergd schrieb:
> Um dem ganzen Hohn etwas entgegenzusetzen sei gesagt:

... und dies sei allen gesagt die blind auf den TO eindreschen
ohne dessen Background zu kennen oder nichts darüber wissen
wollen.

von Wolfgang (Gast)


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.

von Karl L. (karl_laas)


Angehängte Dateien:

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

: Bearbeitet durch User
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.