Forum: Mikrocontroller und Digitale Elektronik hohe Datenmenge in Echtzeit übertragen oder speicher


von Joachim (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem:

ich will bei einem E-Motor messen, ob er pendelt. Dieses dreht mit ca. 
50Hz und gibt in einer Umdrehung 1024 Impulse in geometrisch gleichen 
Abständen aus. Diese will ich mit einem MC zeitlich messen 
(Periodenmessung mit etwa 100 Zählschritten) und die Daten anschließend 
auswerten, um zu sehen, ob die Maschine "rund" läuft.
Wenn ich nun eine Sekunde lang die Daten aufzeichne, wären das dann bei 
je 8Bit etwa 410kB. Ich habe mir überlegt, die Daten entweder im 
Controller abzuspeicher und anschließend "bequem" auszulesen, oder die 
Daten in Echtzeit an einen PC zu übertragen.

Meine Frage ist nun, ob es für die Speicherung geeignete, schnelle Rams 
oder EEPROMs gibt, oder welche Schnittstelle für die Echtzeitübertragung 
am besten geeignet wäre.

Außerdem bin ich npch auf der Suche nach einem geeigneten Atmel MC, den 
ich mit min. 40 MHz takten kann.

Ich stehe gerade am Anfag von dem Problem und habe mich noch nicht viel 
über die in Frage kommenden Komponenten informiert, wäre also für jeden 
Tipp sehr dankbar.

Grüße

von Philipp B. (philipp_burch)


Lesenswert?

Hi,

ich würde dir zu einem Mega-AVR von Atmel mit externem Speicherinterface 
raten. Da kannst du dann max. 64kByte dranhängen, wenn du mit 
zusätzlichen Pins noch Banking erzeugst auch noch mehr. Allerdings sehe 
ich grade nicht, wie du auf 410kB kommst. 50 * 1024 ergibt doch "nur" 
50kB, würde also noch in den RAM reinpassen.
Von der Geschwindigkeit sollte das auch machbar sein, es gibt ja Megas 
die du bis 20MHz takten kannst. Wenn du das Signal am INTx-Pin (Oder 
auch ICP) anlegst müsste sich das im Interrupt durchaus messen lassen, 
der wird dann ja mit gerademal 50kHz ausgelöst. Dann könntest du also 
bei jedem Interrupt einen Timerwert auslesen und speichern und den Timer 
anschliessend zurücksetzen. Das ganze dann halt so lange laufen lassen 
bis der RAM voll ist.

Oder versteh' ich irgendwas falsch?

von Joachim (Gast)


Lesenswert?

Hi Phillipp,

hast mich sehr gut verstanden. auf die 420kB komme ich, da jeder 
Zeitwert (der sich im Bereich von 100 Zählschritten bewegen sollte) ja 
aus 8 Bit besteht, also 1024x50x8Bit=409.600Bit (nicht Byte...sorry).


Interessanter als die Daten im Controller abzuspeichern wäre allerding, 
diese zu übertragen, leider finde ich im Internet nicht viel über die 
USB 2.0 Kommunikation zwischen MC und PC.

von Joachim (Gast)


Lesenswert?

Als weiteres Problem, wenn ich die einzelnen Daten ins RAM speicher 
will,wäre doch auch, dass ich dann im Prinzip 50x1024 Variablen 
definieren müsste. Um diese danach auszulesen, sollten sie danach ins 
EEPROM abgespeichert werden. Das würde dann einen eher unschönen 
Programmcode geben.

von Ronny (Gast)


Lesenswert?

Naja,mit der UART und einem MAX232 kommst du schonmal auf 115.2kBaud was 
immerhin so um die 90kBit/s wären.Mit einer UART-Erweiterungskarte ist 
eventuell (je nach Chipsatz) noch einiges mehr drin.Dann allerdings 
nicht mit dem MAX232,gibt allerdings etliche moderne Bustreiber die bis 
zu 1MBaud abkönnen (Tipp: de.farnell.com ,gibt eine prima 
Bauteilsuche).Wenn du die Daten erstmal im Controller speicher kannst 
und dann Zeit zum Übertragen hast wo nix nachkommt,reichen ja 115kBaud 
auch aus,dauert dann nur eben 1s-2s.

Die klassischen FTDI-Chips (Seriell<->USB-Wandler) sind meines Wissens 
nur bis 115.2kBaud spezifiziert,allerdings soll es auch neuere geben die 
mehr können.Das dürfte auf jeden Fall einfacher sein als USB per 
Software zu machen.Weil dann bräuchte man einen Treiber für den PC um 
das USB-Device ansprechen zu können.

Als Speicher wär ein externes SRAM am Mega-AVR schon geeignet,EEPROM 
dürfte allerdings zu langsam werden.

von Johannes S. (johanness)


Lesenswert?

USB2.0 wird wohl zumindest als Hi-Speed eher nix, brauchst du auch 
nicht, theoretisch reicht sogar Low-Speed. Es gibt AVRs mit 
USB-Schnittstelle, siehe 
http://www.atmel.com/dyn/products/param_table.asp?family_id=655&OrderBy=part_no&Direction=ASC 
. Einfacher (und vor allem billiger) wirds aber wohl mit dem FT232BM 
oder so, der bietet auf PC-Seite per Treiber eine virtuelle serielle 
Schnittstelle (bis zu 1 Megabaud, das sollte reichen), da muss man nur 
aufpassen, dass die Software mit der virtuellen Schnittstelle geht.

Und dann gibts noch die Möglichkeit, USB als Soft-USB direkt ins 
µC-Programm einzubauen, siehe z.B. hier: 
http://www.obdev.at/products/avrusb/index.html

von ??? (Gast)


Lesenswert?

Oder einfach auf eine SD-Karte, geht einfach und schnell

von mr.chip (Gast)


Lesenswert?

> hast mich sehr gut verstanden. auf die 420kB komme ich, da jeder
> Zeitwert (der sich im Bereich von 100 Zählschritten bewegen sollte) ja
> aus 8 Bit besteht, also 1024x50x8Bit=409.600Bit (nicht Byte...sorry).

> Als weiteres Problem, wenn ich die einzelnen Daten ins RAM speicher
> will,wäre doch auch, dass ich dann im Prinzip 50x1024 Variablen
> definieren müsste.

Du hast nicht wirklich Ahnung, über was du hier redest? Da ist wohl 
erstmal Grundlagen pauken angesagt, vernünftig Proggen solltest du schon 
können.

Du brauchst sicherlich keine 50x1024 Variablen, sondern allenfalls 
Arrays. Und es werden auch niemals sämtliche Daten von einer Sekunde im 
Speicher sein. Wie du auf die 1024 und die 50 kommst ist mir ebenfalls 
schleierhaft... Da happerts bei dir wohl noch gewaltig :-)

von ---- (Gast)


Lesenswert?

Warum wertest du die Daten nicht in Echtzeit im Controller selbst aus 
und gibst nur noch aus, ob das Ding rundläuft oder nicht (bzw. einen 
etwas aussagekräftigeren Wert)?

So wie ich es verstanden habe, willst du doch nur messen, ob die Zeiten 
zwischen 2 Pulsen immer in etwa gleich ist. Das bekommt jeder Controller 
hin.

----, (QuadDash).

von Christian (Guest) (Gast)


Lesenswert?

Der Motor macht ca. 50 Hz.

Wenn du nur die Differenz in Hz haben willst,
der bereich von 48 - 52 liegt, also die
wert
48  49  50  51 52
vorliegen,
dann braucht es kein Byte je Umdrehung, sondern 3 Bits.
=> die Genauigkeit entscheidet auch dein datenvolumen

+
Wenn der motor für 1000 werte gut/konstant läuft,
dann reicht
  48 Hz * 1000
aus (Datenmodell)

=> interne auswertung.


Nur so:
Es gab in dert ELEKTOR mal eine schaltung, um eine Festplatte
anzuschließen
Auch gab es da mal etwas mit ethernet (ISA-Karte)

USB 1.1 wäre eine Idee:
- reicht vermutlich (nicht?),
  da da overhead dazu kommt (Software, kontrolle, ob gesendet, etc.)
  + du die Daten ja sicher  weg bekommen mußt
  etc.

Anregung:
Ich habe mal 3 uCs in einer Schaltung zusammengefasst (8051):
- datenaufnahme
- datenauswertung
- kommunikation zum PC

Das entlastet & schafft ggf. Platz für änderungen

von Mark S. (struberg)


Lesenswert?

Such mal in der Codesammlung nach Anschalten von DRAM.
Beitrag "2MB DRAM an AVR"

Ohne die Datenmengen jetzt durchkalkuliert zu haben glaube ich, daß du 
damit hinkommen müßtest.

Das sollte eigentlich schnell genug sein. Brauchbares DRAM kannst von 
etlichen alten SIMMs auslöten.

Anschließend kannst es auf eine SD-Karte schreiben.

von Falk B. (falk)


Lesenswert?

@ Mark Struberg

>Such mal in der Codesammlung nach Anschalten von DRAM.
>Beitrag "2MB DRAM an AVR"

Ich würde einfach eine grösseren SRAM nehmen und per Bankswitching die 
Daten speichern.

>Anschließend kannst es auf eine SD-Karte schreiben.

Dazu reicht sicher das normale Aufbohren auf 64 kB gemäss Datenblatt. 
50kB/s sind für ne SD-Karte ein Klacks.

MfG
Falk

von Andreas L. (andi84)


Lesenswert?

Der FT245BM hat ein paralleles Interface und macht mis zu 1MBit mit.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Andreas Lang wrote:
> Der FT245BM hat ein paralleles Interface und macht mis zu 1MBit mit.

1MByte/s laut Datenblatt. Gemessen hab ich unter realen Bedingungen 
(Terminalprogramm ließt Daten aus) 600kByte/s. Ein FT245BM könnte also 
für die Anwendung gehen. Dann sollte er aber direkt am PC hängen (kein 
Hub oder wenn dann ein 2.0 FullSpeed da sich sonst die Bandbreite 
aufteilt)

Matthias

von Carsten P. (papa_of_t)


Lesenswert?

Wenn Du nur feststellen willst OB und nicht WIE er pendelt - würde es da 
nicht genügen, immer die Differenz zum letzten Zählwert zu ermitteln, 
und eine LED anzusteuern, wenn die Differenz größer ist als eine von Dir 
festzulegende, erträgliche Abweichung?

von Rene (Gast)


Lesenswert?

Das ganze nennt sich Phasenrauschen und dafuer gibt es 
Standardtechniken.

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.