Inhaltsverzeichnis:

Hochauflösende PWM-Signalerzeugung für RC-Servos mit STM32-Geräten - Gunook
Hochauflösende PWM-Signalerzeugung für RC-Servos mit STM32-Geräten - Gunook

Video: Hochauflösende PWM-Signalerzeugung für RC-Servos mit STM32-Geräten - Gunook

Video: Hochauflösende PWM-Signalerzeugung für RC-Servos mit STM32-Geräten - Gunook
Video: Hochauflösende Satellitenbilder Herunterladen - How To 2024, Juli
Anonim
Hochauflösende PWM-Signalerzeugung für RC-Servos mit STM32-Geräten
Hochauflösende PWM-Signalerzeugung für RC-Servos mit STM32-Geräten
Hochauflösende PWM-Signalerzeugung für RC-Servos mit STM32-Geräten
Hochauflösende PWM-Signalerzeugung für RC-Servos mit STM32-Geräten
Hochauflösende PWM-Signalerzeugung für RC-Servos mit STM32-Geräten
Hochauflösende PWM-Signalerzeugung für RC-Servos mit STM32-Geräten

Derzeit baue ich einen RC-Sender/Empfänger basierend auf dem SX1280 RF-Chip. Eines der Ziele für das Projekt ist, dass ich eine 12-Bit-Servoauflösung von den Sticks bis zu den Servos haben möchte. Zum einen, weil moderne Digitalservos eine Auflösung von 12 Bit haben, zum anderen verwendet ein High-End-Sender sowieso 12 Bit. Ich habe untersucht, wie ich hochauflösende PWM-Signale auf STM32-Geräten erzeugen kann. Ich verwende im Moment schwarze Pille (STM32F103C8T8) für den Prototyp.

Schritt 1: Teileliste

Hardware

  • Jedes STM32F103-Entwicklungsboard (blaue Pille, schwarze Pille usw.)
  • Eine USB-Powerbank als Stromversorgung
  • STM32-Programmierer (Segger j-links, ST-LINK/V2 oder einfach ein st-link-Klon)

Software

  • STM32CubeMX
  • Atollic TrueSTUDIO für STM32
  • Projektquelle von github

Schritt 2: Die offensichtliche Lösung

Die offensichtliche Lösung
Die offensichtliche Lösung
Die offensichtliche Lösung
Die offensichtliche Lösung
Die offensichtliche Lösung
Die offensichtliche Lösung

Die wahrscheinlich einfachste Lösung ist die Verwendung eines Timers, der PWM-Signale erzeugen kann, wie TIM1-3 auf einem STM32F103. Für ein modernes digitales Servo kann die Bildrate bis zu 5 ms oder so sinken, aber für ein altes analoges Servo sollte sie 20 ms oder 50 Hz betragen. Lassen Sie uns das also als Worst-Case-Szenario generieren. Bei 72 MHz Takt und 16 Bit Timerzählerauflösung müssen wir den Prescaler des Timers auf mindestens 23 einstellen, um die 20 ms Bildrate abzudecken. Ich habe 24 gewählt, weil ich dann für 20 ms den Zähler genau auf 60000 setzen muss. In den Screenshots sehen Sie das CubeMX-Setup und die erzeugten 1- und 1,5-ms-PWM-Signale. Leider sollte für 1ms der Zähler des Timers auf 3000 gesetzt werden, was uns nur eine 11-Bit-Auflösung ergeben würde. Nicht schlecht, aber das Ziel war 12 Bit, also versuchen wir etwas anderes.

Wenn ich einen Mikrocontroller mit 32-Bit-Timerzähler wie STM32L476 wählen würde, kann diese Auflösung natürlich viel höher sein und das Problem wäre gelöst.

Aber hier möchte ich eine alternative Lösung vorschlagen, die die Auflösung auch beim STM32F103 noch weiter erhöht.

Schritt 3: Timer für höhere Auflösung kaskadieren

Kaskadierende Timer für höhere Auflösung
Kaskadierende Timer für höhere Auflösung
Kaskadierende Timer für höhere Auflösung
Kaskadierende Timer für höhere Auflösung
Kaskadierende Timer für höhere Auflösung
Kaskadierende Timer für höhere Auflösung

Das Hauptproblem bei der vorherigen Lösung besteht darin, dass die Bildrate (20 ms) im Vergleich zum tatsächlich erzeugten PWM-Signal (zwischen 1 und 2 ms) relativ hoch ist, sodass wir für die verbleibenden 18 ms beim Warten einige geschätzte Bits verschwenden der nächste Rahmen. Dies kann durch Kaskadieren von Timern mithilfe der Timer-Link-Funktion zur Synchronisation gelöst werden.

Die Idee ist, dass ich TIM1 als Master verwende, um die Framerate (20 ms) zu generieren und TIM2, TIM3, um die PWM-Signale als Slaves zu bewältigen. Wenn der Master die Slaves triggert, erzeugen diese nur in einem Pulsmodus ein PWM-Signal. Daher muss ich in diesen Timern nur 2 ms abdecken. Glücklicherweise können Sie diese Timer in Hardware kaskadieren, so dass diese Synchronisation keinen Eingriff des Prozessors erfordert und auch sehr präzise ist, der Jitter liegt im ps-Bereich. Sie können das CubeMX-Setup auf den Screenshots sehen.

Wie Sie sehen können, habe ich 3 als Preskalar ausgewählt, also muss ich für die 2 ms 48000 im Zähler des Timers einstellen. Dies gibt uns 24000 für 1 ms, was eigentlich mehr ist, als wir für eine 14-Bit-Auflösung benötigen. Tadaaaa…

Bitte sehen Sie sich die Oszilloskop-Screenshots im Intro für das Endergebnis an. Kanal 3 (lila) ist der Interrupt des Master-Timers, der die Salves auslöst, um einen Impuls zu erzeugen. Kanal 1 und 4 (gelber und grüner Strahl) sind die tatsächlichen PWM-Signale, die von verschiedenen Timern erzeugt werden. Beachten Sie, dass sie synchron sind, aber an den Hinterflanken synchronisiert sind, das liegt am PWM-Modus 2. Dies ist kein Problem, da die PWM-Rate für das jeweilige Servo immer noch korrekt ist.

Ein weiterer Vorteil dieser Lösung besteht darin, dass eine Änderung der Framerate bedeuten würde, nur die Periode in TIM1 zu ändern. Bei modernen Digitalservos können Sie sogar auf 200-300 Hz herunterfahren, aber bitte konsultieren Sie das Handbuch des Servos, wenn Sie eine Feinabstimmung wünschen.

Empfohlen: