Forum: Mikrocontroller und Digitale Elektronik Arduino PWM und Bibliothek auf einem Timer


von Philipp K. (pk_112)


Lesenswert?

Guten Abend zusammen,

Ich bastle mir gerade mit einem Arduino Nano V3.0 eine Lichtsteuerung 
mit IR Fernbedienung, die per PWM (analogWrite(0-255) N Mosfets 
ansteuert, die wiederum der LED die Masse geben.
Da ich einen RGBCW LEDstreifen (24V) benutze brauche ich dafür 5 PWM 
Pins am Arduino (3,5,6,9,10; 11 bleibt frei). Jetzt habe ich aber einen 
Konflikt mit der IRRemote Bibliothek, die ebenso wie PWM PIN 3 & 11 den 
Hardwaretimer 2 nutzt. Daher schaltet pin 3 beim Andimmen auf einen 
Schlag ein, ab welchem analogWrite - Wert muss ich noch testen.

Daher meine Frage: wie löse ich diesen Timer Konflikt, bzw. wo kommt er 
her?
Ausweichen auf andere Pins geht ja aufgrund der Anzahl nicht…

Danke schonmal für alle Tipps,
Philipp

PS: ich hoffe ihr versteht mein Problem, ich beantworte natürlich alle 
Rückfragen

von Sebastian R. (sebastian_r569)


Lesenswert?

Philipp K. schrieb:
> wie löse ich diesen Timer Konflikt, bzw. wo kommt er
> her?

Philipp K. schrieb:
> wo kommt er
> her?

Die Bibliothek nutzt einen Timer als Interrupt, um das Eingangssignal zu 
Samplen.
https://github.com/Arduino-IRremote/Arduino-IRremote?tab=readme-ov-file#timer-and-pin-usage

Und denk dran, dass millis() auch einen Timer nutzt.

Philipp K. schrieb:
> wie löse ich diesen Timer Konflikt

Mit einem PCA9685 zum Beispiel. Gut, die 16 Kanäle sind zwar vielleicht 
ein bisschen overkill, aber dafür 12bit und du kannst noch weitere 
Strips anschließen, wenn du sie einplanst

von Adam P. (adamap)


Lesenswert?

Sebastian R. schrieb:
> Mit einem PCA9685 zum Beispiel.

Habe ich auch hier rumliegen (zum ausprobieren), einfacher gehts kaum 
und echt einfach in der Handhabung.

Wäre evtl. echt eine Idee für den TO.

von Axel S. (a-za-z0-9)


Lesenswert?

Philipp K. schrieb:
> Daher meine Frage: wie löse ich diesen Timer Konflikt

Mit diesem Arduino? Gar nicht. Nimm einen Arduino mit mehr PWM-fähigen 
Pins und am besten auch höherer PWM-Auflösung (mehr als 8 Bit). Oder 
halt einen externen PWM-Treiber.

https://support.arduino.cc/hc/en-us/articles/9350537961500-Use-PWM-output-with-Arduino

von Veit D. (devil-elec)


Lesenswert?

Hallo,

wenn der Formfaktor "Nano" wichtig ist, könntest du den "Arduino Nano 
Every" nehmen, dazu das Core Package 
https://github.com/MCUdude/MegaCoreX, dann hat man mehr PWM Pins zur 
Verfügung und noch mehr Vorteile.

: Bearbeitet durch User
von Philipp K. (pk_112)


Lesenswert?

Entschuldigt bitte, dass ich mich erst jetzt melde.

Vielen Dank an euch alle für die vielen Hinweise.

Sebastian R. schrieb:
>
> Mit einem PCA9685 zum Beispiel.

So einen habe ich mir jetzt bestellt, um damit meine Mosfets (IRlZ34N) 
für den LED Streifen zu schalten.

Ich berichte dann nochmal wenn er da und eingebaut ist…

Danke nochmal,
Gruß

von Adam P. (adamap)


Lesenswert?

Philipp K. schrieb:
> So einen habe ich mir jetzt bestellt, um damit meine Mosfets (IRlZ34N)
> für den LED Streifen zu schalten.

Du solltest jedoch beachten, dass der PCA9685 am Ausgang auch nur um die 
25mA liefern kann.
Bezüglich Gate Widerstand, Total Gate Charge, Rise Time...

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Adam P. schrieb:
> PCA9685

> 7.7 Using the PCA9685 with and without external drivers
> • OUTDRV bit (MODE2 register) allows minimizing the
> amount of external components
> required to control the external driver (N-type or P-type device).
Aus: https://www.nxp.com/docs/en/data-sheet/PCA9685.pdf

Auch ab Seite 35 sehe ich keine Gatewiderstände...
Wobei die fertigen Boards mit dem Chip alle (zumindest die ich kenne) 
220R in den Pin Leitungen haben. Das sollte als Gatewiderstand reichen.
Wobei ich da je nach P oder N Chanel FET auch noch Pullup oder Pulldown 
vorschlagen würde.

von Philipp K. (pk_112)


Lesenswert?

Arduino F. schrieb:

> Wobei ich da je nach P oder N Chanel FET auch noch Pullup oder Pulldown 
vorschlagen würde.

Ja genau, die sind schon eingebaut (10kO).

von Mario M. (thelonging)


Lesenswert?

Wenn man frei bei der Wahl des IR-Protokolls ist, könnte man auch das 
NEC-Protokoll nehmen. Das ist schön klein in der Codegröße und braucht 
keinen Interrupt. Alternativ könnte man auch einen 20 kHz-Oszillator (1 
Gatter+R+C) an einen Portpin hängen, letzteren auf Pinchange-Interrupt 
stellen und damit die IRRemote-Interruptfunktion auslösen. Aber der PCA 
ist die komfortabelste Variante, die PWM-Qualität verbessert sich und 
man hat genug Erweiterungsmöglichkeiten.

von Axel S. (a-za-z0-9)


Lesenswert?

Mario M. schrieb:
> Aber der PCA ist die komfortabelste Variante, die PWM-Qualität
> verbessert sich und man hat genug Erweiterungsmöglichkeiten.

Ohne Frage ist der PCA komfortabel. Und 12 Bit PWM-Auflösung sind auch 
besser als 8 Bit. Aber wie gesagt: es gibt auch Arduinos jenseits vom 
ATMega328. Und die haben das eingebaut (kein extra Chip). Beides, die 
höhere Auflösung und mehr Kanäle.

Wenn man auf das Arduino-Gedöhns verzichtet und lernt zu programmieren, 
kann man natürlich auch auf dem ATMega PWM mit bis zu 16 Bit machen 
(Soft-PWM). Mit 3 Kanälen hab ich das schon gemacht, es gehen aber bis 
zu 8 Kanäle (müssen dann auf dem gleichen Port liegen).

Oder man schaut sich bei anderen Herstellern um. Der STM8S105 hat 8(?) 
PWM-Kanäle in 16 Bit. Und IRMP läuft da auch drauf.

von Peter D. (peda)


Lesenswert?

Axel S. schrieb:
> es gibt auch Arduinos jenseits vom
> ATMega328.

Man kann ihn auch auf den ATmega328PB umlöten, der hat 5 16Bit PWM 
Ausgänge.

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.