PWM 10kHz Multi-Channel

OP #5383496
Lesenswert?
• ▲
▼
Hallo zusammen,

Bzgl. meinem Projekt benötige ich ein PWM-Signal mit einer Frequenz von 
10kHz-20kHz. Der Duty-Cycle (%) des PMW soll dabei ca. jede Millisekunde 
geändert werden. Beispielsweise:
 0-1ms =100%
 1-2ms 20%
 2-5ms 0%  (im loop).

Mit einem Arduino Uno kein Problem. Ich verwende PWM-Pin 9 und 10 im 
Mode 8 (PWM, Phase and Freq. correct). Mit dem ICRx kann ich damit meine 
gewünschte Freq. einstellen.

Allerdings benötige ich dieses PWM Signal auf mehreren Ausgängen mit 
unabhängigen DutyCylce-Werten.

Bsp. für ein zweites PWM Signal mit 10kHz:

0-1ms =100%
1-4ms 20%  (statt 1-2ms)
4-5ms 0%

Ist ein PWM Treiber à la PCA9685 dafür geeignet? Laut Datasheet ist nur 
eine Freq. von ca. 1.0kHz machbar. Gibt es hier eine Möglichkeit die 
Freq. auf 10kHz zu steigern?

Oder gibt es eine elegantere Lösung hierfür?
#5383511
Lesenswert?
• ▲
▼
@ Jk Mt (h4l9000)

>Mit einem Arduino Uno kein Problem. Ich verwende PWM-Pin 9 und 10 im
>Mode 8 (PWM, Phase and Freq. correct). Mit dem ICRx kann ich damit meine
>gewünschte Freq. einstellen.

Gut!

>Allerdings benötige ich dieses PWM Signal auf mehreren Ausgängen mit
>unabhängigen DutyCylce-Werten.

Wieviele denn? Der Arduino Uno hat mehrere Timer, damit kann man mehrere 
PWM-Signale erzeugen. Man muss halt nur die Register manuell einstellen.

>Ist ein PWM Treiber à la PCA9685 dafür geeignet?

Dieser nicht, andere schon. TLC5940 ist so einer, wenn gleich der per 
SPI angesteuert wird.

> Laut Datasheet ist nur
>eine Freq. von ca. 1.0kHz machbar.

Sieht so aus.

> Gibt es hier eine Möglichkeit die
>Freq. auf 10kHz zu steigern?

Eher nicht, den internen Frequenzteiler kann man nicht überbrücken.

>Oder gibt es eine elegantere Lösung hierfür?

Dazu müßte man deine Anforderungen kennen. Wieviele Kanäle brauchst du?

Wenn du nur grobe Schritte von 10% oder mehr brauchst, kann man das auch 
komplett in Software machen. Siehe Soft-PWM.
OP #5383531
Lesenswert?
• ▲
▼
Vielen Dank für deine schnelle Antwort!


Die Frequenz der PWM Signale müssen alle bei 10 kHz (Bzw. 20kHz) liegen. 
Das schaffe ich bei einem Arduino Uno nur mit dem Timer1 (Mode8).

16 Ausgänge wäre ein Anfang. Mehr wären besser.

Mit einem Arduino Mega könnte ich 11 solche PWM Signale generieren, ist 
das richtig?

Ich zähle die einzelnen PWM Peaks (10kHz) am Pin 9 und ändere nach "X" 
Peaks den DutyCycle am pin 10. Einen Solchen Pin 10 möchte ich aber 16+ 
mal haben, mit variablem "X". Daher würde ich die Schrittweite eher 
nicht als grob bezeichnen.
Gast #5383554
Lesenswert?
• ▲
▼
> Ich zähle die einzelnen PWM Peaks (10kHz) am Pin 9

Das heisst, du wirst eine sehr schnelle Interrupt-Rate haben. Und das 
womöglich auf mehreren Kanälen?

So oder so würde ich dann lieber einen µC verwenden, der wenigstens ein 
paar zig. MHz Taktfrequenz hat. Dann wird die Programmierung wesentlich 
entspannter ablaufen.

Schau Dir mal den STM32F103Vxxx an
https://de.aliexpress.com/wholesale?catId=0&initiative_id=SB_20180409075409&SearchText=STM32F103VET6+board

Falls ich mich nicht irre, hat der Chip 6 16bit Timer, mit jeweils 4 PWM 
Ausgängen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.