STM32F107 SPI -> UART maximale Übertragungsrate

Ich entwerfe ein Board mit STM32F107- Mikrocontroller und AD7680- ADC. Was ich brauche, ist, Daten vom ADC zu lesen, die Sequenznummer nach dem Lesen jeder Probe zu erhöhen und ADC-Werte über UART oder USB OTG (USB CDC-Gerät) an einen Computer zu senden. Außerdem muss ich die steigende Flanke an einem einzelnen GPIO-Trigger-Pin erfassen und mir die Sequenznummer zum Zeitpunkt des Triggerns merken.

Die Hauptbeschränkung ist die Geschwindigkeit – ich muss es so schnell wie möglich machen. Da ich nicht allzu viel Erfahrung mit Cortex-MCUs habe, habe ich zwei Fragen:

  • Ist es möglich, dieses Szenario mit DMA zu erreichen (dh ohne eine Schleife, die die gesamte CPU-Zeit verbraucht)?

  • Ich weiß, es ist schwierig, aber kann jemand die maximal erreichbare Abtastrate (5 kHz, 20 kHz, 50 kHz...) abschätzen?

Vielen Dank im Voraus, Anregungen sind willkommen.

Klasyc

Antworten (1)

DMA kann verwendet werden, aber es macht nur Sinn, wenn Sie die Samples in "Blöcken" sammeln. Beispielsweise erfasst DMA 100 ADC-Samples und legt sie in einem bestimmten Bereich im Speicher ab. Sobald dies erledigt ist, senden Sie den gesamten Block unter Verwendung eines anderen DMA-Kanals durch den UART, und gleichzeitig erfasst der erste DMA-Kanal weitere 100 ADC-Samples in einen anderen Bereich im Speicher. Wiederholen.

Es funktioniert jedoch nicht mit der USB-Schnittstelle am STM32F107. DMA interagiert nicht direkt mit USB, da USB über einen dedizierten Paketpuffer verfügt. Sie könnten jedoch DMA verwenden, um Daten an diesen Paketpuffer zu übertragen.

Sie müssen jedoch natürlich immer noch eine Hauptschleife haben. Nur wird es alle 100 Samples statt für jedes Sample aufgerufen, was etwas CPU-Leistung freisetzt. Der Kompromiss besteht jedoch darin, dass es eine zusätzliche Latenz gibt, um die Samples zu erhalten.

Um nun die maximale Datenrate abzuschätzen, gibt es drei einschränkende Faktoren: die CPU, den ADC und die Ausgangskommunikationsschnittstelle. Ich denke, die CPU wird nicht der Engpass sein, es sei denn, Sie betreiben sie mit einer sehr niedrigen Frequenz. Der Flaschenhals wird die Peripherie sein. Der ADC führt die Konvertierung in etwa 1 µS durch, daher ist dies für die von Ihnen in Ihrer Frage genannten Raten in Ordnung. Jetzt das Ausgangsperipheriegerät: Wenn es der UART ist, hängt alles von der Baudrate ab, die Sie verwenden möchten, und die Mathematik ist schnell erledigt: bei 4,5 Mbit/s (maximale Geschwindigkeit für USART1), mit 16 Bit pro Abtastung (ADC ist 12 Bit, aber Sie müssen die Sample-Größe auf ein ganzes Byte runden), macht es etwa 280 kSamples/Sekunde. Möglicherweise haben Sie aufgrund des Protokolls etwas Overhead, also machen Sie es etwas weniger. Für USB ist die Mathematik die gleiche, außer dass die Kommunikationsgeschwindigkeit 12 MBit/s beträgt, aber der Protokoll-Overhead wird größer sein. Am Ende werden Sie mindestens so schnell fahren können wie mit dem USART.

Bearbeiten : Entschuldigung, ich habe gerade festgestellt, dass der ADC extern ist. Aber es ändert nichts an dem, was ich gesagt habe, außer dass die Samples von SPI stammen (und DMA sollte dann mit SPI interagieren). Der begrenzende Faktor hier wird also tatsächlich der ADC selbst sein, bei 100ksps.