Forum: Mikrocontroller und Digitale Elektronik Schwierigkeiten mit AD9833


von Tio T. (misterten)


Lesenswert?

Ich bekomme vom AD9833 nicht das raus, was zu erwarten wäre. Manchmal 
kommt nichts raus, manchmal was stark stufiges Niederfrequentes, dann 
wieder ein Sinus mit etwa 640mVpp und 1,8kHz (nicht die Frequenz, die 
ich eingestellt habe, ich habe das Codewort für 20Hz errechnet und 
übergeben), manchmal hat mir das Ding dann auch einen rechteck mit 5Vpp 
raus. Das Schlimmste ist, dass er selten und nur ansatzweise darauf 
reagiert, welche Frequenz ich ihm übergebe. Zwischen Sinus und Sägezahn 
kann ich hin- und herschalten, das macht er meist noch.

Scheinbar liegt es an meine Verdrahtung, dass die Kommunikation nicht 
sauber ankommt. Aber ich habe den SPI noch nie so empfindlich erlebt!? 
Läuft mitm 8Mhz getaktetem PIC auf mittlerweile nur noch ca. 3,9kHz 
(alle Teiler an), was wirklich langsam ist.

Kurzschlüsse zwischen den Pins des AD habe ich nicht messen können, habe 
mich an die doch sehr einfache Beschaltung gehalten. MCLK möchte ich mit 
einer PWM vom PIC geben, bin da auf 1MHz. Ich hoffe, dass das ausreicht, 
weil ich keine weiteren Infos hierzu bei analog finden konnte.

Kennt jemand dieses Problem und weiß, was man beachten muss? Danke!

von Dennis (Gast)


Lesenswert?

Tio T. schrieb:
> Kennt jemand dieses Problem und weiß, was man beachten muss?

Leider nicht, aber ich würde es gerne kennen lernen - kannst du mir 
sagen, wo du den Chip bezogen hast? Der sieht interessant aus!

von hert (Gast)


Lesenswert?

......

von Dennis (Gast)


Lesenswert?

Tio T. schrieb:
> Das Schlimmste ist, dass er selten und nur ansatzweise darauf
> reagiert

Ich hatte sowas mal bei nem AD421, da musste ich alles immer zweimal 
hinschicken, dann ging es, aber so sollte es auch nicht sein. Sicher, 
dass dein Latch nicht zu früh hoch geht?

von Tio T. (misterten)


Lesenswert?

Also, die Mindestzeiten, die da eingehalten werden müssen, hält mein PIC 
aufgrund seiner Geschwindigkeit schon von Haus aus ein, aber ich habe 
sicherheitshalber einige NOPs gesetzt.

Habe den AD irgendwann mal als Muster bekommen. Weiß leider nich mehr, 
wo. entweder über Farnell oder so oder mal bei eBay gucken.

von Ralf (Gast)


Lesenswert?

> Scheinbar liegt es an meine Verdrahtung, dass die Kommunikation nicht
> sauber ankommt.
Fliegender Aufbau? Bild? Schaltplan?

Ralf

von HansP (Gast)


Lesenswert?

Der AD9833 ist sehr empfindlich in Bezug auf die SPI Ansteuerung
Bei mir hat es erst funktioniert nach dem ich einen 74LS244 in die SPI 
Leitungen eingefügt habe.

lg. Hans

von nefuas (Gast)


Lesenswert?

Wenn du wie im Datenblatt angegeben ueber Buffer ansteuerst....dann ist 
es 100% deine Software , die nicht korrekt macht was sie sollte.
AD8933 bekommt man bei RS-Components . Es ist ein Vergnuegen das 
Chipchen fliegend zu verdrahten ;-)

von Peter P. (nuppel)


Lesenswert?

Habe den vor ca. nem Jahr mal zum Test mit nem Tiny25 zusammen betrieben 
und hatte nie Probleme.
War eher begeistert wie einfach und schnell das Ganze ging.

Brauchten allerdings nur drei verschiedene Frequenzen so das wir das 
ganze dann doch andres gelöst haben.

sehr schönes kleines Teil!

von Tio T. (misterten)


Lesenswert?

Naja, ganz fliegend ist's nicht. Habe ein Platinchen geätzt, wo der 
AD9833 mit einigen Elkos drauf sitzt, und von da gehen die SPI-, Takt- 
und 5V/GND-Leitungen zur Platine, wo der PIC sitzt. ;)

Hbae es mal mit dem Line Driver versucht, scheint aber nicht wesentlich 
besser zu sein.

Software. Hmm. Also, die sieht bei mir wie folgt aus:
1
void ad9833_wait(unsigned char wait)
2
{  unsigned char i;
3
  
4
  for (i = 0; i < wait; i++)
5
  {  asm("nop");
6
  }  
7
}
8
  
9
void ad9833_write(unsigned int data)
10
{  unsigned char MSB, LSB;
11
12
  MSB = (data >> 8) & 0xff;
13
  LSB = data & 0xff;
14
  
15
  write_spi1(MSB);
16
  write_spi1(LSB);
17
  
18
  ad9833_wait(200);
19
20
}  
21
22
void ad9833_init(void)
23
{    
24
  ad9833_wait(250);
25
  FSYNC = 0;
26
  ad9833_wait(250);
27
  
28
  ad9833_write(0b0000000111001000);   // reset ein, sinus
29
  ad9833_write(0b0100000000000000);   // FREQ0 MSB
30
  ad9833_write(0b0100011010001101);   // FREQ0 LSB
31
  ad9833_write(0b1000000000000000);   // FREQ1 MSB
32
  ad9833_write(0b1000011010001101);   // FREQ1 LSB
33
  ad9833_write(0b1100000000000000);   // PHASE0
34
  ad9833_write(0b1110000000000000);   // PHASE1
35
  ad9833_write(0b0000000010001000);   // reset aus, sinus
36
37
  ad9833_wait(250);
38
  FSYNC = 1;
39
}

Da bekomme ich nun ca. 80Hz Sinus raus. Tue ich im zweiten Datenwort an 
dritter Stelle von rechts eine 1 hin, so erwarte ich, dass sich die 
Frequenz erhöht. Stattdessen wird aus meinem Sinus ein Sägezahn. Da ist 
ja wohl mal was oberfaul...

von Tio T. (misterten)


Lesenswert?

So, zwei Eingebungen verhalfen mir zur Hilfe. Die erste war gestern: Der 
PIC kann per SPI auch 16 bit Wörter übertragen. So kann ich mir die 
Funktion ad9833_write sparen, die evtl. Probleme macht. Als dann gar 
nichts mehr kam, war ich am Verzweifeln. Heute morgen dachte ich mir, 
sch*** drauf, das zweite und letzte Muster rein, und siehe da, der erste 
AD war defekt! Nun läuft's!!! :))

Wen's interessiert: ich habe wirklich nur 3 Kerkos und einen Elko als 
Peripherie (wie im Datenblatt bei der Pinbeschreibung beschrieben), 
sonst nix. Line Driver ist bei mir absolut nicht notwendig (und das, 
obwohl ich fliegende Kabel zwischen zwei Platinen liegen habe), HansP, 
da muss bei Dir ein anderer Fehler vorliegen.

Ich werde noch einen aktiven Filter dahinter tun, damit ich auch gleich 
eine Entkopplung von der dahinter liegenden Last habe, da diese sonst 
die Signalamplitude in Abhängigkeit der Freuenz ändert.

Das Datenwort für die PIC24 SPI1 config lautet SPI1CON1 = 
0b0000011101111010.

FSYNC muss für den AD erkennbar auf LOW gehen, was ich natürlich nicht 
getan habe. Also vor LOW einmal HIGH. Der funktionierende Code sieht 
dann wie folgt aus:
1
unsigned char write_spi1_long(unsigned int value)
2
{  SPI1BUF = value;
3
  while (!SPI1STATbits.SPIRBF);  // warten, bis gesendet
4
  return SPI1BUF;
5
}
6
7
void ad9833_init(void)
8
{  unsigned int MSB, LSB;
9
  unsigned long freq, freqreg;
10
  
11
  freq = 20;         // hier mal 20 Hz als Beispiel
12
  
13
  freqreg = freq * 268.43546;        // 268.43546 = 2^28/1000000 für 1MHz MCLK
14
  LSB  = freqreg & 0x3FFF;
15
  MSB  = (freqreg >> 14) & 0x3FFF;
16
  
17
  
18
  FSYNC = 1;
19
  FSYNC = 0;
20
21
  
22
  write_spi1_long(0x2100);
23
  
24
  write_spi1_long(0x4000 | LSB);
25
  write_spi1_long(0x4000 | MSB);
26
  
27
  write_spi1_long(0x8C4A);
28
  write_spi1_long(0x8008);
29
  
30
  write_spi1_long(0xC000);
31
  write_spi1_long(0xE000);
32
  
33
  write_spi1_long(0x2000);
34
35
  FSYNC = 1;
36
  
37
}

Ist das nicht übersichtlich?!? Ich finde schon... 8)
Klasse Teil, das Ding. Für unter zehn Euro, klasse.

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.