Forum: Mikrocontroller und Digitale Elektronik PWM 10kHz Multi-Channel


von Jk M. (h4l9000)


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?

von Falk B. (falk)


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.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Arduino unterstützt auch einige STM32F103 Mikrocontroller, wäre das eine 
Option? Die haben mehr PWM Kanäle.

von Jk M. (h4l9000)


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.

von Stefan F. (Gast)


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.

von Jk M. (h4l9000)


Lesenswert?


von Stefan F. (Gast)


Lesenswert?

Zum programmieren brauchst du einen USB-UART Adapter, oder besser einen 
ST-Link Adapter.

von Jk M. (h4l9000)


Lesenswert?

evtl. geht das auch über USB mit dem STM32duino Bootloader.

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.