www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Idee:Speicheroszilloskop(keine eierlegende Wollmilchsau!!!)


Autor: Franz (Gast)
Datum:

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

Autor: Franz (Gast)
Datum:

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

Autor: Clemens Helfmeier (sum)
Datum:

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

Autor: thkais (Gast)
Datum:

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

Autor: Markus (Gast)
Datum:

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

Autor: Franz (Gast)
Datum:

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

Autor: Franz (Gast)
Datum:

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

Autor: Benedikt (Gast)
Datum:

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

Autor: Clemens Helfmeier (sum)
Datum:

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

Autor: Clemens Helfmeier (sum)
Datum:

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

Autor: Markus K. (markus-)
Datum:

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

Autor: Clemens Helfmeier (sum)
Datum:

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

Autor: Martin #### (martin-)
Datum:

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

Autor: Martin #### (martin-)
Datum:

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

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.