Hallo allerseits, ich habe eine kleine Platine gebaut mit einem ADF4156A um einen VCO anzusteuern. Ich wollte jetzt den ADF mal testen und habe dazu dessen SPI-Schnittstelle über Litzen mit einem STM32 Discovery Board verbunden. Per Software-SPI werden die Register konfiguriert. Am Oskar sehen die Signale ganz OK aus, und grundsätzlich scheint der ADF die Befehle auch anzunehmen, so kann ich MUXOUT zwischen VDD und GND umschalten. Mehr geht dann aber auch wirklich gar nicht. Ich habe alle möglichen Register schon versucht zu programmieren, so z.B. auch am MUXOUT den R-Teiler auszugeben, aber ohne Erfolg. Irgendwie scheint der ADF keinen Takt zu bekommen oder was auch immer. Den Referenzeingang habe ich mit einem 4 MHz Quarzoszillator verbunden, wahlweise über einen 0R oder über einen 1nF. Beides macht keinen Unterschied. Am RF Eingang ist ein VCO mit 400 MHz angeschlossen. Für das Loopfilter habe ich einfach mal 47k und 1nF rein gesetzt; meiner Meinung nach müsste man damit wenigstens mal was 'zappeln' sehen, aber es passiert - gar nichts! Im Anhang mal mein Schematic. Wo könnte das Problem sein?
Bin mehr nicht mehr so ganz sicher ob das ein ADF oder eine andere PLL war. Bei einer war der "Debug"-Pin ala MUXOUT bei der Ausgabe von Takten kein Push-Pull mehr, er hat einen Pullup-R gebraucht. Was ich aber noch recht genau von einem ADF* weiss, war die extreme Empfindlichkeit auf dem SPI, der hat sich da über ein paar cm Leitung zum boardexternen uC alles mögliche eingefangen und hat damit immer sein Setup verloren. Setz da mal überall 1k seriell mit ein paar 100pF gegen GND rein.
Hi Georg danke für den Tip. Ich habe mal 330 Ohm seriell rein gesetzt. Das hat insofern etwas bewirkt, dass das Verhalten jetzt ein wenig anders ist, denn der PLL lässt sich immerhin nun ein- und ausschalten (Powerdown-Bit), was ich am Stromverbrauch sehe, der mal grösser und mal kleiner ist. Soweit also mal gut. Ich werde heute Abend mal noch kleine Kondensatoren reinsetzen, so 1 nF oder sowas und schauen, ob das etwas bringt. Die Leitungen auf meiner Leiterplatte vom uC zum ADF4156 sind ca. 1.5 cm lang. Da ich den uC aber noch nicht hier habe (vergessen zu bestellen.....), habe ich über Wrapdrähte die entsprechenden Verbindungen mit einem Discoveryboard gemacht. Die Wrapdrähte sind ca. 5cm lang, also schon recht lang. Meinst du, dass das bereits ausreicht, um Einstreuungen vom VCO einzufangen, sodass der ADF sein Setup auch vergisst? :-( Ich hoffe, dass es nachher funktioniert, wenn ich den richtigen Mikrocontroller drauf habe.
Tobias P. schrieb: > Die Wrapdrähte sind ca. > 5cm lang, also schon recht lang. Das ist überhaupt kein Problem. Aber ..... ... hast du dir überlegt wie du LE korrekt programmierst? Du hast dazu nichts geschrieben und es ist vielleicht nicht richtig. Einen SPIx_NSS vom STM32 kannst du nicht so verwenden. Für den VCO: so wie du die Loop gestaltet hast kann das für den VCO zu wenig Spannung bedeuten. VCOs brauchen oft bis 10V oder auch 15V Abstimmspannung. Für diesen Fall brauchst du eine Konfiguraton mit Operationsverstärker. Ausserdem brauchst du für ein sauberes HF-Signal eine Pufferung des VCOs zum ADF, da dessen Teiler auf den VCO zurückwirken, ihn modulieren, was als (unerwünschte) Modulation auf dem gelockten VCO-Signal zu sehen ist. Referenz: dein Oszillator übersteuert womöglich den Referenz- Eingang (siehe Datenblatt). PLL: für die Berechnung der PLL-Parameter verwende das ADISIMPLL Programm sonst wird deine Schleife nie "locken".
Tobias P. schrieb: > Den Referenzeingang habe ich mit einem 4 MHz Quarzoszillator verbunden, > wahlweise über einen 0R oder über einen 1nF. Beides macht keinen > Unterschied. Auf jeden Fall über einen Kondensator. Die Eingänge biasen sich selbst und werden "stillgelegt" wenn sie von aussen mit DC beaufschlagt werden. Gilt auch für den RF Input wo du es ja richtig gemacht hast.
Hallo, vielen Dank. Ich lade die Software gleich hier hoch. Bin noch unterwegs!
ADFProgrammierer schrieb: > Auf jeden Fall über einen Kondensator. Nehme ich zurück. Gilt für diesen Baustein nicht.
So, hier mal mein Code. Die SPI-Schnittstelle betreibe ich im 'Bitbang' mode wie folgt:
1 | void send_adf(uint32_t value) |
2 | {
|
3 | uint32_t cnt; |
4 | int a; |
5 | |
6 | LE(0); |
7 | for(a = 0; a < 10000; a++); |
8 | for(cnt = 0; cnt < 32; cnt++) |
9 | {
|
10 | SCK(0); |
11 | for(a = 0; a < 10000; a++); |
12 | if(value & BIT_31) |
13 | {
|
14 | DATA(1); |
15 | }
|
16 | else
|
17 | {
|
18 | DATA(0); |
19 | }
|
20 | for(a = 0; a < 10000; a++); |
21 | SCK(1); |
22 | for(a = 0; a < 10000; a++); |
23 | value = value << 1; |
24 | }
|
25 | for(a = 0; a < 10000; a++); |
26 | LE(1); |
27 | for(a = 0; a < 10000; a++); |
28 | LE(0); |
29 | for(a = 0; a < 10000; a++); |
30 | }
|
Die for-Loops geben jeweils ca. 100 us Delay. In die Register schreibe ich folgendes rein:
1 | void main(void) |
2 | {
|
3 | send_adf( BIT_02 ); // R4 |
4 | send_adf(BIT_06 | BIT_03 | BIT_01 | BIT_00 ); // R3; enable counter reset |
5 | |
6 | // MOD
|
7 | send_adf( (10u << 24) | (1u << 15) | (10u << 3) | BIT_01 ); // R2 |
8 | send_adf((1u << 3) | BIT_00 ); // R1 |
9 | |
10 | // INT FRAC
|
11 | send_adf( (3u << 27) | (100u << 15) | (5u << 3) ); // R0 |
12 | send_adf( BIT_06 | BIT_01 | BIT_00 ); // R3; disable counter reset |
13 | }
|
Wahlweise habe ich auch mal die Geschichte mit dem Counter-Reset weg gelassen, ändern tut sich dabei aber nichts. Mit dem Wert 3 an Position 27 im R0 Register wird der R-Teiler auf den MUXOUT gelegt, ich meine, dass ich dann im Prinzip 4 MHz sehen müsste, aber es kommt nix raus, eben entweder weil der ADF sein Setup verliert wegen zu langer Leitungen oder aber weil der Quarztakt aus welchem Grund auch immer nicht im Chip ankommt. Ich habe beides, also AC und auch DC Kopplung probiert, beides hat nicht funktioniert.
Haha, ich habe den Fehler gefunden. Bitte nicht lachen :-) Ich habe 2 Pins vertauscht. Jetzt geht es! Die Programmierung ist definitiv richtig. Ich habe den Ausgang des VCO über einen Splitter mit dem ADF verbunden, sowie mit dem Spektrumanalyser. Jetzt kann ich die Frequenz schön einstellen mit dem FRAC, MOD und INT, und am MUXOUT kommt auch das gewünschte raus. Es waren nicht die fehlenden Kondensatoren :-)
Tobias P. schrieb: > So, hier mal mein Code. Bis jetzt nichts Verdächtiges entdeckt. Hast du den Chip mit seiner Massefläche an Gnd angeschlossen? Kurze Masseverbindung vom ADF-Board zum STM Board? Pins auf Output konfiguriert und Clock dafür enabled? Richtige Pins? Diese Schleifen for(a = 0; a < 10000; a++); können vom Compiler wegoptimiert werden. Prüfe nach ob sich wirklich ein Delay ergibt.... Ansonsten musst du uns wohl oder übel auch deinen Aufbau zeigen.
Mein Aufbau sieht so aus, siehe Bild. Er ist nich so schön (lies: zum heulen), ich weiss. Aber dennoch funktioniert er, nachdem ich nun erst gesehen habe, dass ich 2 Pins versehentlich vertauscht habe. Was ich mich aber noch frage: ist es nötig bzw. sinnvoll, bei der Initialisierung des ADF den Counter Reset zu aktivieren? Das Datenblatt schweigt sich da aus.
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.