Startseite>I<+>2<+>C-Workshop, Teil 11: PWM-Modul PCA9685
Aus Raspberry Pi Geek 06/2016

I<+>2<+>C-Workshop, Teil 11: PWM-Modul PCA9685

© Michal Bednarek, 123RF

Der richtige Dreh

Martin Mohr

Mit einem Servomotor bewegen Sie eine Menge. Der richtige Baustein macht das Steuern einfach.

Das Ansteuern eines Servomotors ermöglicht es, alle möglichen Dinge in Bewegung zu setzen. Das I2C-Modul in diesem Teil des Workshops basiert auf dem Chip PCA9685 von NXP. Der Hersteller hat den Baustein mit 16 Kanälen sowie 12-Bit-Pulsweitenmodulation (PWM) eigentlich zum Ansteuern von LEDs konzipiert. Der Chip eignet sich aber darüber hinaus auch bestens zum Steuern von Servomotoren.

Mit Servomotor meinen wir hier die kleinen, handlichen Würfel aus dem Modellbau – nicht etwa die Motoren, die in Industrierobotern verbaut sind. Zum Ansteuern eines Modellbau-Servos dient ein PWM-Signal mit einer Länge von 20 Millisekunden. Diese Periodendauer entspricht einer Frequenz von 50 Hz.

Die Position des Hebelarms hängt von der Dauer des hohen Signalpegels (High) ab. Dabei entspricht eine Millisekunde High-Pegel einer Winkelposition von 0 Grad, 2 Millisekunden entsprechen etwa 180 Grad. Abbildung 1 verdeutlicht die Funktionsweise von Servomotoren noch einmal.

Abbildung 1: Funktion eines Servos aus dem Modellbau. Das Zeitraster haben wir zur besseren Übersicht gestaucht.

Abbildung 1: Funktion eines Servos aus dem Modellbau. Das Zeitraster haben wir zur besseren Übersicht gestaucht.

Technische Daten

Das Datenblatt des PCA9685 wirkt mit seinen 52 Seiten schon eher wie ein kleines Buch. Das bedeutet, dass Sie für viele Details einen eigenen Ausdruck benötigen – wir geben hier nur einen kleinen Teil der Informationen wieder.

Fangen wir mit dem Wichtigsten an, der I2C-Adresse. Der PCA9685 bietet luxuriöse sechs Adressleitungen, mit denen er theoretisch 64 Adressen bedient. Das höchste Adressbit ist auf 1 gesetzt, was bedeutet, dass die Adressen im Bereich zwischen 0x40h und 0x7Fh liegen dürfen. Allerdings befinden sich in diesem Bereich ebenfalls die Adressen für All Call und Software Reset, wodurch effektiv 62 Adressen übrig bleiben.

Der Bereich für die Versorgungsspannung beginnt bei 2,3 Volt und endet bei 5 Volt. Jeder Eingang vermag im Open-Drain-Modus maximal 25 mA gegen Masse fließen zu lassen, im Gegentaktmodus liegt der Strom bei 4,5 mA.

Die Frequenz des PWM-Generators reicht von 24 bis 1526 Hz. Ein Servomotor benötigt 50 Hz für seine Steuersignale. Obwohl das Datenblatt es nicht explizit aufführt, eignet sich der PCA9685 damit auch für das Ansteuern von Servomotoren.

Das Verhältnis zwischen Puls und Pause dürfen Sie zwischen 0 und 100 Prozent mit einer Genauigkeit von 12 Bit einstellen. Das entspricht 4096 Stufen (Steps), von denen nur 5 Prozent für das Steuern des Servos zum Einsatz kommen – genau die Stufen zwischen 1 und 2 Millisekunden. Somit entsprechen 205 Stufen etwa 180 Grad Hebelweg eines Servos.

Falls Sie einen Servo verwenden, der eine höhere Auflösung benötigt, bietet der Baustein dafür noch etwas Luft: Heben Sie einfach die Basisfrequenz auf 100 Hz an. Die meisten Servos kommen mit einer Signallänge von 10 Millisekunden zurecht. Durch das Verdoppeln der Frequenz verdoppeln Sie die Stufen für das Verhältnis zwischen Puls und Pause innerhalb der Millisekunde.

Der PCA9685 kommt in einem für Bastler eher unfreundlichen SMD-Gehäuse daher. Aus diesem Grund empfiehlt es sich, ein fertiges Modul beim Händler Ihres Vertrauens zu bestellen [2].

Der Baustein verfügt über zwei Steuerregister, mit denen Sie die Funktionen einstellen. Diese Register haben die internen Adressen 0x00 (Mode1) und 0x01 (Mode2). Die Beschreibung zu den Modi finden Sie in der Tabelle “Steuerregister”.

Steuerregister

Bit

Bedeutung

Mode10x00h

0

Wert1: All Call aktiv

1

Wert 1 aktiviert Subadressen 3

2

Wert 1 aktiviert Subadressen 2

3

Wert 1 aktiviert Subadressen 1

4

Wert 1 aktiviert Sleep Mode (Oszillator aus)

5

Wert 1 aktiviert Auto-Increment

6

Wert 1 schaltet auf einen externen Oszillator um

7

Wert 1 löst einen Restart aus

Mode20x01h

0 + 1

steuern das Verhalten der Ausgänge, wenn der Eingang OE auf HIGH ist (Chip gesperrt, siehe Tabelle “Werte”)

2

Wert 0: Outputs sind Open Drain, ansonsten Gegentaktbetrieb

3

Wert 0: Outputs werden beim Stop geschrieben, sonst bei ACT

4

Wert 1: invertierte Logik (nötig bei zusätzlichen Ausgangstreibern)

5 – 7

reserviert

Werte

Wert

Bedeutung

00

Ausgänge LOW

01

Bit 2 = HIGH: Ausgänge HIGH

01

Bit 2 = LOW: Ausgänge hochohmig

1x

Ausgänge hochohmig

Die Frequenz des PWM-Signals stellen Sie über das Register PRE_SCALE (0xFE) ein. Die Formel, um den Wert zu berechnen, zeigt Abbildung 2. Auf der Heft-DVD finden Sie das Skript prescale.pl, mit dem Sie den Wert im Terminal berechnen.

Abbildung 2: Für den Servo aus dem Beispiel benötigen Sie eine PWM-Frequenz von 50 Hz. Setzen Sie diese in die Formel ein, erhalten Sie für »PRE_SCALE« einen Wert von »0x79h«.

Abbildung 2: Für den Servo aus dem Beispiel benötigen Sie eine PWM-Frequenz von 50 Hz. Setzen Sie diese in die Formel ein, erhalten Sie für »PRE_SCALE« einen Wert von »0x79h«.

Die einzelnen LED-Ausgänge sprechen Sie über vier Steuerregister an. Zwei davon enthalten den Wert für LED_ON. Er beschreibt die Anzahl der Steps, bis die LED innerhalb des Fensters von 4096 Steps einschaltet. Die anderen beiden enthalten den Wert LED_OFF, der angibt, nach wie vielen Steps der Chip die LED-Ausgänge wieder abschaltet. Abbildung 3 verdeutlicht die Funktionsweise anhand eines Diagramms.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 7 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland