Wie kann der Arduino Uno bis zu 12 Servos unterstützen, wenn er nur 6 digitale PWM-Pins hat?

10

Nach dieser :

Die Servobibliothek unterstützt bis zu 12 Motoren auf den meisten Arduino-Boards und 48 auf dem Arduino Mega. Auf anderen Karten als der Mega deaktiviert die Verwendung der Bibliothek die AnalogWrite () (PWM) -Funktionalität an den Pins 9 und 10, unabhängig davon, ob sich an diesen Pins ein Servo befindet oder nicht. Auf dem Mega können bis zu 12 Servos verwendet werden, ohne die PWM-Funktionalität zu beeinträchtigen. Bei Verwendung von 12 bis 23 Motoren wird die PWM an den Pins 11 und 12 deaktiviert.

Doch nach dieser :

Digitale E / A-Pins 14 (von denen 6 einen PWM-Ausgang liefern)

Wie kann der Uno mehr als 6 Servos steuern, wenn er nur 6 digitale E / A-Pins hat, die einen PWM-Ausgang liefern können?

user41158
quelle

Antworten:

8

Die Servobibliothek verwendet kein PWM. Wenn Sie write () aufrufen , wird eine Impulsbreite in Mikrosekunden berechnet und in einem globalen Array gespeichert. Dann gibt es einen einzelnen Timer, der regelmäßig einen Interrupt auslöst, der die Ausgangssignale entsprechend der gewünschten Impulsbreite jedes Kanals ändert.

Den Quellcode finden Sie unten: Github-Link

Grapsus
quelle
1
Es simuliert also im Wesentlichen PWM? Was ist dann der Sinn der digitalen Pins mit PWM-Kanälen?
user41158
2
Im Allgemeinen sind Servopulse etwa 1 ms lang. Daher müssen sie mit Frequenzen um 1 kHz betrieben werden, was sehr einfach per Software an jedem Ausgang mit einem Mikro mit mehreren MHz erzeugt werden kann. AVR PWM-Ausgänge werden von dedizierter Hardware generiert und können die CPU-Frequenz erreichen, die Anzahl der Kanäle ist jedoch begrenzt. Ich denke, die Autoren des Servo-Moduls haben beschlossen, einen einzigen Timer zu verwenden, um so viele Kanäle wie Pins zu verarbeiten und die PWM-Hardware für andere Zwecke zu speichern.
Grapsus
1
Die PWM der Arduino-Ausgänge gilt für Ausgänge mit variabler Leistung und Arbeitszyklen zwischen 0 und 100%. Die "PWM" -Regelung im RC-Stil hat einen sehr begrenzten Arbeitszyklusbereich - 1000 us bei 50 Hz sind 5%, 2000 us bei 50 Hz sind 10%. Stellen Sie sich RC PWM eher als "Impulsfolge" als als herkömmliche "PWM" vor.
Jon Watte
@ user41158 Wenn Sie eine unbegrenzte CPU-Zeit haben, können Sie jeden digitalen Ausgang als PWM verwenden und diese in Software steuern, nicht nur PWM. Theoretisch können Sie alle digitalen Kommunikationssysteme erstellen, indem Sie ein Programm schreiben und diese Ausgänge umschalten . Dies wird als " Bit- " bezeichnet. hämmern ". In der Praxis ist die CPU-Zeit jedoch nicht unbegrenzt und es ist am besten, Hardwareaufgaben durch Hardware zu lösen. Für die Servosteuerung ist die PWM-Frequenz ziemlich niedrig, daher ist es praktisch, die PWM in der Software zu schlagen, um zusätzliche Ausgänge zu erzeugen.
盖子 盖子
2

Die 6 PWM-Pins verwenden den eingebauten UART des ATmega328P, um ihre Ausgabe zu erzeugen. Dies macht die Impulse sehr schnell für einen "analogen" Ausgang höherer Qualität. Da Servos langsam genug kommunizieren, können sie mithilfe von Software-Interrupts gesteuert werden. Software-Interrupts entfernen sich von dem Code, den Sie ausführen, und führen den in der Servobibliothek enthaltenen Code aus. Dieser Code verwendet Standardmittel, um den Status der Pins zu ändern. Wenn Sie Interrupts anstelle des UART verwenden, verschwenden Sie einige Verarbeitungszeit, können jedoch mehr Servos fahren.

John Dood
quelle
Können Sie mehr erklären (oder verlinken)? Wie wird der UART für PWM verwendet?
Martin Thompson
Ich denke, es wäre besser zu sagen, dass die PWM-Bibliothek auf Wunsch die UART-E / A-Pins verwenden kann. Die PWM-Bibliothek verwendet den UART selbst nicht, aber die vom UART verwendeten Pins können auch als digitale Standard-E / A verwendet werden, wenn sie für den UART nicht benötigt werden.
Peter Bennett