Forum: Mikrocontroller und Digitale Elektronik Funktionsgenerator AD9833 gibt Versorgungspannung aus


von Matthias F. (frank91)


Angehängte Dateien:

Lesenswert?

Hallo

ich versuche gerade den Funktionsgenerator Chip AD9833 zum laufen zu 
bringen.
Seltsamerweise gibt dieser nur seine Versorungsspannung als 
Gleichspannung aus. Im Datenblatt steht aber dass die Ausgangsspannung 
maximal 0,65V wären.
Ich bin mir deswegen nicht sicher ob mein Fehler in der Software oder in 
der Hardware liegt.
Ich habe es auch schon mit einem anderen AD9833 versucht. Dieser verhält 
sich exakt genau so.

Vielleicht weiß jemand hier weiter.

Main
1
init_AD9833();
2
DDS_uebertragung_starten();
3
DDS_aendern(0x2100);
4
DDS_aendern(0x50C7);
5
DDS_aendern(0x4000);
6
DDS_aendern(0xC000);
7
DDS_aendern(0x2000);
8
DDS_uebertragung_stoppen();

DDS_AD9833.h
1
#define set_bit(ADDRESS,BIT)   ADDRESS |= (1<<BIT)  // set Bit
2
#define clear_bit(ADDRESS,BIT)   ADDRESS &= ~(1<<BIT)// clear Bit
3
#define  invert_bit(ADDRESS,BIT)  ADDRESS ^= (1<<BIT)  // Bit umschalten
4
/** Überprüft ob ein Bit gesetzt ist */
5
#define BitIsSet(port,bit)    (port & (1<<bit))
6
/** Überprüft ob ein Bit gelöscht ist */
7
#define BitIsClr(port,bit)    (!(port & (1<<bit)))
8
9
#define DDS_SCLK_PORT_OUT  PORTJ.OUT
10
#define DDS_SCLK_PIN    1
11
#define DDS_SCLK_DDR    PORTJ.DIR
12
13
#define DDS_SYNC_PORT_OUT  PORTJ.OUT
14
#define DDS_SYNC_PIN    0
15
#define DDS_SYNC_DDR    PORTJ.DIR
16
17
#define DDS_DIN_PORT_OUT  PORTJ.OUT
18
#define DDS_DIN_PIN    2
19
#define DDS_DIN_DDR    PORTJ.DIR
20
21
22
void init_AD9833 (void);
23
void DDS_uebertragung_starten (void);
24
void DDS_uebertragung_stoppen (void);
25
void DDS_aendern (uint16_t Wert);

DDS_AD9833.c
1
#define F_CPU 32000000UL
2
#define DDS_verzoegerung 100 
3
//<> standartverzeichnis
4
//"" Verzechnis des Projektes
5
#include <avr/io.h>      //für die Ein- und Ausgänge
6
#include <stdint.h>      //um Variablen so zu deklarieren, dass ihre Länge ablesbar ist
7
#include <util/delay.h>    //für delays
8
#include <avr/interrupt.h>  //für interrupts
9
10
#include "DDS_AD9833.h"
11
12
void init_AD9833 (void)
13
{
14
  //Alle 3 Datenleitungen als Ausgang setzen
15
  set_bit(DDS_SCLK_DDR, DDS_SCLK_PIN);
16
  set_bit(DDS_SYNC_DDR, DDS_SYNC_PIN);
17
  set_bit(DDS_DIN_DDR, DDS_DIN_PIN);
18
  
19
  //SYNC auf high setzen
20
  set_bit(DDS_SYNC_PORT_OUT, DDS_SYNC_PIN);
21
  
22
  //Fallende Flanke an SCLK erzeugen
23
  set_bit(DDS_SCLK_PORT_OUT, DDS_SCLK_PIN);
24
  _delay_us(DDS_verzoegerung);
25
  clear_bit(DDS_SCLK_PORT_OUT, DDS_SCLK_PIN);
26
  _delay_us(DDS_verzoegerung);
27
}
28
29
void DDS_uebertragung_starten (void)
30
{
31
  //Steigende Flanke an SCLK erzeugen
32
  set_bit(DDS_SCLK_PORT_OUT, DDS_SCLK_PIN);
33
  _delay_us(DDS_verzoegerung);
34
  
35
  //SYNC auf Low setzen //SCLK Muss laut Datenblatt des AD9833 in diesem Fall auf high sein 
36
  clear_bit(DDS_SYNC_PORT_OUT, DDS_SYNC_PIN);
37
  _delay_us(DDS_verzoegerung);
38
}
39
40
void DDS_uebertragung_stoppen (void)
41
{
42
  //Steigende Flanke an SCLK erzeugen
43
  set_bit(DDS_SCLK_PORT_OUT, DDS_SCLK_PIN);
44
  _delay_us(DDS_verzoegerung);
45
  
46
  //SYNC auf high setzen
47
  set_bit(DDS_SYNC_PORT_OUT, DDS_SYNC_PIN);
48
  
49
  //Fallende Flanke an SCLK erzeugen
50
  clear_bit(DDS_SCLK_PORT_OUT, DDS_SCLK_PIN);
51
  _delay_us(DDS_verzoegerung);
52
}
53
54
void DDS_einzelnes_zeichen_senden (uint8_t zeichen)
55
{
56
  //Steigende Flanke an SCLK erzeugen
57
  set_bit(DDS_SCLK_PORT_OUT, DDS_SCLK_PIN);
58
  _delay_us(DDS_verzoegerung);
59
  
60
  //Data ausgeben
61
  if (zeichen ==0)    clear_bit(DDS_DIN_PORT_OUT, DDS_DIN_PIN);
62
  else if (zeichen ==1)  set_bit(DDS_DIN_PORT_OUT, DDS_DIN_PIN);
63
  _delay_us(DDS_verzoegerung);
64
65
  //Fallende Flanke an SCLK erzeugen
66
  clear_bit(DDS_SCLK_PORT_OUT, DDS_SCLK_PIN);
67
  _delay_us(DDS_verzoegerung);
68
}
69
70
void DDS_aendern (uint16_t Wert)
71
{
72
  //Data Bits
73
  for (int zaehler=15; zaehler>=0; zaehler--) //MSB muss zuerst gesendet werden
74
  {
75
    if(BitIsClr(Wert, zaehler))DDS_einzelnes_zeichen_senden(0);
76
    else DDS_einzelnes_zeichen_senden(1);
77
  }
78
}

von Matthias F. (frank91)


Lesenswert?

Habe den Quarz getauscht. Jetzt scheint es zu gehen :P

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.