Forum: Mikrocontroller und Digitale Elektronik STM32F4 Wie programmiert man ein 8 Kanal DSO auf einem µC?


von Oliver F. (ollif)


Lesenswert?

Hallo Forum,

ich möchte mir ein mehrkanaliges DSO auf Basis eines STM32F4 Discovery 
board bauen.

Weiss aber nicht genau ob mein Ansatz falsch oder richtig ist .


Vorraussetzungen:

8 Kanäle
10-12 Bit
Samplerate von 1Mhz ~ 100Khz  Analogbandbreite je Kanal.
STM32F4 Discovery board

Programmierung in C

Ausgabe der Daten über USB an PC (Windows) und Darstellung der Kurven.

Wie stellt man den sicher daß die 8 Kanäle zeitlich synchron sind?

Meine idee wäre:

8  x int_16 Array mit der größe 800 (entspricht der Horizontalen Pixel 
anzahl der Anzeige)

Diese Arrays werden in einer ISR (jede µs) mit den Werten der DACs 
befüllt (DMA?)

Ist das Array "voll" wird es per USB an den PC übertragen.

Trigger lass ich erst mal außen vor!

Ist dies vom Prinzip der richtige Weg oder ist es total falsch?

Geht das von der Geschwindigkeit auch wenn ich später extern Wandler 
nehmen möchte?

Hier auch die Antwort warum ich so etwas brauche:
Für mein polyphones Synthesizer Projekt muss ich immer 8 
Steuerspannungen, Hüllkurven, oder Modulationsgeneratoren im Blick haben 
und auch deren Synchronität beurteilen können.

Vielen Dank im Voraus

Gruß

Oliver

: Bearbeitet durch User
von Andreas K. (andreasmc)


Lesenswert?

Hat der nicht nur 3 ADCs? Also maximal 3 Messungen exakt gleichzeitig 
...

von Oliver F. (ollif)


Lesenswert?

Andreas K. schrieb:
> Hat der nicht nur 3 ADCs? Also maximal 3 Messungen exakt gleichzeitig
> ...

Hallo Andreas,

Auszug aus dem Datenblatt:
<<
2.2.35 Analog-to-digital converters (ADCs)
Three 12-bit analog-to-digital converters are embedded and each ADC 
shares up to 16
external channels, performing conversions in the single-shot or scan 
mode. In scan mode,
automatic conversion is performed on a selected group of analog inputs.
Additional logic functions embedded in the ADC interface allow:
• Simultaneous sample and hold
• Interleaved sample and hold
The ADC can be served by the DMA controller. An analog watchdog feature 
allows very
precise monitoring of the converted voltage of one, some or all selected 
channels. An
interrupt is generated when the converted voltage is outside the 
programmed thresholds.
To synchronize A/D conversion and timers, the ADCs could be triggered by 
any of TIM1,
TIM2, TIM3, TIM4, TIM5, or TIM8 timer.

>>

liest sich für mich dass ich bis zu 16 analoge Kanäle lesen kann.

Aber wenn es mit den internen ADCs nur 3 Kanäle sind ist das für die 
generelle Vorgehensweise auch egal.


Gruß

Oliver

von 6a66 (Gast)


Lesenswert?

Oliver F. schrieb:
> Samplerate von 1Mhz ~ 100Khz  Analogbandbreite je Kanal.
> STM32F4 Discovery board

8 Kanäle mit 1MHz Samplerate gibt 8MS/s. Das schaffen die STMs meines 
Wissens nach nicht. Dann bräuchtest Du einen externen DAC.

Oliver F. schrieb:
> Diese Arrays werden in einer ISR (jede µs) mit den Werten der DACs
> befüllt (DMA?)
>
> Ist das Array "voll" wird es per USB an den PC übertragen.

Das sind dann 16MB/s bei 8MS/s. Nicht lasch aber braucht schon auch eine 
sorgfältig aufgesetzte Datenpumpe, denn du hast die Werte dreimal zu 
bewegen: einmal vom ADC/SPI in den Speicher, einmal vom Speicher auf's 
Display und einmal von Speicher zum USB (das könnte man evtl auch sein 
lassen), sind netto 48MB die Deine DMA bewegen soll. Und rechnen soll 
der Pruzessor auch noch. Hmm, da bleibt nicht viel Rechenleistung übrig. 
Also wirst Du nicht mit 1MHz / 800pixel = 1,25kHz refreshen können 
sondern erstmal samplen mit DMA, dann auswerten, dann Anzeigen und USB 
transferieren und gleichzeitig neu samplen (aber dann eben  nicht mehr 
rechnen).

Was dann effektiv an Displayrate bleibt muss mann sehen.

rgds

von Stefan K. (stefan64)


Lesenswert?

Oliver F. schrieb:
> Wie stellt man den sicher daß die 8 Kanäle zeitlich synchron sind?


Wenn Du zeitlich synchron genau nimmst, dann sind es nur 3 Kanäle, 
jeweile einer pro ADC. 16 Kanäle kannst Du zwar einlesen, aber nicht 
alle zum exakt gleichen Zeitpunkt.

Gruß, Stefan

von Oliver F. (ollif)


Lesenswert?

6a66 schrieb:
> Das sind dann 16MB/s bei 8MS/s. Nicht lasch aber braucht schon auch eine
> sorgfältig aufgesetzte Datenpumpe, denn du hast die Werte dreimal zu
> bewegen: einmal vom ADC/SPI in den Speicher, einmal vom Speicher auf's
> Display und einmal von Speicher zum USB (das könnte man evtl auch sein
> lassen), sind netto 48MB die Deine DMA bewegen soll.

Hallo,

Hier habe ich mich schlecht ausgedrückt am STMBoard ist kein Display 
angeschlossen. Die 800 Pixel sind die vom Fenster(Anzeigebereich) auf 
dem PC.

Gruß

Oliver

von m.n. (Gast)


Lesenswert?

Oliver F. schrieb:
> Für mein polyphones Synthesizer Projekt muss ich immer 8
> Steuerspannungen, Hüllkurven, oder Modulationsgeneratoren im Blick haben

Muß man dafür denn so schnell abtasten? Klär mal Deinen tatsächlichen 
Bedarf.

von Oliver F. (ollif)


Lesenswert?

m.n. schrieb:
> Oliver F. schrieb:
>> Für mein polyphones Synthesizer Projekt muss ich immer 8
>> Steuerspannungen, Hüllkurven, oder Modulationsgeneratoren im Blick haben
>
> Muß man dafür denn so schnell abtasten? Klär mal Deinen tatsächlichen
> Bedarf.

Hallo,

geht auch mit 10Khz Bandbreite da die Hüllkurven aktuell eine Updaterate 
von 1 kHz haben. Dies möchte ich später nach oben hin optimieren. Möchte 
aber auch bis in den Audio bereich messen.

Gruß

Oliver

von m.n. (Gast)


Lesenswert?

Oliver F. schrieb:
> geht auch mit 10Khz Bandbreite da die Hüllkurven aktuell eine Updaterate
> von 1 kHz haben. Dies möchte ich später nach oben hin optimieren. Möchte
> aber auch bis in den Audio bereich messen

Dann taste mit 10 kHz ab. Wenn Du den/die ADCs mit 1 µs Zyklus 
betreibst, hast Du spätestens alle 10 µs alle acht Kanäle eingelesen.
Alles kein Problem.

von Little B. (lil-b)


Lesenswert?

Ich möchte dir davon abraten, ein Discovery Board als Oszilloskop zu 
verwenden. Es wird sicher machbar sein, jedoch wird es kein 
professionelles Messgerät sein.

Probleme hierbei sind:
- Die drei ADCs des STM32F4 können zusammen bis zu 7,2MSPS erreichen. 
Also schaffen diese bei 16 Kanälen nur bis zu 450kSPS, und das auch nur 
im optimalen Fall bei voller Auslastung.
- Die ADCs des STM sind alles andere als genau. Je nach Board design 
kann man etwa 6 bis 8 Bit der möglichen 12 Bits auswerten, weil der Rest 
in Rauschen untergeht.
- Und da kommt man schon zum nächsten Punkt: Das Discovery Board ist 
nicht für Analogmessungen ausgelegt.
- Die USB-Schnittstelle des Discovery Boards hat nur USB Full Speed, 
also schaffst du maximal 1,5MB/s, wenn sonst niemand auf dem Bus 
unterwegs ist.

Aber wie gesagt, machbar ist es sicher, aber es wird nicht leicht und du 
musst Abstriche machen.

Ein Kommerzielles Produkt, was etwa das kann, was du benötigst: Der 
Saleae Logic 8
https://www.saleae.com/

Der hat 10bit und kann mit 8 kanälen bis zu 2,5MSPS. Verbaut ist hier 
ein Spartan6

von m.n. (Gast)


Lesenswert?

Little B. schrieb:
> - Die ADCs des STM sind alles andere als genau. Je nach Board design
> kann man etwa 6 bis 8 Bit der möglichen 12 Bits auswerten, weil der Rest
> in Rauschen untergeht.

Dann machst Du offensichtlich grundlegende Sachen falsch!


> - Und da kommt man schon zum nächsten Punkt: Das Discovery Board ist
> nicht für Analogmessungen ausgelegt.

So ein Blödsinn!

> Also schaffen diese bei 16 Kanälen nur bis zu 450kSPS,

Hör auf zu jammern; das ist Faktor 45 schneller als erforderlich.

von Oliver F. (ollif)


Lesenswert?

Hallo,

Dann werde ich meine Specs massiv nach unten korrigieren:

Ich starte dann mit 100kSPS~ etwa 10kHz Analogbandbreit langt für 
Hüllkurven und Modulation. Wenn die internen Wandler so schlecht sind 
kommen später halt externe dran.

Gruß

Oliver

von WehOhWeh (Gast)


Lesenswert?

Little B. schrieb:
> - Die ADCs des STM sind alles andere als genau. Je nach Board design
> kann man etwa 6 bis 8 Bit der möglichen 12 Bits auswerten, weil der Rest
> in Rauschen untergeht.

Man kommt problemlos auf 1-2LSB Rauschen herunter. und auf <3 LSB kommt 
man ganz leicht, ohne Hirnschmalz in die Schaltung zu investieren.

Ich habe schon öfter einfache analoge Sachen mit STM32 umgesetzt, und 
das ging bisher immer auf <3LSB Rauschen, auch mit 12 Bit Auflösung.

Der Kardinalsfehler der meisten ist halt, die verrauschte digitale 
Versorgung als 1:1 als Referenz oder Analogversorgun zu verwenden. Nimmt 
man die als Referenz, dann hat man den ganzen Rippel der Versorgung 
gleich in der Messung. Und 5mV Rippel sind nicht viel für einen 
Schaltregler, aber schon mal schnell 6 LSB Rauschen in der Messung...

@Topic:
Alleine das RAM ist schon viel zu klein!
Dazu die Samplerate: Ein billiges Rigol hat 1GSPS, der STM32 schafft so 
8MSPS. Da reden wir von Faktor 125.
Der STM32F4 ist zum steuern von Toastern oder Heizungen gedacht, für ein 
Oszilloskop braucht man schon eine ganz andere Kategorie.

von Stefan K. (stefan64)


Lesenswert?

Ich denke, der TS hat sich mit "Oszilloskop" etwas unglücklich 
ausgedrückt. Seine wahren Anforderungen sind viel niedriger als es 
dieses Wort suggeriert. Und damit auch locker mit dem STM32F4 machbar.

Gruß, Stefan

von m.n. (Gast)


Lesenswert?

Oliver F. schrieb:
> Ich starte dann mit 100kSPS~ etwa 10kHz Analogbandbreit langt für
> Hüllkurven und Modulation.

Gut, fang erst einmal mit erreichbaren Vorgaben an.
Wichtiger als die Erfassung wäre meines Erachtens, den Transport der 
Daten hinreichend schnell zu organisieren. Viel Erfolg!

von Little B. (lil-b)


Lesenswert?

m.n. schrieb:
> Little B. schrieb:
>> - Die ADCs des STM sind alles andere als genau. Je nach Board design
>> kann man etwa 6 bis 8 Bit der möglichen 12 Bits auswerten, weil der Rest
>> in Rauschen untergeht.
>
> Dann machst Du offensichtlich grundlegende Sachen falsch!
>
>> - Und da kommt man schon zum nächsten Punkt: Das Discovery Board ist
>> nicht für Analogmessungen ausgelegt.
>
> So ein Blödsinn!
>
>> Also schaffen diese bei 16 Kanälen nur bis zu 450kSPS,
>
> Hör auf zu jammern; das ist Faktor 45 schneller als erforderlich.

Ich untermauer meine Aussage mal mit ein paar Quellen

Beitrag "STM32 schwankende ADC Werte..PULL Widerstände steuern"

http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/DM00050879.pdf

Hier wird genau das Problem beschrieben. ST ist das bekannt und hat 
deshalb eine Application Note veröffentlicht. (Hier wird sogar 
vorgeschlagen, wegen der Ungenauigkeit Mittelwerte zu bilden).

Auf dem Discovery Board wird Vref mit Vdd versorgt, dazu noch 
(vermutlich) lange Messleitungen und Masseschleifen, dann noch USB auf 
der selben Platine. So komme ich auf die pessimistische Einschätzung von 
8 nutzbaren Bits.


Für den STM32F7 gibts demoapplikationen für ein DSO, aber nur 1-kanalig. 
Dieses ist schnell mit STQube zusammen geklickt und wurde bei dem 
STM32F7-Handson demonstriert. Du musst nur alle drei ADCs verwenden und 
die Kanäle gleichmäßig auf diesen verteilen. Der DMA füllt dann einen 
Puffer, den du Anschließend über USB raus haust.

Aber vergiss nicht, dass du langsamer senden kannst, als du samplen 
kannst! Entweder Samplerate deutlich reduzieren, oder Fenster-weise 
übertragen, oder One-Shot den Speicher voll laufen lassen und dann erst 
alles übertragen.

von Axel S. (a-za-z0-9)


Lesenswert?

Oliver F. schrieb:
> Wie stellt man den sicher daß die 8 Kanäle zeitlich synchron sind?

Indem man 8 ADC-Kanäle hat, jeden mit seiner eigen S&H-STufe. Und die 
synchron ansteuert (taktet und startet).

> Hier auch die Antwort warum ich so etwas brauche:
> Für mein polyphones Synthesizer Projekt muss ich immer 8
> Steuerspannungen, Hüllkurven, oder Modulationsgeneratoren im Blick haben
> und auch deren Synchronität beurteilen können.

Dazu brauchst du aber keine 8 synchron laufenden ADC-Kanäle. Dafür ist 
es vollkommen ausreichend, wenn die 8 Analog-Eingänge mit einem ADC im 
Scanmodus bei konstanter Frequenz eingelesen werden.

Durch die zeitliche Diskretisierung besteht so ein Signal auf der 
Digitalseite ohnehin nur aus diskreten Stützstellen, zwischen denen 
interpoliert werden muß. Wenn die Software die Abtast-Sequenz der 
Hardware kennt, dann kann sie die Stützstellen auch korrekt auf dem 
Display anordnen. Sofern man überhaupt so weit in das Signal reinzommt, 
daß mehr als 1 Pixel pro Abtatstzyklus vorhanden ist.

Mal zur Einordnung: früher haben wir mit analogen Zweikanal-Oszis 
gearbeitet, die zwischen den Kanälen mit ein paar kHz umgeschaltet 
haben. Das hat vollkommen gereicht.

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.