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
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?
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.
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.
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.
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
> 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 :-)
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).
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
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.
@ 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
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
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?