Ich habe einen AT91SAM7S an welchem bislang ein SPI ADC mit 3MSPS hängt. Leider reicht die Geschwindigkeit nicht ganz aus und ich muss einen schnelleren ADC verwenden. 10-20MSPS wären toll. Es wird aber nicht dauernd eingelesen, sondern nur 1024 Werte auf einmal und diese dann abgespeichert, bearbeitet und ev. verschickt. Bevor ich nun auf eine anderen Prozessor wechsle möchte ich mal nachfragen wie schnell ich die Daten in den AT91 bekommen würde. Wäre es eine alternative den externen Datenbus des AT91SAM7SE zum Anschluss eines parallelen ADCs zu missbrauchen?
Lukas Slz wrote: > Wäre es > eine alternative den externen Datenbus des AT91SAM7SE zum Anschluss > eines parallelen ADCs zu missbrauchen? Alternative zu was? Memory mapped IO ist der übliche Weg, um parallele IO-Devices anzusprechen. Nur wenn kein externer Datenbus existiert, muß man notgedrungen umständlich mit den Bits wackeln. Peter
Alternative zu manuellem Pinwackeln und Port einlesen. Wie nutzt man Memory mapped IO auf einem AT91SAM7? Welche Einlesegeschwindigkeit (ohne Verarbeitung der Daten) kann man damit erwarten?
Das Datenblatt sollte ein Kapitel zum externen Bus beinhalten. Mit Daten, zykluszeiten usw.
Also muss ich auf den AT91SAM7SE wechseln. Gibt es keine Möglichkeit die Daten schnell mit einem Sam7S ohne Externem Businterface einzulesen z.B. mit DMA? Zum Ansteuern des ADC muss dabei mit einem Pin ein Taktsignal generiert werden und gleichzeitig 12Bits vom Port eingelesen und abgespeichert werden.
>Zum Ansteuern des ADC muss dabei mit einem Pin ein Taktsignal generiert >werden und gleichzeitig 12Bits vom Port eingelesen und abgespeichert >werden. Damit hast du dir die Frage doch zur Hälfte schon selbst beantwortet. Jetzt musst du nur noch herausfinden, wielange das dauert.
Mit einfachem Ansteuern des PIO Controllers des AT91SAM7S gehts nur bis ca. 2MSPS. Mehr wäre schön...
1 | for (loop = 0; loop < (LOOPS); loop++) { //Messe |
2 | |
3 | p2PIO->PIO_SODR = (1<<8); //High |
4 | value = ((p2PIO->PIO_PDSR) & 0xFF); //Read Pin |
5 | p2PIO->PIO_CODR = (1<<8); //LOW |
6 | buffer[loop] = value; |
7 | |
8 | } //for |
Ich kann auch den Controller Wechseln, er sollte aber möglichst klein und trotzdem handlötbar bleiben.
Mir wäre ehrlich gesagt lieber bei einem in C programmierbaren Controller zu bleiben und mich nicht noch extra in VHDL einzuarbeiten So extrem sind meine Geschwindigkeitsanforderungen auch wieder nicht...
wie wärs mit einem ram oder fifo als zwischenbuffer und dann ganz gemütlich ins avr einlesen
In meinem Anwendungsfall wird ein direkter weg benötigt. Der ADC wird ausgelesen, die Werte manipuliert und über DAC ausgegeben. Dies soll nach möglichkeit schneller als 500ns sein. Hat jemand eine Idee?
Ich habe was nettes gefunden, hatte aber keine Zeit zum ausprobieren: CY7C68013 "FX2" mit AD9283 ADC ohne weitere ICs http://volodya-project.sourceforge.net/SR/sr.php Wenns ohne PC sein soll würde ich mir mal bei den DSPs umsehen da haben einige (u.A von Analog Devices) parallele DMA-Schnittstellen
Irgendwie hagelt es da die Zehnerpotenzen durcheinander: >10-20MSPS wären toll. >Der ADC wird ausgelesen, die Werte manipuliert und über DAC ausgegeben. Aber schon um alle 1024 Werte mit 20MSps einzulesen brauchst du 51µs. Gleich darauf heisst es: >Dies soll nach möglichkeit schneller als 500ns sein. 500ns sind aber nur 2MSps, die hattest du doch schon mit der Softwarelösung. Die lässt sich auch noch optimieren:
1 | int *pbuffer = buffer; |
2 | for (loop = 0; loop < (LOOPS); loop++) { //Messe |
3 | p2PIO->PIO_SODR = (1<<8); // |
4 | *(pbuffer++) = p2PIO->PIO_PDSR; // keine Zwischenvariable, |
5 | // nicht jedesmal Adresse neu berechnen
|
6 | p2PIO->PIO_CODR = (1<<8); // |
7 | } //for |
Da hilft ein Blick ins Listing, und dann dem Compiler nach dem Maul programmieren... ;-) Was soll denn jetzt wie schnell in welcher Zeit passieren?
Achtung! Die 1024 Werte mit den 20MSps und die 500ns sind 2 völlig voneinander verschiedene Probleme von verschiedenen Autoren. Sie passen blos thematisch zusammen ;-)
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.