Hallo,
vielen Dank für die vielen Antworten. Ich merke langsam, dass meine Anfoderungen die Rechenleistung des XMEGA's überschreiten. Wenn ich bald keine weitere Möglichkeit sehe bin ich wohl gezwungen einen stärkeren Controller zu verwenden.
Abgesehen davon, konnte ich nun eine Anforderung verringern: es werden nicht mehr 800 ksps sondern 400 ksps benötigt. Die zu messenden Spannungen sollen nun mittels OPV's verrechnet werden.
Damit habe ich wieder einen kleinen Lichtblick, stoße aber wieder auf die Grenzen des XMEGAs.
Als Option habe ich jetzt zwei Einzel-AD-Wandler mit SPI-Schnittstelle erwägt. Diese lassen sich in einer Daisy-Chain verschalten und verringern zu mindest die Komplexität der Ansteuerung und des Aufbaus der Schaltung.
Leider ergibt sich für diese AD-Wandler eine asynchrone zeitliche Ansteuerung, welche das Timing erschwert.
Diese AD-Wandler haben folgendes Verhalten:
Sie benötigen ein Signal für die AD-Wandlung "CONVST" welches über die AD-Wandlung und die Ausgabe erfolgt (high-Zustand) und dann kurz pausieren muss (low-Zustand).
Das lässt sich recht einfach mit einem PWM-Signal realisieren.
Nachdem das CONVST-Signal angelegt wurde benötigt die Wandler 1,4 µs bis zur Ausgabe. Diese erfolgt mittels SPI und beginnt mit dem ansteigenden SCK-Signal des XMEGAS und umfasst 2 x 16-bit also 4 byte.
Das Auslesen dieser Werte ist mit DMA und dem Interrupt Flag des SPI-Moduls kein Problem und ist recht einfach gehalten.
Mehr Probleme macht hier die Erzeugung des SCK-SIgnals indem Dummy-Bytes in das SPI-Data-Register geschoben werden. Um die benötigte Datenrate zu erreichen muss das SPI mit 16 Mhz laufen. Damit wird ein Byte innerhalb von 0,5 µs übertragen. Damit müsste theoretisch alle 16 Clockcylces ein neuer Wert in das Data-Register geschoben werden. Wohl oder Über ist das zu wenig für jeden Timer und muss wohl Quick&Dirty erfolgen.
Das Problem mit den Timern konnte ich eingrenzen. Man muss auf jeden Fall vermeiden, dass zwei Timer gleichzeitig auslösen. Da ich recht grade und bekannte Zeiten habe konnte ich die Timer über das CNT-Register entsprechend vorladen und so verschieben, dass sich Timer mit einem vielfachen zu einem anderen Timer nicht gegenseitig stören.
Die Ursache hierfür liegt wohl in einem Temporären Register welches sich alle Timer teilen. Wird ein Interrupt ausgelöst während ein anderes noch abgearbeitet wird wird der Wert in diesem Register überschrieben.
In Anbetracht dessen finde ich die Priorisierung der Timer mittels der LVL etwas unnütze. Soweit ich mich erinnere konnte man dieses Register in Assembler hierfür kopieren und nach der Interrupt wieder herstellen...
Der DMA für die Erzeugung des Sinus ist kein Problem - hierfür gibt es ausführliche Tutorials von Atmel. So erfolgt die Ausgabe des SInus ohne Rechenleistung. Es dürfen ledigleich keine Timer miteinander kollidieren.
Anbei: der XMEGA ist für maximal 32 Mhz ausgelegt, extern dürfen sogar nur 16 Mhz Quarze angeschlossen werden.
Gruß Erik







Zitieren

Lesezeichen