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!
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!
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?
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.
> Scheinbar liegt es an meine Verdrahtung, dass die Kommunikation nicht > sauber ankommt. Fliegender Aufbau? Bild? Schaltplan? Ralf
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
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 ;-)
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!
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.