Forum: Mikrocontroller und Digitale Elektronik Daten von parallelem ADC einlesen


von Luky S. (luky)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von Luky S. (luky)


Lesenswert?

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?

von 3348 (Gast)


Lesenswert?

Das Datenblatt sollte ein Kapitel zum externen Bus beinhalten. Mit 
Daten, zykluszeiten usw.

von Luky S. (luky)


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

>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.

von Luky S. (luky)


Lesenswert?

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.

von 3348 (Gast)


Lesenswert?

Diese Funktionalitaet kann man sonst auch einem CPLD anhaengen...

von Luky S. (luky)


Lesenswert?

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...

von Maik L. (chufu)


Lesenswert?

Hast du schon eine lösung gefunden?

von schablonski (Gast)


Lesenswert?

wie wärs mit einem ram oder fifo als zwischenbuffer und dann ganz 
gemütlich ins avr einlesen

von Maik L. (chufu)


Lesenswert?

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?

von Luky S. (luky)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Maik L. (chufu)


Lesenswert?

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