Forum: Mikrocontroller und Digitale Elektronik ADC - Wie schnell aktualisiert der? Ist ein Oszi möglich?


von Moritz G. (moritz-)


Lesenswert?

Hallo!
Meint Ihr es wäre möglich, per ADC und UART ein Oszi zu bauen? Also am 
PC kann ich mit Delphi UART-Werte einlesen und entsprechend eine 
Oszilloskop-Software programmieren, das wäre weniger das Problem, nur 
wie schnell kann ein ADC maximal neue Werte einlesen?
Sieht jemand noch andere schwerwiegende Probleme bei dieser Idee?

Mfg
Moritz

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Vielleicht sagst du erst mal mit welchem µC, welchem ADwandler etc ;)

Und prinzipiell: ja es ist möglich. Jedoch ist die Bandbreite von 
normalen UARTs sehr beschränkt ... mit USB-Seriell wandlern kommst du 
schneller von der stelle.

von oszi_anwender (Gast)


Lesenswert?

schau dich mal in der codesammlung um:
http://www.mikrocontroller.net/forum/4?filter=oszi%2A

von Michi (Gast)


Lesenswert?

Die einfachste Version wäre wohl das hier :

http://www.semifluid.com/?p=24

oder dies:
http://www.semifluid.com/?p=15

von Moritz G. (moritz-)


Lesenswert?

Jep sorry, war etwas ungenau, also ich denke an die ATmega - Familie 
(8,16,..). Ich würde einen 16Mhz Quartz nehmen und in Assembler 
programmieren.

Mir kommt es nicht, wie in einigen Threads aus der Codesammlung, soo auf 
die Bandbreite an, es ist mehr so ein Bastelprojekt (..mal gucken ob's 
geht)..
Aber so ein A/D - Wandler sollte halt schon so schnell sein, das es 
wenigstens entfernte Ähnlichkeit mit einem Oszi hat. (Es gibt da ja so 
ein Theorem, das man mindestens mit doppelter Frequenz eine andere 
abfragen muss..?)

-Eine Idee wäre noch, einen externen A/D-Wandler zu benutzen, der 
vielleicht schneller aktualisiert, und den A/D-Wert irgendwie an den µC 
weitergibt. Kennt jemand einen geeigneten? (...Ideal wäre ein 8-16 bit 
Ausgang)
-Andere Sache: mehrere AD's (egal woher) nacheinander messen lassen, 
damit würde man die abfrage-frequenz erhöhen.Könnte sowas gehen?

@Hauke Radtki : USB-SERIELL-Wandler: meinst du, dass am Mikko der 
serielle Anschluss am UART-Ausgang hängt, und der USB am PC? Kennst du 
einen IC-Typ, mit .dll  und co, oder findet man sowas im Internet? 
bisher fand ich das immer sehr kompliziert mit USB, und dann mit V.Basic 
oder Delphi..
Ich schau auch noch mal nach zu dem Thema

Danke für die Antworten,

Moritz :-)

von Problembär (Gast)


Lesenswert?

>nur wie schnell kann ein ADC maximal neue Werte einlesen?

Jedenfalls schneller als dein UART. Wenn du den richtigen ADC nimmst.

von Rolf Magnus (Gast)


Lesenswert?

> also ich denke an die ATmega - Familie (8,16,..). Ich würde einen 16Mhz
> Quartz nehmen und in Assembler programmieren.

Wenn du den da eingebauten ADC nehmen willst, ist glaub ich bei
ca. 15 kHz Samplerate Schluß. Da kannst du lieber gleich eine Soundkarte 
nehmen. Die kann mehr.

> -Eine Idee wäre noch, einen externen A/D-Wandler zu benutzen, der
> vielleicht schneller aktualisiert, und den A/D-Wert irgendwie an den µC
> weitergibt.

Ich würde einen nehmen, der das nicht nur "vielleicht" tut ;-)

> -Andere Sache: mehrere AD's (egal woher) nacheinander messen lassen,
> damit würde man die abfrage-frequenz erhöhen.Könnte sowas gehen?

Sowas ähnliches macht man bei richtigen Digitaloszis. Da nimmt man zwar 
denselben ADC, aber bei jeder Periode des gemessenen Signals läßt man 
ihn zeitlich leicht versetzt messen. Die Ergebnisse kann man dann 
zusammenrechnen. Das geht dann natürlich nur, solange man periodische 
Signale mißt.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Die die maximale Samplerate liegt beim AVR-ADC bei etwas über 75kHz 
(13µs) im Free-Running-Mode, ein 35kHz Signal wäre damit abtastbar. Das 
kann keine (normale) Soundkarte.

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

Die USB-Seriell wandler arbeiten vom PC aus gesehen wie normale Serielle 
schnittstellen, d.h. du kannst auch entsprechend drauf zugreifen.

15kHz Samplerate ist bei höchster Auflösung garantiert oder so ähnlich.
Mein ADC vom Mega16 "rennt" mit ca 76kHz samplingrate (500kHz input 
clock)

Dabei kann man dann aber nicht mehr als ca 6-7 bit an auflösung 
erwarten.

von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

Jo..

Einen AD-Wandler mit 8-16bit Anschluß ?
Und geringfügig schneller als der interne...?
vielleicht der... Anhang ;-)

von Moritz G. (moritz-)


Lesenswert?

Ok, das klingt doch alles, als wär sowas mal einen Versuch wert.
ich probiers erstmal normal mit AVR-ADC in der Dauerschleife "loop: ADC 
rjmp loop" und UART. Was ist der Free-Running-Mode?
Und wenns auch tatsächlich nur bis 7khz abtasten kann, optimieren kann 
man immer noch, better change a running system :-)
Grüsse,
Moritz

von Moritz G. (moritz-)


Lesenswert?

ohh der A/D-Wandler sieht net schlecht aus, muss ich sagen..bisschen zu 
viele pins für meinen Geschmack, aber die lassen sich auch bändigen..
Ich probier den auf jeden fall mal zu bekommen und werde ihn mir dann 
aufs Korn nehmen.
moritz

von Matthias (Gast)


Lesenswert?

@Moritz:
Kann dir noch mehr ähnliche anbieten...

von Rolf Magnus (Gast)


Lesenswert?

Die 40 Mb/s wirst du allerdings nicht mehr in einen AVR bekommen, und 
über die serielle Schnittstelle oder einen seriell-USB-Wandler auch 
nicht.

von AB (Gast)


Lesenswert?

Die Übertragung zum PC kann man auch so gestalten dass man einfach das 
Signal zuerst in echtzeit im µC-RAM aufzeichnet (mit entsprechender 
Triggerfunktion) und dann die Daten ganz gemütlich mit UART an den PC 
sendet.

von Moritz G. (moritz-)


Lesenswert?

Das hatte ich mir auch überlegt, das wär eine praktische Alternative, 
auch wenn etwas Rechenarbeit nötig ist..aber das müsste gehen. und man 
muss ja nur sozusagen einen Puffer programmieren, der die langsame 
Übertragung ausgleicht.

@Matthias: ich hab mir eben beim Conrad aus seinem beschränkten 
Sortiment mal einen TLC 549 CP besorgt (8-bit). Den teste ich mal.

von Moritz G. (moritz-)


Angehängte Dateien:

Lesenswert?

ok, also der erste test hat schonmal funktioniert!!
nur muss ich sagen haben alle die Recht, die meinten, das UART wäre 
langsam. IST ES AUCH!!!!!
Puhh, jetzt muss ich eventuell doch einen Puffer im AVR programmieren.
Weis jemand zufällig, ob es sowas schon gibt, ob es schwierig zu 
programmieren ist, und ob man nicht vielleicht einen kleinen Teil 
irgendwo bekommt?
Ich müsste die Werte, die der ADC ermittelt, im RAM abspeichern, und 
dann (gleichzeitig) anfangen, von Anfang an die gespeicherten Werte zu 
lesen und übers UART rauszuschicken.
Natürlich is dass dann auch Mist, wenn der PC nicht in Echtzeit die 
Spannung anzeigt, aber nun gut.

Noch eine kleine Frage: hat jemand einen USB-UART IC, den er mir nennen 
könnte? Ich glaube dieser Weg wäre der beste!

Grüsse Moritz

von Matthias (Gast)


Lesenswert?

...man nicht vielleicht einen kleinen Teil....
bitte schön, ein kleiner Teil:
uint16_t      puffer[4096];
;-)

...mand einen USB-UART IC, den er .....
FT8U232AM
FT245BM
zB

von Severino R. (severino)


Lesenswert?

In Elektor 3/2006 wurde ein Oszilloskop mit dem R8C/13 vorgestellt, 
inkl. PC-Darstellungs-Software. Zusätzlich wird ein Grafik-LCD 
angeschlossen.
Ich weiss, Du willst den AVR einsetzen, aber möglicherweise ist dies 
eine Quelle für Ideen und für die Machbarkeit.

Severino

von Matze (Gast)


Lesenswert?

Und wenn du die 8 bit Daten parallel an die Druckerschnittstelle des 
PC´s sendest? Ich weis nur nicht wie schnell die beim PC ist. Der AVR 
kann mit 16MHz bestimmt 1MByte pro Sekunde senden.

Vielleicht kommt man auch ganz ohne µC aus. Wenn man einen parallelen 8 
Bit ADC direkt an den LPT anschließt und den PC die restliche Arbeit 
machen lässt.

von guru (Gast)


Lesenswert?

als USB-UART-Wandler ist der auch einwandfrei:

http://www.ftdichip.com/Products/FT232R.htm

von Axel R. (Gast)


Lesenswert?

Gibt es den CA3306 noch?
Den hatte ich mal (war noch unter DOS-Zeiten) am Parallelport drann. 
Macht aber nur 6Bits. Dafür mit 15Mhz und ohne Prozessor...

von Andi (Gast)


Lesenswert?

Den FT232RL würde ich dir auch empfehlen, wenn es USB sein soll.

Aber es ist für ein Oszilloskop nicht nötig, die Daten so schnell, wie 
sie gemessen werden, an den PC zu übertragen. Fülle einfach das interne 
RAM des AVR, wenn es voll ist, sendest du den Inhalt an den PC, was viel 
länger dauern darf, als das Aufzeichnen. Jeder USB-Oszi macht das so, 
und auch "richtige" Digital-Oszis stellen nicht so schnell dar, wie sie 
aufzeichnen können.

Wichtig ist halt, dass du noch einen Trigger einbaust, damit du auch den 
Zeitausschnitt aufnimmst, der dich interessiert. Vereinfacht gesagt 
wartest du vor dem Aufnehmen bis der ADC einen bestimmten Wert 
überschreitet, oder unterschreitet (Trigger auf positive/negative 
Flanke).

Gruss Andi

von Moritz G. (moritz-)


Lesenswert?

Hey Danke, das bringt mich gut weiter! Ich werde bei farnell den 
UART-USb Ic mal bestellen (FT232). Der sieht vielversprechend aus, und 
der Websupport ist top. Als nächstes werde ich mal das mit dem 
RAM-Puffer ausprobieren, ich werde dann sofort hier berichten!
Das mit dem Parallelport ist sicher auch möglich, nur dann halt wieder 
ne ganz andere Schiene, und ich bin froh, das ich in Delphi das UART 
endlich ansteuern kann (http://www.delphipraxis.net/ sei Dank: 
http://www.delphipraxis.net/topic102188_uart+terminalprogramm+zur+kommunikation+mit+atmega8+c.html&highlight=).

Also folgende Möglichkeiten bestehen:

-[AVR-ADC]-AVR-UART (RAM)
-[AVR-ADC]-AVR-UART-USB
-[ext.ADC] -AVR-UART
-[ext.ADC] -AVR-UART-USB
-[ADC-..] -AVR-8bit-->LPT-Port

Diese werde ich nun der Reihe nach mal durchchecken!

Gruss Moritz

von Moritz G. (moritz-)


Lesenswert?

Ok, ich hab mal das mit dem SRAM ausprobiert, hier der Code. Es ist aber 
eine mega-Verzögerung, zwischen den einzelnen Datenfluten zu 
verzeichnen(einige 10 sekunden!!) Der misst jetzt, wartet, sendet 
(dauert), zeigt an, misst,usw...

^
|**initalisierungen und ADC-Messung vom AVR-Tut hier ausm Forum, ZL und ZH |sind 
mit startadresse des SRAMS beladen (0x0060)
|'''''''''''''''''''''''''''''''''''''''''''''''''
|...
'

no_round:
;   Ergebnis nach adlow und adhigh kopieren
;   damit die temp Register frei werden
    mov  adlow, temp3
    mov  adhigh, temp4
 ;----------------------------------------------
cpi XH, 0x04  ;wenn höheres register bei 4, dann ist unteres bei 00, und 
0x0400 ist die Zahl 1024
brsh outp      ; das SRAM geht bis 0x045F , heisst 0x5F Stellen sind 
noch  fürn stack frei

ST X+, adlow    ;-adlow in adresse 0x0060 kopieren--anschliessendes 
erhöhen um 1-----
ST X+, adhigh   ;-adlow in adresse 0x0061 kopieren--anschliessendes 
erhöhen um 1

rjmp Main

;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSenden:
outp:
ldi XH, HIGH(startaddy)
ldi XL, LOW(startaddy)
senden:
LD adlow, X+    ;Wert von 0x0060 von SRAM in adlow ---anschliessendes 
erhöhen um 1
LD adhigh, X+    ;Wert von 0x0061 von SRAM in adhigh ---anschliessendes 
erhöhen um 1
rcall uart_s

cpi XH, 0x04  ;wenn höheres register bei 4, dann ist unteres bei 00, und 
0x0400 ist die Zahl 1024
brsh Main_r  ;neuer messvorgang!
              ;´sonst
rjmp senden


uart_s:
 hier gehts weiter mit ascci-konvertierung und sendevorgang ans uart

Wodurch kommt diese Verzögerung zustande zwischen messen und senden?
wahrscheinlich weil ich schon mal 0x0400 - 0x006 = 928 /2 = 464 
Messungen mache, und jede Messung ist ja oben schon ein Mittelwert aus 
255 Messungen,
heisst 255*464=118320 ADC-Messungen á 13µs sind 1,5 s und nich 20 !!!

von Moritz G. (moritz-)


Lesenswert?

Ok, ich hab eben nochmal nachgemessen: 26 Sekunden zwischen jeder 
Datenflut (es macht plopp und 458 werte kommen reingeprasselt).

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
Noch kein Account? Hier anmelden.