Forum: Mikrocontroller und Digitale Elektronik Oszilloskop mit STM 32 F7


von Tobias Dudek (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem:

Ich versuche ein Oszilloskop für einen Drehstrommotor zu entwerfen.
Bis jetzt habe ich ein Programm geschrieben, welches über den internen 
ADC den Wert des Stromes misst und einen externen ADC der über SPI die 
Werte der Spannung ausließt. Die Daten sollen über Full-Speed USB (HS 
nicht möglich) an den Rechner geschickt und dort weiter verarbeitet 
werden. Ich habe die Werte auch schon erfolgreich über den virtuellen 
Port und Hterm auslesen können.
Das Problem das ich jetzt habe ist, dass ich nun keine definierte Zeit 
habe und somit die Messung eigentlich Mist ist oder?
Kann mir jemand sagen wie ich die Werte in Echtzeit auf meinen Rechner 
bekomme um somit eine Leistungsanalyse machen kann?

Eingesetzte Hardware:

STM F7 64 Pins mit 3 Internen ADC  und 3 SPI Schnittstellen.
Drei externe ADC (ADS7883 12Bit 3MSPS)
1
  while (1)
2
  {
3
//
4
                                //*******Strommessung beginn******//
5
6
7
HAL_ADC_Start(&hadc3);
8
              HAL_ADC_PollForConversion(&hadc3, 100);
9
10
11
messwertStrom =  HAL_ADC_GetValue(&hadc3);
12
13
double StromInSpannung = 0.0000;
14
StromInSpannung = (3.3/4095 * messwertStrom)-1.65;
15
16
17
18
// Umwandlung in string
19
char outputStrom[60];
20
snprintf(outputStrom, 60, "Die Spannung der Stommessung beträgt = %lf\n", StromInSpannung);
21
22
// sende String mit dezimalwert
23
                CDC_Transmit_FS(outputStrom,strlen(outputStrom));
24
25
26
HAL_Delay(2000);
27
                     //*******Strommessung ende******//
28
                       //*******Spannungsmessung beginn******//
29
//Setzte CS
30
                 HAL_GPIO_WritePin(GPIOI, Rot_Pin, GPIO_PIN_SET);
31
HAL_Delay(2);
32
33
//Rücksetze CS um zu Lesen
34
                  HAL_GPIO_WritePin(GPIOI, Rot_Pin, GPIO_PIN_RESET);
35
36
//Lese Daten
37
                  HAL_SPI_Receive(&hspi2, spiRxBuf, 2, 50);
38
39
//Setzte CS um Lesen zu beenden
40
                  HAL_GPIO_WritePin(GPIOI, Rot_Pin, GPIO_PIN_SET);
41
HAL_Delay(5);
42
43
//Drehen der arrays
44
usbTxBuf[0] = spiRxBuf[1];
45
usbTxBuf[1] = spiRxBuf[0];
46
47
//8bit in 16bit wandeln
48
uint16_t* ziel_zeiger = (uint16_t*) usbTxBuf;
49
50
//Zeiger in Variable schreiben
51
messwertSpannung = *ziel_zeiger;
52
messwertSpannung = messwertSpannung>>2 ;
53
54
double SannungInSpannung = 0.0000;
55
SannungInSpannung = (3.3/4095 * messwertSpannung);
56
57
58
// Umwandlung in string
59
char outputSpannung[70];
60
char outputSpannung1[70];
61
                  snprintf(outputSpannung, 70,"Die Spannung der Spannungsmessung beträgt = %lf VOLT\n", SannungInSpannung);
62
63
64
HAL_Delay(20);
65
                  CDC_Transmit_FS(outputSpannung,strlen(outputSpannung));
66
                     //*******Spannungsmessung ende******//

von C. U. (chriull)


Lesenswert?

Tobias Dudek schrieb:
> Hallo,
>
> ich habe folgendes Problem:
>
> Ich versuche ein Oszilloskop für einen Drehstrommotor zu entwerfen.
> Bis jetzt habe ich ein Programm geschrieben, welches über den internen
> ADC den Wert des Stromes misst und einen externen ADC der über SPI die
> Werte der Spannung ausließt. Die Daten sollen über Full-Speed USB (HS
> nicht möglich) an den Rechner geschickt und dort weiter verarbeitet
> werden. Ich habe die Werte auch schon erfolgreich über den virtuellen
> Port und Hterm auslesen können.
> Das Problem das ich jetzt habe ist, dass ich nun keine definierte Zeit
> habe und somit die Messung eigentlich Mist ist oder?

Dazu einfach den Zeitstempel bei jeder Messung abspeichern und 
mitübertragen.

> Kann mir jemand sagen wie ich die Werte in Echtzeit auf meinen Rechner
> bekomme

Für "Echtzeit" musst du die Daten gleich schnell/schneller übertragen 
als du sie misst. So wie es aussieht bist du durch das Full Speed USB 
begrenzt. Falls du schneller misst (messen musst) kannst du die Daten ja 
im uC vorverarbeiten und dann nur entsprechende Durchschnitts (plus ev. 
Min Max Werte) an den PC schicken.

>um somit eine Leistungsanalyse machen kann?

Damit das Sinn macht solltest du dir Gedanken über den systematischen 
Fehler deines Aufbaus machen: du misst Strom und Spannung nicht zur 
gleichen Zeit (du hast einiges zwischen die ADC Abfragen reingepackt), 
Änderungsgeschwindigkeit der Eingangssignale vs Abtastfrequenz, etc...
Dabei müssen sich die zeitlichen Anforderungen zur sinnvollen 
Strom/Spannungsmessung für eine ausreichend genaue Leistungserfassung ja 
nicht unbedingt mit der benötigten Anzahl der 
(Durschnitts)leistungswerte für die Echtzeitanalyse am PC decken. Als 
(extremes) Beispiel: Eventuell reicht dir ja ein 
Durchschnittsleistungswert je Sekunde am PC für die Analyse, aber der uC 
muß mit 10kHz samplen, damit die Daten Sinn machen...

von Regeln Erklehrbehr (Gast)


Angehängte Dateien:

Lesenswert?

Tobias Dudek schrieb:
> ich habe folgendes Problem:

Du hast noch ganz andere Probleme.

... wenn du es nicht schaffst einfache Regeln zu beachten
und deine Tabulierung der Source in den Griff zu kriegen.

Das spricht Bände ....

von Tobias Dudek (Gast)


Lesenswert?

@Christian U.

Danke für deine Antwort.
Ich werde es gleich versuchen.



Christian U. schrieb:
> Dazu einfach den Zeitstempel bei jeder Messung abspeichern und
> mitübertragen.

Was mir bei dieser Thematik noch nicht klar ist, ist ob ich ein 
separates Programm schreiben muss für die Übertagung per USB oder wie 
ich mir die Werte am besten sinnvoll abspeichern kann, um sie nachher 
weiter zu verarbeiten.

Ich wollte die Visualisierung mit Python und Dash umsetzten. Macht es 
Sinn es alles in eine Textdatei zu schreiben und diese hinterher 
auszulesen?

Christian U. schrieb:
> So wie es aussieht bist du durch das Full Speed USB
> begrenzt. Falls du schneller misst (messen musst) kannst du die Daten ja
> im uC vorverarbeiten und dann nur entsprechende Durchschnitts (plus ev.
> Min Max Werte) an den PC schicken.

Also muss ich in einer definierten Zeit Messen (wenn ja wie?) und den 
Wert auf dem µC speichern und anschließend übertragen?
In dem Fall wüsste ich ja welcher Zeitabstand zwischen meinen Messungen 
liegt oder?


Wegen der Echtzeit wäre es nicht so schlimm, wenn ich mir schon mal 
zeitversetzt mir den Sinus anzeigen lassen könnte.

von gdfgsdgsg (Gast)


Lesenswert?

dann mach dich mal schlau ...
es gibt mehrere ADC die sich zB durch einen timer triggern lassen
damit diese sogar syncron laufen

Die Daten zB timergetriggert per DMA in einen buffer und diese Daten 
lassen sich dann auch halbwegs verwerten

Das zu konfigurieren ist aber ein krampf ^^
Da muss man schon mal gut überlegen

von C. U. (chriull)


Lesenswert?

Tobias Dudek schrieb:

> Was mir bei dieser Thematik noch nicht klar ist, ist ob ich ein
> separates Programm schreiben muss für die Übertagung per USB oder wie
> ich mir die Werte am besten sinnvoll abspeichern kann, um sie nachher
> weiter zu verarbeiten.
>
> Ich wollte die Visualisierung mit Python und Dash umsetzten. Macht es
> Sinn es alles in eine Textdatei zu schreiben und diese hinterher
> auszulesen?

Das ist deine Entscheidung - du kannst sie auch "gleichzeitig" anzeigen 
und abspeichern...


> Also muss ich in einer definierten Zeit Messen (wenn ja wie?) und den
> Wert auf dem µC speichern und anschließend übertragen?
> In dem Fall wüsste ich ja welcher Zeitabstand zwischen meinen Messungen
> liegt oder?

Fang noch mal "ganz von vorne" an.
Was willst du messen: eine Phase des Drehstrommotors - um welche 
Drehzahlbereiche geht es, welche Frequenzen ergeben sich daraus?
Oder doch die gleichgerichteten 3 Phasen?
Wie schaut die Last aus: mögliche Lastwechsel (wie schnell, oft und wie 
"stark")
Was möchtest du analysieren/anzeigen?
Daraus ergeben sich die Anforderungen an deine ADCs: wie oft musst du 
messen, wie genau muss dein Zeitstempel sein, wie "gleichzeitig" 
brauchst du die Messung von U und I. Wenn du entscheidest in konstanten 
Zeitabständen zu messen, entfällt dir die Ubertragung des Zeitstempels 
an den PC...

Dann kommt deine USB Übertragung. Schafft sie die notwendigen Daten in 
Echtzeit? (Kleiner Tipp: wenn du keinen fixen Text mitüberträgst sondern 
nur die Daten geht es um einiges flotter. Auch die Daten selbst solltest 
du nicht als Text übertragen, falls es Durchsatzprobleme gibt)
Falls sich die Übertragung ebenfalls ausgeht steht deiner 
Echtzeitauswertung/anzeige nichts mehr im Weg.
Falls nicht kannst du entweder die Daten im uC speichern und verzögert 
am PC bearbeiten, und/oder (weniger) Durchschnittswerte weiterhin in 
Echtzeit zum PC schicken.

Oder du möchtest nur ein U/I Oszilloskop mit deinen vorhandenen 
Bauteilen - dann schau wo die Beschränkung liegt, und übertrage einfach 
mal was maximal möglich ist.

Viel Spaß bei der Analyse und den ersten Tests. Halte und am Laufenden 
mit deinen Fortschritten!

von Tobias Dudek (Gast)


Lesenswert?

Christian U. schrieb:
> ang noch mal "ganz von vorne" an.
> Was willst du messen: eine Phase des Drehstrommotors - um welche
> Drehzahlbereiche geht es, welche Frequenzen ergeben sich daraus?
> Oder doch die gleichgerichteten 3 Phasen?
> Wie schaut die Last aus: mögliche Lastwechsel (wie schnell, oft und wie
> "stark")
> Was möchtest du analysieren/anzeigen?

Also ich möchte nur einen Drehstrommotor anschließen, welcher mit einem 
normalen Drehstromnetz verbunden ist (50Hz) die Idee ist dabei den Sinus 
der Spannung und des Stromes anzeigen zu lassen. Optimal wäre es auch 
Oberwellen zu sehen. Ich dachte im grobsten Fall würde ja für den Sinus 
eine Abtastrate von 100Hz reichen (ganz grob). Wenn ich jetzt mit Faktor 
10 oder 100 abtaste ist das ausreichend in erster Linie.
Wenn ich die Abfrage so mache wie ich sie momentan durchführe, würde es 
ausreichen wenn ich die Wandelzeit herausfinde und den Rest durch

HAL_Delay(die restliche zeit bis 0.1ms); ?

Oder kann ich damit nicht sicherstellen das ich wirklich mit 1K Sample 
abtaste?


Oder muss ich schauen wie ich das durch Interrupts löse?

Eingangs seitig habe ich meine Platine so ausgelegt das ich die Strang 
Spannung und den Sprang Strom messe.

Hardware seitig kann ich leider nichts mehr drehen weil ich die Platine 
schon entworfen habe und alle Bauteile bestellt sind.

Mein großtes Problem ist wie ich definiert Sachen kann das ich zum 
Beispiel mit 1K Sample abtaste.
Das ist mein erstes Projekt mit einem STM32.

Christian U. schrieb:
> Das ist deine Entscheidung - du kannst sie auch "gleichzeitig" anzeigen
> und abspeichern...

An dieser Front bin ich schon soweit das ich die Daten welche ich mir 
den obigen Code erzeuge anzeigen lassen kann.
Das alles bringt mir nur nichts wenn die Werte nur quatsch sind die ich 
messe.

von C. U. (chriull)


Lesenswert?

Tobias Dudek schrieb:

> Also ich möchte nur einen Drehstrommotor anschließen, welcher mit einem
> normalen Drehstromnetz verbunden ist (50Hz)

Was ist für dich ein normales Drehstromnetz? Der 380V Drehstrom?
Dann  hast Du hoffentlich eine ordentliche galvanische Trennung 
vorgesehen?

>die Idee ist dabei den Sinus
> der Spannung und des Stromes anzeigen zu lassen.
Einer Phase?

Optimal wäre es auch
> Oberwellen zu sehen. Ich dachte im grobsten Fall würde ja für den Sinus
> eine Abtastrate von 100Hz reichen (ganz grob).
Um die 50Hz zu messen reichen 100Hz gerade nicht ?- nach dem 
Abtasttheorem braucht man mehr als die doppelte Samplingrate. Allerdings 
sieht man da nicht viel wenn du die gemessenen Werte einfach nur 
anzeigst - du müsstest dann den Sinus wieder "rekonstruieren": z.B.: 
https://de.m.wikipedia.org/wiki/Nyquist-Shannon-Abtasttheorem

> Wenn ich jetzt mit Faktor
> 10 oder 100 abtaste ist das ausreichend in erster Linie.
> Wenn ich die Abfrage so mache wie ich sie momentan durchführe, würde es
> ausreichen wenn ich die Wandelzeit herausfinde und den Rest durch
>
> HAL_Delay(die restliche zeit bis 0.1ms); ?
>
> Oder kann ich damit nicht sicherstellen das ich wirklich mit 1K Sample
> abtaste?

Dann müsstest du die Zeit messen, die du für die zwei ADCs, die 
Datenübertragung und das Programm selbst brauchst, dann kannst du die 
Restzeit mit dem delay warten.

> Oder muss ich schauen wie ich das durch Interrupts löse?

Wäre einfacher.

Und du solltest einmal überlegen ob sich das zeitlich ausgeht. 
Wandelzeit und Übertragungszeit.

> Eingangs seitig habe ich meine Platine so ausgelegt das ich die Strang
> Spannung und den Sprang Strom messe.
>
> Hardware seitig kann ich leider nichts mehr drehen weil ich die Platine
> schon entworfen habe und alle Bauteile bestellt sind.
>
> Mein großtes Problem ist wie ich definiert Sachen kann das ich zum
> Beispiel mit 1K Sample abtaste.
> Das ist mein erstes Projekt mit einem STM32.

Dann besorg dir Bespielprogramme, Beschreibungen, les dich ein und 
teste!
So wie es (derzeit) aussieht macht das niemand für dich.

> Christian U. schrieb:
>> Das ist deine Entscheidung - du kannst sie auch "gleichzeitig" anzeigen
>> und abspeichern...
>
> An dieser Front bin ich schon soweit das ich die Daten welche ich mir
> den obigen Code erzeuge anzeigen lassen kann.
> Das alles bringt mir nur nichts wenn die Werte nur quatsch sind die ich
> messe.

Die Werte sind per se nicht quatsch - du weißt was du wann, wie wo 
gemessen hast und musst sie richtig interpretieren. Oder so 
messen/vorbereiten, dass sie für deine Aufgabe sinnvoll(er) nutzbar 
sind.
Deswegen im Post davor die vielen Fragen - das wäre ein Start das du 
etwas Systematik in dein Projekt bringst und anfängst zu verstehen was 
du warum machst...

von Tobias D. (Gast)


Lesenswert?

Ok vielen Dank für die vielen Tipps :-)

Dann mach ich mich mal an die Arbeit und schreibe in paar Tagen meine 
Erfolge/Misserfolge.

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.