mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schwierigkeiten mit AD9833


Autor: Tio T. (misterten)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: hert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
......

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Tio T. (misterten)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

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

Ralf

Autor: HansP (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: nefuas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Peter Pedal (nuppel)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Tio T. (misterten)
Datum:

Bewertung
0 lesenswert
nicht 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:
void ad9833_wait(unsigned char wait)
{  unsigned char i;
  
  for (i = 0; i < wait; i++)
  {  asm("nop");
  }  
}
  
void ad9833_write(unsigned int data)
{  unsigned char MSB, LSB;

  MSB = (data >> 8) & 0xff;
  LSB = data & 0xff;
  
  write_spi1(MSB);
  write_spi1(LSB);
  
  ad9833_wait(200);

}  

void ad9833_init(void)
{    
  ad9833_wait(250);
  FSYNC = 0;
  ad9833_wait(250);
  
  ad9833_write(0b0000000111001000);   // reset ein, sinus
  ad9833_write(0b0100000000000000);   // FREQ0 MSB
  ad9833_write(0b0100011010001101);   // FREQ0 LSB
  ad9833_write(0b1000000000000000);   // FREQ1 MSB
  ad9833_write(0b1000011010001101);   // FREQ1 LSB
  ad9833_write(0b1100000000000000);   // PHASE0
  ad9833_write(0b1110000000000000);   // PHASE1
  ad9833_write(0b0000000010001000);   // reset aus, sinus

  ad9833_wait(250);
  FSYNC = 1;
}
  
  

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

Autor: Tio T. (misterten)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned char write_spi1_long(unsigned int value)
{  SPI1BUF = value;
  while (!SPI1STATbits.SPIRBF);  // warten, bis gesendet
  return SPI1BUF;
}

void ad9833_init(void)
{  unsigned int MSB, LSB;
  unsigned long freq, freqreg;
  
  freq = 20;         // hier mal 20 Hz als Beispiel
  
  freqreg = freq * 268.43546;        // 268.43546 = 2^28/1000000 für 1MHz MCLK
  LSB  = freqreg & 0x3FFF;
  MSB  = (freqreg >> 14) & 0x3FFF;
  
  
  FSYNC = 1;
  FSYNC = 0;

  
  write_spi1_long(0x2100);
  
  write_spi1_long(0x4000 | LSB);
  write_spi1_long(0x4000 | MSB);
  
  write_spi1_long(0x8C4A);
  write_spi1_long(0x8008);
  
  write_spi1_long(0xC000);
  write_spi1_long(0xE000);
  
  write_spi1_long(0x2000);

  FSYNC = 1;
  
}


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.