Hi
Ich versuche mich gerade das erste mal an I2C um eine Servo anzusteuern.
Es wird ein PCA9685 verwendet, denn ich mit einem Arduino Uno über GND,
SDAm und SCL verbunden habe.
Datenblatt: https://cdn-shop.adafruit.com/datasheets/PCA9685.pdf
Ich möchte also nun die PWM Frequenz auf 50Hz setzen und den duty cycle
zwischen 0.8ms bis 2.2ms. Aus dem Datenblatt habe ich entnommen, dass
das Bit SLEEP im MODE1 Register(#0x00) auf 1 gesetzt werden muss um den
Prescaler zu setzen.
Bei der Berechnung des Prescalers fehlt mir die osc_clock, wo kann ich
die finden (ich verwende die interne clock)? Die Berechnung ist dann auf
S.25 des Datenblattes.
Ich habe noch nicht ganz verstanden, wie man die PWM der einzelnen
Outputs setzen kann; Die einzelnen Register für die Ausgänge sind ja 12
bit und daher mit Low/High adressierbar. Ist der Wert denn ich dort
reinschreibe direkt die Limite für den Counter? Also wenn ich jetzt z.B
500 reinschreibe ist der duty cycle 500/4096?
Hier noch den Code, denn ich implementiert habe:
1 | //Test PCA9685 Servo Driver
|
2 |
|
3 | #include <Wire.h>
|
4 |
|
5 | void setup() {
|
6 | // Start I2C
|
7 | Wire.begin();
|
8 |
|
9 | // Set Sleep Flag in MODE1 Regsiter to 1 to activate Prescaler
|
10 | //Access MODE1 Register
|
11 | Wire.beginTransmission(0x00);
|
12 | //Write Sleep Flag to 1 (Bit 4)
|
13 | Wire.write(byte(0x04));
|
14 | Wire.endTransmission;
|
15 |
|
16 | // Set Prescaler
|
17 | //Access PRE_SCALE Register -> FEh
|
18 | Wire.beginTransmission(0xFE);
|
19 | //We want 50Hz, 12bit Register
|
20 | Wire.write(byte(0x??)); //osc_clock benoetigt
|
21 | Wire.endTransmission;
|
22 |
|
23 | //PIN4 Set Value to 307
|
24 | Wire.beginTransmission(0x16);
|
25 | .....
|
26 |
|
27 | }
|
28 |
|
29 | void loop() {
|
30 | // put your main code here, to run repeatedly:
|
31 |
|
32 | }
|
Grüsse Pascal