Forum: Mikrocontroller und Digitale Elektronik PWM Chaos mit Arduino und PCA9685


von Marcel V. (marcel_v735)


Lesenswert?

Hallo,

ich will mehrere 12 V LED Streifen mit einem Arduino Dimmen. Da mir die 
PWM Pins des Arduinos nicht ausreichen habe ich mir das PCA9685 Board 
von Az-Delivery geholt 
(https://www.az-delivery.de/products/pca9685-servotreiber).
mit dem wollte ich dann MOSFETS ansteuern. Nun habe ich das Problem, 
dass ich nicht weiß wie ich das Projekt umsetzen kann. Wenn ich mit der 
Adafruit Libary versuche den ersten pin mit
1
pwm.setPWM(0, 4096, 0);       // turns pin fully on
2
delay(1000);
3
pwm.setPWM(0, 0, 4096);       // turns pin fully off
4
delay(1000);
zu schalten zeigt mein Multimeter zwischen dem gelben und dem roten Pin 
abwechselnd 3,9 und 4,9 V🤔 die LED geht auch nicht ganz aus. Zwischen 
dem gelben und dem schwarzen Pin wechselt die Spannung zwischen 1 und 0 
V...
Kann mir irgendjemand ansatzweise sagen was da abgeht oder wie ich mein 
Projekt umsetzen kann?

Liebe Grüße, Marcel.

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Marcel V. schrieb:
> Kann mir irgendjemand ansatzweise sagen was da abgeht oder wie ich mein
> Projekt umsetzen kann?

Indem du mal das Datenblatt für den PCA9685 liest, dir Gedanken machst 
wie du dessen Schnittstelle ansteuern musst und welche Kommandos du 
diesem schicken musst damit es macht was du willst.

von Wolfgang (Gast)


Lesenswert?

Marcel V. schrieb:
> Kann mir irgendjemand ansatzweise sagen was da abgeht oder wie ich mein
> Projekt umsetzen kann?

Da das Board als Servotreiber beworben wird, könnte es sein, dass die 
Bibliothek auf die Ansteuerung von Servos mit ihrem relativ kleinen 
DC-Bereich ausgelegt ist. Bist du sicher, dass die den Bereich 0 bis 
100% abdeckt?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich weiß nicht welche Lib der TO verwendet und wie gut diese Fehler 
korrigiert. Nur 4096 für 100% Duty Cycle stimmt so nicht. Wenn es keine 
Invertierung gibt, ggf. ausprobieren, dann ist 0 0% und 4095 100% Duty 
Cycle.

von EAF (Gast)


Lesenswert?

Veit D. schrieb:
> welche Lib
Es riecht nach dieser:
https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
ohne Gewähr

von Veit D. (devil-elec)


Lesenswert?

Hallo,

sieht nach dieser Lib aus. Hätten wir das Erste schon einmal erraten. 
Die verwenden tatsächlich den Wert 4096 im Bsp., hmm, naja.

Jetzt müßte Marcel (TO) seinen Schaltplan zeigen. Der Eingangstext lässt 
zu viel Interpretationsspielraum zu zwischen Wunsch und was wirklich 
aktuell wie angeschlossen ist.

von EAF (Gast)


Lesenswert?

Veit D. schrieb:
> und was wirklich
> aktuell wie angeschlossen ist.

Zumindest macht ein Multimeter an PWM Pins erstmal wenig Sinn.

Als stolzer Besitzer eines UNO, eines solchen PCA9685 Boards und eines 
LA, konnte ich die Funktion bei mir sichtbar machen.
Damit kann ich die Kommentare in folgendem Code als Wahr bestätigen.
1
#include <Wire.h>
2
#include <Adafruit_PWMServoDriver.h>
3
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
4
5
6
void setup() 
7
{
8
  pwm.begin();
9
  pwm.setOscillatorFrequency(26300000); //  // experimentell angenähert
10
  pwm.setPWMFreq(1600); 
11
  Wire.setClock(400000);
12
13
  pwm.setPWM(0, 4096, 0);       // turns pin fully on
14
  pwm.setPWM(1, 0, 4096);       // turns pin fully off
15
  pwm.setPWM(2, 0, 2047);       // 50%
16
}
17
18
void loop() {}

von Marcel V. (marcel_v735)


Lesenswert?

Moin Moin,

ja richtig, ich verwende die adafruit Libary für Servos etc, die ich im 
ersten Beitrag verlinkt habe. Ich habe das PCA Board an SCL, CLA, V+ und 
GND angeschlossen. Das funktioniert ja. erste Kuriosität: Ich schließe 
eine weiße LED an den roten und den Gelben Kanal des ersten Servo Ports 
an. (Wirlich kein Schaltplan nötig, einfach der gelbe und rote Kontakt 
vom ersten Servo Anschluss). Und was muss ich feststellen? Mit dem 
Beispielcode der libary, der den Kanal angeblich ganz aus und anschalten 
würde:
1
#include <Wire.h>
2
#include <Adafruit_PWMServoDriver.h>
3
4
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
5
6
void setup() {
7
  Serial.begin(9600);
8
  Serial.println("GPIO test!");
9
10
  pwm.begin();
11
  pwm.setPWMFreq(1000);
12
13
  Wire.setClock(400000);
14
}
15
16
void loop() {
17
    pwm.setPWM(0, 4096, 0);       // turns pin fully on
18
    delay(1000);
19
    pwm.setPWM(0, 0, 4096);       // turns pin fully off
20
    delay(1000);
21
}
Blinkt die LED zwar, jedoch glimmt sie auch im Aus Zustand ein 
bisschen...
Auch wenn Messgeräte vielleicht nix bringen beobachte ich ein Wechsel 
zwischen 3,9 und 4,9 V. Zweite Beobachtung: Schließe ich die LED 
zwischen Gelb und Schwarz anstatt Gelb und Rot passiert nichts. Ich 
tausche die LED gegen das Spannungsmessgerät und sehe wie zwischen Gelb 
und Rot jede sekunde einen Spannungswechsel. Aber diesmal zwischen 0 und 
1 V. Beide Wechsel funktonieren wie im Programm angegeben mit einem 
Delay von 1er Sekunde. Aber warun nicht einfach zwischen 0 und 5 V??😥 
Auch mit dem Servo Beispiel aus der Libary erziehle ich keine anderen 
Erdebnisse.

Hoffe es war diesmal genau genug, bei Fragen Fragen Fragen, Liebe Grüße 
und schönen Abend.

von Stefan F. (Gast)


Lesenswert?

Marcel V. schrieb:
> Aber warum nicht einfach zwischen 0 und 5 V?

Vermutlich weil der Ausgang als LED Treiber konfiguriert ist, anstatt 
als Totem-Pole.

"The LED output driver is programmed to be either open-drain with a 25 
mA current sink capability at 5 V or totem pole with a 25 mA sink, 10 mA 
source capability at 5 "

https://www.nxp.com/docs/en/data-sheet/PCA9685.pdf

Die Funktion dazu ist setOutputMode(true)

https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library/blob/master/Adafruit_PWMServoDriver.cpp

von Marcel V. (marcel_v735)


Lesenswert?

Danke für die schnelle Antwort, der Befehl ändert jedoch scheinbar 
nix...

von Stefan F. (Gast)


Lesenswert?

Nun ist der Punkt gekommen, wo du dir ein Oszilloskop oder Logic 
Analyzer besorgen solltest.

von Forist (Gast)


Angehängte Dateien:

Lesenswert?

Marcel V. schrieb:
> ja richtig, ich verwende die adafruit Libary für Servos etc, die ich im
> ersten Beitrag verlinkt habe.

Man achte auf die sprachliche Mehrdeutigkeit.
Das "die" im Relativsatz hast du auf die Servos bezogen, aber nicht auf 
die Library. Genau genommen hast du auch nicht auf irgendwelche Servos 
verlinkt, sondern auf eine Treiberkarte. Und wenn man sich auf der 
verlinkten Seite durch die ganze Blinkerei und Aufpopperei bis zum 
Library-Link durchgesucht hat, stellt man fest, dass in dem RAR-File 
vier verschiedene Libs enthalten sind.

Da ist man klug als wie zuvor und fragt sich: Welchen Code verwendest 
du?

von EAF (Gast)


Lesenswert?

Marcel V. schrieb:
> Ich habe das PCA Board an SCL, CLA, V+

Der PCA und seine Pullup werden von/über Vcc versorgt.
Es gibt keine Verbindung zwischen V+ und Vcc

von Marcel V. (marcel_v735)


Lesenswert?

Hi,

ich habe alle Ordner in den libary Ordner gepackt, verwende jedoch 
mittlerweile den Originaltreiber von GitHub 
https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library/blob/master 
(ohne Veränderung des Ergebnisses)

l.G.

von Marcel V. (marcel_v735)


Lesenswert?

Oh nein, bin ich so blöd 😁 hab ganz selbstverständlich vcc auf v+ 
gesteckt ohne einen Unterschied zu vermuten... Jetzt gehts un es geht 
super, ich hoffe der Beitrag hilft noch jemand weiter, ich verwende 
IRLZ44N MOSFETS für 12V LED.

Vielen dank an euch alle, ohne dieses Forum wär ich nicht mehr froh 
geworden :)

Liebe Grüße, Marcel

von Stefan F. (Gast)


Lesenswert?

Marcel V. schrieb:
> Oh nein, bin ich so blöd 😁 hab ganz selbstverständlich vcc auf v+
> gesteckt

Deswegen fragen wir immer nach Schaltplänen und Fotos vom aktuellen 
Aufbau.

von EAF (Gast)


Lesenswert?

Marcel V. schrieb:
> hab ganz selbstverständlich vcc auf v+
> gesteckt ohne einen Unterschied zu vermuten...

Der Weg in die Hölle ist mit falschen Annahmen gepflastert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.