PWM-Steuerung ohne Zwischenstufen
Was dieses Beispiel zeigt
Festlegen der Anzahl der Ein-/Aus-Ticks eines Kanals und deren zeitliche Ansteigerung. Dies ist
der grundlegende Baustein der Platine: Jeder übergeordnete Aufruf, einschließlich des
Servowinkel-Helpers auf der nächsten Seite, ruft letztendlich setPWM() auf.
Der Beispielcode
#include "PCA9685-SOLDERED.h"
PCA9685 pwm;
void setup()
{
pwm.begin();
pwm.setPWMFreq(1000); // fast PWM for LEDs/general outputs, not servos
}
void loop()
{
for (uint16_t duty = 0; duty <= 4095; duty += 32)
{
pwm.setPWM(0, 0, duty);
delay(20);
}
}
Erwartetes Ergebnis:
Keine serielle Ausgabe. Der Tastgrad von Kanal 0 steigt in Schritten von 32 von 0 auf 4064 an, wobei jede Rampe etwas mehr als 2,5 Sekunden dauert; anschließend wiederholt sich der Vorgang.
Verwendete Funktionen
PCA9685(uint8_t _address = PCA9685_DEFAULT_ADDRESS)returns NoneNativer Konstruktor. Die I2C-Adresse der Platine wird über die Lötbrücken JP1–JP6 festgelegt. Übergeben Sie daher die Adresse, die der Konfiguration Ihrer Platine entspricht, oder belassen Sie die Standardeinstellung.
ReturnsKonstruktor; kein Rückgabewert.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
uint8_t | _address | I2C-Adresse der Platine. Standardwert ist PCA9685_DEFAULT_ADDRESS (0x40). |
begin()returns voidInitialisiert den PCA9685 über I2C an der im Konstruktor festgelegten Adresse: Aktiviert den Oszillator, schaltet die ALLCALL-Adresse frei und stellt die Standard-PWM-Frequenz von 50 Hz ein. Rufen Sie diese Funktion einmal in der Funktion setup() auf.
ReturnsNichts.
Parameter
Diese Funktion benötigt keine Parameter.
setPWMFreq(float freq)returns voidLegt die PWM-Frequenz fest, die von allen 16 Kanälen gemeinsam genutzt wird. Die Frequenz wird auf den vom Chip unterstützten Bereich von 24 bis 1526 Hz begrenzt.
ReturnsNichts.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
float | freq | Gewünschte Frequenz in Hz, begrenzt auf 24–1526 Hz. |
setPWM(uint8_t channel, uint16_t on, uint16_t off)returns voidLegt die Roh-Tick-Zahlen fest, bei denen die Ausgabe eines Kanals innerhalb einer PWM-Periode (4096 Ticks) ein- und ausgeschaltet wird. Wird direkt für LEDs und allgemeine PWM-Anwendungen verwendet; die Funktion `setServoAngle()` auf der nächsten Seite ist eine praktische Hülle für denselben Aufruf.
ReturnsNichts.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
uint8_t | channel | Kanalnummer, 0 bis 15. |
uint16_t | on | Tick-Zählwert (0–4095), bei dem der Ausgang eingeschaltet wird. |
uint16_t | off | Tick-Zählwert (0–4095), bei dem der Ausgang ausgeschaltet wird. |
Alles zusammenfügen
begin() legt eine Standardfrequenz von 50 Hz fest, doch in diesem Beispiel wird diese mit
setPWMFreq() sofort auf 1000 Hz erhöht, was für eine LED oder allgemeine PWM-Last besser geeignet ist
als die von Hobby-Servos erwarteten 50 Hz. setPWM() legt dann beide Flanken des
Impulses fest: Da on fest auf 0 gesetzt ist, steuert allein off den Tastgrad, sodass eine
Ansteigerung von off von 0 auf 4064 den Ausgang von vollständig aus auf fast vollständig ein ansteigen lässt.
Um einen Kanal konstant zu halten, anstatt ihn anzusteigen, rufen Sie setPWM() einmal mit den
gewünschten Tick-Werten auf und unterlassen Sie weitere Aufrufe; der PCA9685 erzeugt
dieses Signal dann selbstständig weiter, bis Sie es ändern.