Mir ist da so ne Idee eingefallen ,wie man villeicht recht günstig ein Speicheroszilloskop realisieren (etwa 7 Mhz Samplingrate mit AVR und 25 Mhz mit ARM ) könnte. Ich betone, das ich dieses mal keine fertige Lösung habe, sondern Eure Meinung bezüglich Machbarkeit haben möchte. Bestimmt hat soetwas schon jemand von Euch realisiert, oder ich hab nen Denkfehler der die Realisierung unmöglich macht :-(. Wenn es doch geht, dann verstehe ich nicht, warum die Dinger auch mit 10 Mhz Samplingrate so unverhältnismäßig Teuer sind. Vorneweg: Es lassen sich keine lückenlose langzeitige Signale erfassen. In der HF Messung ist dies auch nicht nötig,da die Signale meist eh kontinuierlich sind. Da die Hardware trivial ist, beschränke ich mich nur auf die Software. Meine Idee ist, das man einen 8 Bit Flash Wandler direkt an einen IO Port schaltet. Dabei ist zu beachten ,das auch wirklich ein Port benutzt wird, der sich mit einem Assemblerbefehl schalten läßt. Hier währe es idealerweise der PA0-PA7 bereich ,steuerbar mit einem Byte. Da man bei einem Speicheroszilloskop kein durchlaufendes Signal wie bei einem DDS hat, genügt zur Aufzeichnung ein sog. One -Shoot. Hier kann man auf Kontrollstrukturen wie Schleifen verzichten. Das einzige ,was man für den Kritischen Teil benötigt, ist ein reservierter Speicherbereich im Ram und eine Abfolge von IORegister-Ram Zuweisungen im Flash. Es müßen pro Schritt also keine Zähler inkrementiert und Schleifenbedingungen überprüft werden. Die Inkrementierung erfolgt hier über Konstanten im Flash. Die ganze einlese Abfolge wird für ein definiertes Zeitfenster im Flash- Ram festgehalten. Bsp: function_read: mov [r0], IN . . . . . mov[rN],IN bei N=4 währe das : mov [0],IN; mov[1],IN; mov[2],IN; mov[3],IN; Für ein 4096 Byte großes Zeitfenster benötigt man 4096 Byte Ram und 4096 Zeilen code im Flash Ram. Ok hier würde selbst der fetteste AVR schon alleine wegen des Rams aussteigen. Hier kähme ein 1024 Byte Zeitfenster in betracht. Vorraussetzung ist auch ,das die IOs das von der Schaltgeschwindigkeit mitmachen. Bei kleinen Zeitfenster werden natürlich niederfrequente Signale nicht mehr erfaßt. Als spontane Lösung würde ich hier einfach mehrere Leseroutinen einbauen, die mit niedriger Abtastrate arbeiten. Das macht man indem man , zwichen die movs, nops einbaut ,die dann einfach ein oder jeh nach Streckung ein paar Takte abwarten. bei N=4 und Teilung durch 2: mov [0],IN; nop; mov[1],IN; nop; mov[2],IN; nop; mov[3],IN; nop; So deckt man auch mit kleinen Zeitfenstern den ganzen Bereich ab. Es muß dann aber für den richtigen Frequenzbereich die richtige Funktion ausgewählt werden. Idealerweise währe eine AutoTune Routine ,die zuerst alle Meßbereiche durchgeht und dann für die folgenden Messungen die optimale Lesefunktion anwendet. Die Leseroutine wird dann ständing abgefragt(gepollt) und die Werte vom Ram können dann direkt weiterverarbeitet werden (Anzeige auf einem LCD Display oder zur übertragung an einen PC). Der PC könnte dann auf den Sampledaten eine FFT anwenden und man hätte auch gleich einen Spektrum Analyser.
Für den Hobbyanwender gibt es allerdings ein großes Problem. 8 Bit Flash Wandler sind sehr schwehr zu beschaffen. Zumindest habe ich keinen Shop gefunden der die Dinger liefert. Der MAX108 ist z.B.so einer. Nur kriegt man ihn nirgendwo. Auf Händlerseiten die viele Bauteile anbieten gestaltet sich die Suche nach alternativen sehr schwierig. Die sind oft nur nach Bauteilbezeichnung und nicht nach Schlüßelwort wie AD -Wandler durchsuchbar. Wenn jemand Bezugsquellen und Typbezeichnungen weis ,dann bitte hier kurz reinschreiben g
Hallo Franz, deine Idee finde ich garnicht so schlecht. Ich kann mir noch zwei Pobleme vorstellen: 1. Wie wird der AD-Wandler angesteuert? Dieser müsste ja mindestens eine Clock erhalten, die irgendwie synchron zum Einlesezyklus im AVR ist. 2. Für das einlesen eines Ports und das speichern im RAM sind zwei Anweisungen nötig: in R16, PINA st z+, R16 Diese brauchen insgesamt 3 Taktzyklen. Folglich käme beim aneinanderreihen vieler solcher Instruktionen wirklich auf 7Mhz (bei 21Mhz F_CPU). Ich glaube die Frage nach dem Wandler ist auch äußerst berechtigt. Vielleicht lohnt es sich hier auch nach Alternativen, die vielleicht auf einem anderen Prinzip beruhen aber dennoch 8 Bit parallel ausgeben, ausschau zu halten. Schöne Grüße, Clemens
a bisserl mehr Hardware darfs schon sein... Ich habe mir mal einen kleinen Logic-Analyzer zusammengesteckt, der bei der Aufnahme den AVR nur als Taktgeber nutzte. Ein 4040 und ein SRAM waren für die Aufnahme des Signals zuständig, nach der Aufnahme holte sich der Avr dann ganz in Ruhe die Werte aus dem SRAM ab. Dabei habe ich die Eingänge mit 74541 umgeschaltet. Einfach, aber effektiv.
Es gibt z.B. den TDA8703 (40MSPS) und den ADS830E (60MSPS). Gibts beide bei Reichelt. Der TDA8703 scheint allerdings etws empfindlich zu sein, einfach mal hier im Forum danach suchen.
1) als Clock nehme man einfach den Prozessortakt und nen Frequenzteiler dahinter. Die Signale liegen so auf jedenfall an den Ports an. Der AD Takt muß nur etwas höher sein als die Einlesefrequenz. Beide müßen also nicht exakt Synchron sein. Ein TDA8703 könnte in Frage kommen.Der ist bis 40 MHZ taktbar. Zur not also einfach den AVR Prozessortakt dran und fertig. Das Auslesen funktioniert dann unabhängig. Es müßen keine weiteren Takte mehr softwaremäßig erzeugt werden. zu 2) Das richtet ich natürlich an Controller, die es unterstützen, ein IO REgister mit einem Befehl an eine Speicherzelle zu befördern. Ein AVR kann das definitiv nicht. Aber es gibt Controller ,die das durchaus können. Anstelle von st z+,R16 könnte man sts $00000,R16 ...... sts $000N,R16 Abfolgen nehmen. Ok das sind immer noch 3 Taktzyklen ,so ein scheiß aber auch:-(.
Zusatz High-Speed-Leseroutinne für die ganz hohen Frequenzen: IN r0,$16 ........ IN r31,$16 dann in den Ram:: sts $FF00,r0 .......sts $FF20,R31 Das macht 20 Mhz Samplingrate bei nem AVR mit 20 Mhz. Fensterbreite ist zwar nur 32. Aber diese Leseroutine wird halt nur bei den ganz hohen Frequenzen angewendet. Durch das hinterinandereinlesen von den verschiedenen frequenzspezifischen Leseroutinen läßt sich bei kontinuierlichen Signalen sogar eine durchgehende Spektrumanalyse realisieren. Einfach auf jede Leseroutine die FFT anwenden und die Amplitudenwerte hinterinander anordnen. Der AVR hat hier natürlich die Nase vorene ,da er 32 Register hat und jedes Register mit nur einem Zyklus aus einem IO Port geschrieben werden kann. Wenn das wirklich in der Praxis so funktioniert, dann währe das wohl ziemlich fett. Ein 20 Mhz Digiscope zum Schnäppchenpreis.
Die Idee hatten schon viele, umgesetzt hat es aber noch keiner, weil es einfach in der Praxis nicht brauchar ist. Was will man mit 32 Messwerten ? Mit einem einfachen SRAM und einem schneller Synchronzähler kommt man problemlos auf 40MHz und das bei 32kB Speichertiefe oder noch mehr. Wenn man keine Lust hat auf viel Löten, nimmt man einen kleinen CPLD, programmiert da einen 16bit Synchronzähler und noch eine automatische Abschaltung wenn der Speicher voll ist rein, und fertig ist das 3 IC (CPLD, ADC, SRAM) Oszi mit 40MHz Samplerate. Der AVR wird dann nur zum Auslesen und darstellen der Daten gebraucht. Das ganze lässt sich dann noch um eine Triggerung und andere Features erweitern.
Wie wärs mit der folgenden Kombi: ADC1175 und LM6181 (http://www.national.com/pf/AD/ADC1175.html) (http://www.national.com/pf/LM/LM6181.html) Der AD-Wandler ist für 2,90 im SO24, der OP (im DB vom AD-Wandler empfohlen!) für 2,70 im DIP8 bei Segor erhältlich. Wie wärs mal mit einem Versuchsaufbau?!
Um höhere Samplingraten zu erhalten, kann man auch ADC-Messwert nehmen (zu beliebiger Zeit) und die Zeit merken und an die entsprechende im RAM speichern. Allerdings ist das nur für periodische Signale möglich, die immer an der selben Stelle getriggert werden. Mit dieser Methode ist die Genauiggkeit Zeitmessung ausschlaggebend für die Samplingrate, folglich also 20Mhz!
@Clemens: Für Unterabtastung muss der A/D-Wandler eine kurze Sample+Hold-Zeit haben. Das kann ich bei dem von Dir vorgeschlagenen ADC aber nicht erkennen.
Hi, @Markus: Ja, das kann sein, ich hatte in erster linie auf die Samplingfrequenz geschaut und die ist ja hoch genug, so dass es eigentlich keine probleme geben sollte. Ich habe heute mal einen Testaufbau auf Lochraster mit einem Mega32 und einem ADS800U (den hatte ich noch da :-)) gemacht und kurze Routinen zum Einlesen geschrieben. Der AD-Wandler ist mit einem Port verbunden, der Takt kommt direkt aus dem AVR Oszillator. Nun kann ich mit 16/3Mhz einen Single-Shot durchlauf machen (1024 Werte derzeit. Ist schon ganz schön viel, wie ich finde), oder mit 16Mhz (Ja,das geht!) repitierende Signale einlesen. Bei letzterem ist eine zuverlässige und konstante Triggerquelle unabdingbar. Schöne Grüße, Clemens
>>Um höhere Samplingraten zu erhalten...
Ich habe es so gemacht, dass die Samples in externen SRAM eingelesen
werden, währed die Samples aufgenommen werden, wird AD-Wandler und SRAM
während aus externem Oszillator getaktet.
Es tut mir Leid, im vorigen Posting in einiges durcheinander gekommen.
Ich meinte:
>>Um höhere Samplingraten zu erhalten...
Ich habe es so gemacht, dass die Samples in externen SRAM eingelesen
wurden.
Währed die Samples aufgenommen wurden, wurde AD-Wandler und SRAM
aus externem Oszillator getaktet.
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.