Forum: Mikrocontroller und Digitale Elektronik Kann ein STM32F1 (BluePill) das 1Msps A/D mit CLK


von Michael B. (laberkopp)


Lesenswert?

Hi Leute

Bevor ich mir einen STM in Form eines BluePill, WeMos oder Nucleo kaufe 
und in die Software einarbeite, bloss um vielleicht festzustellen, daß 
es mit ihm doch nicht geht, frage ich mal lieber Leute dich sich schon 
auskennen:

Ich muss ein Analogsignal mit ungefähr 1Msps abtasten, dabei aber ein 
CLK Signal mit steigender und fallender Flanke erzeugen.

Offiziell kann ein STM32 das, sein A/D ist laut Datenblatt schnell 
genug, aber das I/O Verhalten ist mit unsynchronem eigenen Takt und 
eventuell DMA etwas unübersichtlich, so daß ich nicht sofort im 
Datenblatt erkennen kann ob es geht.
1
        --     --     --     --
2
CLK ----  -----  -----  -----  ----- 
3
4
A/D -X------X------X------X------X--
Ich muss also an einem GPIO so ein CLK Signal erzeugen (mindestens 200ns 
high und 200ns low, aber auch 1us low und 1us high wäre ok) und 
innerhalb der Pause den A/D-Wandler zur Umwandlung überreden, 
taktsynchron. Die 1Msps müssen nicht genau stimmen, es können auch 
0.5Msps oder 2Msps sein, auch die Zeit des Sampelns ist nicht kritisch, 
irgendwann bevor der nächste Takt losgeht. Die 2048 Samples selbst 
müssen bloss in einem Puffer abgelegt werden, ob 8, 10 oder 12 bit wäre 
egal, dafür sollten die 20k RAM ja reichen, und danach per USB 
weggesendet werden.

Kann ein STM32 das, und mit welcher Art der Programmierung ?
Ich glaube mich sogar daran zu erinnern, daß es schon ein 
Beispielprojekt gab, welches eine solche Art der oszilloskopähnlichen 
Datenerfassung (schnelles Samplen, dann per USB an Rechner übertragen) 
gemacht hat, finde es aber nicht wieder.

von W.S. (Gast)


Lesenswert?

Mache dir nen externen Taktgenerator, per TTL oder CPLD. Triggere damit 
den ADC im µC (wenn das geht!) und benutze den Rest des µC nur zum 
Auffangen der Meßwerte. Das dürfte die einfachste Lösung (über alles 
gesehen) sein.

W.S.

von abs (Gast)


Lesenswert?

Man kann über die Timer des STM32 den ADC Triggern, und parallel mit dem 
selben Timer per OC/PWM das CLK Signal erzeugen.

von Jim M. (turboj)


Lesenswert?

Michael B. schrieb:
> Ich muss also an einem GPIO so ein CLK Signal erzeugen

Macht man am Besten mit einem Timer. Gibt es praktisch immer als 
Hersteller Beispiel Code, Stichwort PWM.

Michael B. schrieb:
> und
> innerhalb der Pause den A/D-Wandler zur Umwandlung überreden,

Schon schwieriger. Mitunter kann man die Sampling Zeit einstellen, wenn 
die lang genug ist könnte man den ADC zusammen mit dem GPIO triggern.

Ansonsten hängt man den ADC an einen anderen Comperator des Timers, der 
gegenüber dem GPIO um ein paar Takte verzögert ist.

Timer-getriggerter ADC sollte IMHO auch ein Hersteller Beispiel sein.

Bei der hohen Samplingrate würde ich die ADC Daten via DMA abholen 
lassen.

Michael B. schrieb:
> und danach per USB
> weggesendet werden.

Ups. Das geht leider nicht: 1MByte/sec ist ABSOLUTES MAXIMUM bei USB 
Full Speed. Das würde grade noch eben so für 8 Datenbits reichen, und 
beim kleinsten Hickser im PC (Windoof mach das öfters) laufen Dir Puffer 
über.

Oder gibt es nach den 2048 Samples jeweils längere Pausenzeiten? Damit 
ginge das.

von abs (Gast)


Lesenswert?

Der ADC unterstützt DMA. Du kannst den DMA auf den ADC und 2048 Samples 
konfigurieren. Nach den 2048 Samplen kannst du dann einen Interrupt 
bekommen, um die Daten wegschicken und den Timer, der den ADC triggert, 
zu deaktivieren.

von Michael B. (laberkopp)


Lesenswert?

Ja, danke, habe ich mir gedacht, daß eine Antwort nicht so einfach ist.
Im Prinzip (Arduino-Pseudocode) soll also das passieren:
1
loop()
2
{
3
  for(i=0;i<2048;i++)
4
  {
5
      digitalWrite(1,HIGH);
6
      digitalWrite(1,LO);
7
      buf[i]=analogRead(0);
8
  }
9
  for(i=0;i<2048;i++) putc(buf[i]);
10
}
nur wäre das natürlich schon wegen des 100us dauernden analogRead viel 
zu langsam, daher STM32.
Nach abs könnte man also wohl auf dem STM32
1
Setze Takt auf 14MHz
2
Enable und kalibriere ADC
3
Setze DMA auf Start von buf, Quelle ADC 16 bit Transfer, count 2048, trigger ADC
4
Setze ADC auf 12 bit, 12,5 Taktzyklen + 1.5 Samplezyklen, wähle Eingangspin und Trigger auf TIM1-Überlauf
5
Setze Timer 1 auf PWM mit TIM1_ARR auf 14 und TIM1_CCR1 auf 10, wähle Ausgangspin.
6
Wenn 2048 Timerzyklen abgelaufen sind, ist der Buffer voll und kann über USB weggesendet werden.
realisieren.

Jim M. schrieb:
> Das geht leider nicht: 1MByte/sec ist ABSOLUTES MAXIMUM bei USB

Er soll ja nach dem Erfassen den ganzen BUffer senden, egal wie lange 
das dauert.

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

W.S. hat mal wieder keine Ahnung, aber er hat ja schon öfter gezeigt, 
dass er von STM32 und programmieren keinen blassen Schimmer hat.

Zum Thema:
abs und Jim habens ja eigentlich schon geschrieben wies geht.
Wenn der STM32 frei laufen darf und von nichts getriggert wird, also 
wierklich nur sampled und danach ein CLK ausgeben soll, dann geht das 
mit einem Timer.

1)
Der DMA wird auf den ADC scharfgestellt.
Mit so viel Transferelementen wie du samples willst oder Doublebuffer 
mode, wenn das kontinuierlich per USB abgeholt werden soll.

2)
Der Timer triggert den ADC, das geht ohne IRQs (im DB gucken welche 
Timer am ADC angeschlossen sind).
zB "Timer 3 TRGO event" beim F103
TIM 3 sendet TRGO dann bei einem Update Event.

3)
Die Wandlungszeit des ADC ist bekannt, daher lässt sich mit dem PWM 
Modus ein PWM Signal erzeugen dessen Flanke erst steigt wenn die 
Wandlung abgeschlossen ist.

Leider kann ein STM32 von Hause aus nur USB fullspeed, für mehr muss ein 
externer ULPI USB PHY angeschlossen werden.
https://www.mouser.de/Semiconductors/Interface-ICs/USB-Interface-IC/_/N-45lw3?Keyword=ulpi&FS=True&Ns=Pricing|0

ARM SOCs mit usb 2.0 hi speed kenne ich persönlich erst ab Cortex-A 
Kloppern.
Aber da wissen Andere vllt mehr.

von sumo (Gast)


Lesenswert?

sam3x8 (android due) kann highspeed usb mit integriertem phy

von Uwe Bonnes (Gast)


Lesenswert?

Der Stm32F103 kann nur USB-FS. Stm32F723 hat internen HS-Phy.

von ... (Gast)


Lesenswert?

W.S. schrieb:
> Mache dir nen externen Taktgenerator, per TTL oder CPLD. Triggere damit
> den ADC im µC (wenn das geht!) und benutze den Rest des µC nur zum
> Auffangen der Meßwerte. Das dürfte die einfachste Lösung (über alles
> gesehen) sein.

Ein Auto wurde bestellt und ein 1 Zylinder Traktor mit Eisenbereifung 
geliefert!.
W.S. kommt aus dem letzten Jahrhundert.

CPLDs sind tot, das haben FPGAs übernommen.
Die gibt es dank Lattice auch in klein ICE40.
Aber heutzutage schaffen die µC das auch alleine.

von lpc (Gast)


Lesenswert?


von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

lpc schrieb:
> Der LPC1837 sollte auch ein Hispeed Phy haben

Kann er denn auch per Timer den ADC triggern?

von lpc (Gast)


Lesenswert?

UM10430 v2.2, section 42.6.1 sagt ja. Ausprobiert habe ich das aber nie, 
ich habe nur einmal mit dem USB-Phy herumgespielt. Der ADC hat auch nur 
10 bit sehe ich gerade...

von Andreas R. (daybyter)


Lesenswert?

Tipp: such mal nach einem Artikel

10$ scope revisited

oder guck mal hier

https://satoshinm.github.io/blog/180105_stm32scope_building_an_amazing_10_oscilloscope_with_an_stm32_blue_pill_lcd_touchscreen_and_stm32-o-scope_software.html

Da gab es einen riesen Thread wie man mit nem blue pill schnell sampled.

Ich glaub mit Overclocking waren es am Ende max 9 MS/s, oder so...

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.