Kann ein STM32F1 (BluePill) das 1Msps A/D mit CLK

OP #6345350
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.
Gast #6345385
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.
#6345408
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.
Gast #6345409
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.
OP #6345564
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.
(Firma: fritzler-avr.de) #6345985
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.
Gast #6346125
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren