Hallo,
ich bin auf der Suche nach einem Mikrocontroller der wirklich schnell
2x12 Bit parallel ausgeben kann.
Derzeit ist dies mit einem Raspi realisiert und dies ist nicht wirklich
schnell.
Meine Idee war nun einen ESP32 zu nehmen dort die Daten über DMA und I2S
rauszuschicken. Geschwindigkeit ist da wohl nicht das Problem, da ist
eher das Problem des stabilen Timings. Wenn man alle 5us sendet schwankt
es wohl ziemlich um diesen Wert. Weiteres Problem, der ESP32 hat nur 21
GPIOS die als Output definiert werden können.
Hat jemand einen Tipp um 2x12 Bit schnell und stabil parallel senden zu
können?
"... dies ist nicht wirklich schnell."
Mich interessiert der Unterschied - in Bit pro Sekunden - zwischen,
'nicht schnell' und 'nicht wirklich schnell'.
Hm... 5 µS ist in der Größenordnung von 192 kHz Samplerate. Warum nicht
einen Audio-Codec beim RPi nehmen, der 192 kHz kann? Das könnte dann
hinreichend stabil sein.
Tobi schrieb:> Hat jemand einen Tipp um 2x12 Bit schnell und stabil parallel senden zu> können?
Nimm einen µC, der nicht nebenher ein Betriebssystem zu bedienen hat.
> parallel senden zu können?
Wie sieht dabei das Handshake aus? Alle parallelen Busse haben einen
Mechanismus, der signalisiert "jetzt sind die Daten stabil, jetzt kannst
du sie übernehmen".
> da ist eher das Problem des stabilen Timings.
Das ist also die zweite Anforderung? Oder ist das im Grunde die einzige?
Denn 24 Bit pro 5µs ist eigentlich recht langsam...
Wobei ich jetzt dachte, du betreibst einen 2x12 bit DA Wandler (wegen
I²S). Aber das muss ja nicht sein. Aber wenn I²S eine Lösung wäre, dann
gehen ja viele µC, z.B. die STM32F40x.
Handshake gibt es keinen.
Es soll ein Vector Modulator angesteuert werden der I und Q mittels
jeweils 12 Bit Daten bekommt.
Habe grade geschaut, der Modulator hat eine maximale
Schaltgeschwindigkeit von 500ns/2Mhz. Wenn der uC das schaffen würde
wäre Top
Tobi T. schrieb:> Wenn der uC das schaffen würde wäre Top
Der µC ist nicht das Problem, sondern die darauf laufende Software. Und
das kann durchaus spannend werden, wenn man die Googletreffer so
anschaut:
https://www.google.com/search?q=FreeRTOS+jitter> der Modulator hat eine maximale Schaltgeschwindigkeit von 500ns/2Mhz.
Das ist jetzt aber doch 10x schneller als vorhin, oder wie passen die
5µs jetzt da rein?
Lothar M. schrieb:> Tobi T. schrieb:>> der Modulator hat eine maximale Schaltgeschwindigkeit von 500ns/2Mhz.> Das ist jetzt aber doch 10x schneller als vorhin, oder wie passen die> 5µs jetzt da rein?
5uS würden mir erstmal reichen. Das maximum was er kann wäre das optimum
Für ein wirklich exaktes Timing nimmst Du einen FIFO-Baustein, z.B.
sowas hier:
https://www.renesas.com/eu/en/products/memory-logic/fifo-products/synchronous-fifos/72v36100-64k-x-36-supersync-ii-fifo-33v?
Der hat einen Speicher von 64k-Worten zu 36 Bit. Den Eingäng fütterst Du
aus irgendeiner Quelle, wobei das Timing da unkritisch ist - du musst
eben nur im Mittel die Datenrate schaffen. Die reingeschriebenen Daten
kannst Du ab Ausgang abholen, wobei mit jedem RXCLK ein Wort
herausfällt. Die Genauigkeit des RXCLK bestimmt die Genauigkeit des
gesamten Systems, und so bekommst Du ein wirklich präzises Timing hin.
Dieser konkrete FIFO kann auch Busbreiten umsetzen. D.h. Du kannst mit
18 Bit reinschreiben und mit 36 Bit auslesen.
Als Controller würde ich irgend einen 32-Bit Controller mit genügend
IO-Pins nehmen. Digikey hat z.B. gerade TM4C1233 im TQFP144 lieferbar.
(296-35820-ND).
Heutzutage werden FIFOs nur noch selten als Einzelbausteine eingesetzt,
sondern finden sich in vielen FPGAs.
fchk
RP2040
Mit dem PIO des Raspberry-Mikrocontrollers sollten sich Timing-Wünsche
sehr präzise und jitterfrei erfüllen lassen.
Daten-Nachschub geht per DMA.
Tilo R. schrieb:> RP2040>> Mit dem PIO des Raspberry-Mikrocontrollers sollten sich Timing-Wünsche> sehr präzise und jitterfrei erfüllen lassen.> Daten-Nachschub geht per DMA.
So ist es. Allerdings wird es mit den Pins etwas eng. Wenn man 24 für
die Ausgabe braucht, bleiben nur noch genau zwei für andere Aufgaben
über...
STM32 mit FMC, die Adressleitungen werden als Datenausgänge
"mißbraucht", dann den Write-FIFO (für Adressen und Daten!!!) via CPU
regelmäßig nachfüllen. Die Datenleitungen des FMC bleiben für
anderweitige Verwendung frei, was als Datum geschrieben wird, ist egal.
Die Datenleitungen zu verwenden, wär' schöner, aber es gibt deren nur
16. Man könnte aber natürlich auch "mischen", dann käme man auf max.
28+16 Ausgänge.
Die Frage ist nicht nur wie schnell die Daten rausgehen, sondern auch
woher sie kommen. Ich nehme an, es muss noch etwas damit gerechnet
werden. Ich wuerd mal an ein FPGA denken.
donvido schrieb:> Wie kommt man darauf eine serielle Schnittstelle (I2S) zu verwenden,> wenn man 24bit parallel übertragen will?
Vielleicht deshalb, weil es Wandlerchips dafür gibt und man mit I2S
ausreichend schnell ist? Mein XMOS-board macht 384kHz Stereo 32 Bit in
I2S, bei S/PDIF über eine Leitung.
Die 56k DSPs haben 24 bit Wortbreite.
Damit ist natuerlich einfach 24 bit parallel und mit genauem
Timing auszugeben.
Wenn man ein Byte "verschwendet" sollten auch alle TMS320C5xyz
das leicht koennen.
Eigentlich alle 32 bit Controller die ein externes
Speicherinterface haben. Z.B. Renesas SH-3/4/...
Schlussendlich tut es ein FPGA natuerlich sowieso.
Wenn der TO nicht ganz ungeschickt ist, auch ein nicht zu
kleiner CPLD.
Aber wie es aussieht, spielt der TO nur mit Bastlermainstreamzeug herum.
Tobi T. schrieb:> Handshake gibt es keinen.> Es soll ein Vector Modulator angesteuert werden der I und Q mittels> jeweils 12 Bit Daten bekommt.> Habe grade geschaut, der Modulator hat eine maximale> Schaltgeschwindigkeit von 500ns/2Mhz. Wenn der uC das schaffen würde> wäre Top
Man nehme Dr. Oetker, ähhh, ein kleines FPGA Evaluation Board mit bissel
SRAM. Damit ist das ein Kinderspiel, mit 2 MHz 24 Bit Datenwörter
jitterfrei auszugeben. Den RAM kann man per SPI über das FPGA an jede
X-beliebigen Controller anbinden und von dort die passenden Daten laden.
Fertig ist der beliebig programmierbare Funktionsgenerator.
Eine andere Möglichkeit wäre ein paralleler FLASH-Speicher, den man mit
einem einfachen CMOS-Zähler ala 74HC4060 oder ähnlich als Adresszähler
benutzt. Den kann man auch sehr gleichmäßig takten und damit die Daten
ausgeben. Das Programmieren ist halt deutlich langsamer. Wenn ein
deutlich kleinerer Speicher ausreicht, tut es auch ein SRAM.
Was man mit dem RasPi und VIEL HACKER Spirit machen könnte.
Man programmiert den LCD-Controller auf die passende Frequenz (einfach)
und gibt ein Bild aus, welches in den 24 Bit RGB-Daten die gewünschten
Daten enthält! Man muss nur dafür sorgen, daß die H/V Sync Ränder
(Front/Back Porch) auf 0 gesetzt werden, damit keine Lücken im
Datenstrom entstehen. Ob der LCD-Controller das mitmacht, weiß ich
nicht. Wenn ja, könnte man dann über das SDI (Serial Digital Interface)
und den Adapter für den Touchscreen eben letzteren ersetzen und die 24
Bild Daten anzapfen, sogar mit zugehörigem Takt! Das alles würde dann
ohne einen Funken CPU-Last laufen, 100% per DMA und mit
Standardhardware!