Vor einiger Zeit hat sich der Autor dieser Zeilen verpflichtet, einen kompakten Rekorder für ein einpoliges analoges Signal innerhalb von 3 Volt mit der höchstmöglichen Lesegeschwindigkeit und den niedrigstmöglichen Kosten und Größen zu entwickeln. In der Liste der niedrigstmöglichen Kosten habe ich auch meine Kopfschmerzen eingetragen und den mir bekannten STM32F303 gewählt. Ich erinnere mich, dass dies Cortex-M4 72 Megahertz von einem bekannten Unternehmen ist, mit eingebauten 12-Bit-Analog-Digital-Wandlern (ADC oder ADC, wie Sie möchten) und einer integrierten CAN-Schnittstelle.
Solche kleinen Registrare benötigten mehrere Dutzend. Und das Vorhandensein eines Mikrocontroller-Gehäuses mit 48 Beinen weckte die Hoffnung, dass es möglich sein würde, diesen Leser als kompakt zu bezeichnen. Die CAN-Schnittstelle, mit der ich bereits eine gute Beziehung hatte, gab mir die Möglichkeit, all diesen Jazz auf ziemlich bequeme Weise zu kombinieren.
Die Geschwindigkeit, mit der am Ende alles funktionierte, erwies sich als durchaus geeignet, um die Funktionsfähigkeit des gewählten Ansatzes zu erklären. Es war möglich, einen Abtastschritt von einer halben Mikrosekunde zu erreichen. Kopfschmerzen und Assembler konnten nicht vermieden werden, aber wer erinnert sich jetzt daran?
Es blieb jedoch etwas Sediment zurück. Der Gedanke blieb, dass in Bezug auf die Geschwindigkeit nicht alles herausgedrückt wurde.
Und jetzt ist die STM32G4-Serie kürzlich mit einer Taktfrequenz von bis zu 170 Megahertz mit einer Option in einem kleinen Paket und mit fast denselben schnellen ADCs an Bord in Höhe von fünf Stück erschienen. Es war notwendig, etwas zu tun.
Jetzt stand niemand mehr über der Seele und es bestand kein Grund, sich um Termine und Pläne zu kümmern.
Wenn Sie nicht darüber nachdenken, können Sie sogar die Arbeit genießen. Aber ehrlich gesagt musste ich über die Zeit nachdenken. Lange über kleine Zeit nachdenken (und was, poetisch).
Der Gedanke schlug sich vor, dass wir ein wenig am anderen Ende beginnen sollten. Das heißt, wir müssen von der kürzestmöglichen Zeit für die ADC-Abtastung ausgehen, die basierend auf der Beschreibung 2,5 Taktzyklen dauert und 62,5 Nanosekunden bei 40 MHz (160 MHz / 4) beträgt. Dann bietet sich der Abtastschritt von 100 Nanosekunden an. Die Zahl ist rund und vor allem recht klein und schön. Warum nicht mal probieren?
Darüber hinaus wurde die für Experimente geeignete NUCLEO-G474RE-Platine zum Verkauf angeboten und gekauft. Es war sinnvoll, ein zusätzliches Steckbrett mit zwei zweireihigen Steckverbindern hinzuzufügen, um alle Arten von Drähten und Teilen auf das Steckbrett zu löten und das Hauptbrett nicht zu verderben. So sieht es fertig aus.

Dort unten gibt es mehrere Drähte und einen Widerstand mit einem Kondensator, nehmen Sie mein Wort dafür.
Jetzt müssen Sie ein geeignetes elektrisches Signal an alle vier ADCs gleichzeitig anlegen und sie dann mit einem konstanten Schritt nacheinander ausführen (zunächst beim Debuggen nicht sehr kurz). Warum vier? Gemäß der Beschreibung verbringt jeder ADC 15 Taktzyklen pro Umwandlung oder 0,025 × 15 = 375 Nanosekunden (fast 400). Daher ist in Schritt 100 ein Förderer von vier ADCs erforderlich.
Als Eingangssignal wurde eine RC-Schaltung verwendet, die einfach vom Reglerfuß mit Spannung versorgt wurde. Ich habe dieses Bein zugewiesen, um den TIM5-Timer im Einzelimpulsmodus zu steuern.
Der minimale Schaltplan sah wie in der Abbildung unten aus.

ADC1-ADC4 waren beteiligt. Die Bittiefe konnte für eine gewisse Geschwindigkeitssteigerung verringert werden, aber 12 Bits überwogen, da ich die Genauigkeit der Messungen nicht verlieren wollte. Um jeden ADC in der erforderlichen Reihenfolge und mit dem erforderlichen Schritt zu starten, werden drei Timer (TIM2, TIM3, TIM4) und ein anderer Timer (TIM1) verwendet, um die obigen drei zu synchronisieren. Abbildung 2 zeigt die Signale, um die herum alles aufgebaut ist.

Die grünen Pfeile geben die Flanke der Impulse an, entlang derer die jeweiligen ADC1-ADC4-Wandler ausgelöst werden.
Um die geplanten 100 Nanosekunden zu erhalten, mussten wir die Taktfrequenz auf 160 Megahertz senken, damit alles vollständig aufgeteilt wurde, wie es sollte. Zunächst wurde der Schritt mit 4 Mikrosekunden viel langsamer eingestellt, um den Betrieb von Timern mithilfe von Interrupts, Ausgangsanschlüssen und einem Oszilloskop ruhig zu überprüfen. Dann wurde es durch Unterbrechung debuggt und erhielt direkten Zugriff auf den Speicher. Letztendlich wird nur ein Interrupt verarbeitet - dies ist die Unterbrechung des Arbeitsende vom vierten (letzten) Kanal des direkten Zugriffs auf den Speicher. Die folgende Abbildung zeigt die Verbindungen der am Prozess beteiligten Hardwareeinheiten sowie vier Ausgangsspeicherpuffer.

Von den vier Speicherpuffern (in der Abbildung rechts) werden die Samples programmgesteuert in einem Ergebnispuffer gesammelt.
In diesem Controller gibt es im Gegensatz zum STM32F303 eine Anforderungsumschalteinheit (DMAMUX), mit der Sie eine große Anzahl von Anforderungen von Peripheriegeräten auf nur 16 DMA1-Kanäle und 16 DMA2-Kanäle umleiten können. Im Referenzhandbuch werden die DMAMUX-Ausgabeanforderungen von 0 und die Eingänge der DMA-Kanalkanäle von 1 gezählt. Ich habe sie nicht geändert, sondern wie in der Originalquelle belassen.
Ein TIM5-Timer wird als Einzelimpulsgenerator verwendet. Es bietet einen praktischen Einzelpulsmodus. Bequemlichkeit liegt in der Möglichkeit, die Zeit vor dem Start des Impulses einzustellen und die Dauer des Impulses selbst einzustellen. Dieser Impuls kam wie unten im Bild gezeigt heraus und wurde freundlicherweise von einem gemieteten Oszilloskop zur Verfügung gestellt.

Das Oszillogramm zeigt, dass der Anstieg des Impulses 10 Mikrosekunden dauert, was bedeutet, dass er ungefähr 100 Abtastwerte aufnehmen sollte.
Das Projekt wurde in IAR 8.4 manuell durchgeführt (dh ohne Kuba und den Ball), aber ich hoffe, es wird von einer Vielzahl von Glaubensrichtungen verstanden. Sie können es hier sehen .
Hier ist ein Bild des Inhalts eines separaten ADC1-Puffers und des Ergebnisses, das aus vier Quellen des Puffers im Bereich des Beginns des Eingangsimpulses gesammelt wurde.

Der Inhalt dieser Puffer liegt jedoch im Bereich der Impulsspitze (wo der Wert 2508 erreicht).

Wie Sie sehen können, wurden 196-95 = 101 Zählungen für den Abschnitt vom Beginn des Impulses bis zu seiner Spitze ausgegeben.
Die Abtastrate beträgt also 10 Megahertz. Bei dieser Geschwindigkeit funktionierte es nicht sofort.
Um dies zu erreichen, musste ich den Prozessor stoppen, bevor ich den direkten Speicherzugriff (DMA1) startete. Es ist gut, dass der Cortex-M4 über eine spezielle Assembler-Anweisung WFI verfügt (Warten auf Unterbrechungen). Wenn dies nicht getan wird, stört der Prozessor den Füßen des DMA und belegt den Bus mit Speicherzugriffen, die möglicherweise warten.
Wenn Sie den Zählschritt auf 200 Nanosekunden erhöhen, hören sie auf zu schieben und heilen friedlich und glücklich.
Wenn wir den COMP4-Komparator in seine Arbeit einbeziehen und seinen positiven Eingang (Port PB0) mit dem Eingangssignal verbinden, dann den DAC (DAC1) verwenden und seinen Ausgang (CH1) mit dem negativen Eingang des Komparators (innerhalb der Steuerung) verbinden, erhalten wir ein Schwellenwertgerät mit einem einstellbaren Schwellenwert. Durch Betriebsunterbrechungen des Komparators können Sie den allgemeinen Taktgeber TIM1 starten und einen Standby-Modus wie bei einem Oszilloskop erhalten.