So stellen Sie die PWM-Frequenz mit hoher Granularität ein

Ich möchte eine PWM mit 100 kHz erstellen , die 1000 Schritte haben kann. zB wenn ich CCR1 auf 0% setze, ist die PWM ausgeschaltet und wenn ich CCR1 auf 499 setze, sollte es 50% sein und offensichtlich bei CCR1 = 999 sollte es ein voller Arbeitszyklus von 100% sein.

Der CPU_CLK ist 80 MHz ... aber ich kann das nicht erreichen. hier mein bisheriger Code:

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED2;
  htim1.Init.Period = 1000-1;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

Dies gibt mir eine PWM mit einer Frequenz von 40 kHz ... weit unter 100 kHz ... die Prescalare ist bereits auf dem Minimum ... ist dies unmöglich zu erreichen?

Der Chip ist STM32L476.

100 kHz mal 1000 ergibt 100 MHz. Ihr maximaler Takt beträgt 80 MHz. Sehen Sie ein Problem?
+1 gute Frage, weil so viele Leute die Einschränkungen in Bezug auf Auflösung, Taktfrequenz und PWM-Frequenz nicht verstehen.
Normalerweise verwenden Regler mit großem Dynamikbereich PFM + PWM, um einen Dynamikbereich von 60 dB zu erreichen
Was ist Ihnen also wichtiger, „hohe Granularität“ im Titel oder „100 kHz“ in der Frage? Weil 16-Bit-Timer Ihnen eine Auflösung von 65k geben können, weit über 1000 Schritten.
@Maple Ich brauche genau 1000 Schritte bei 100 kHz ... Ich denke, das ist nicht so einfach möglich :( Ich brauche einen schnelleren Chip
@DEKKER "Ich brauche einen schnelleren Chip". Oder Sie können einen externen PWM-Generator wie den 12-Bit-M66242P von Mitsubishi für 4096 Schritte bis zu 25 MHz verwenden

Antworten (1)

Die kurze Antwort ist, dass es mit einem Takt von 80 MHz nicht trivial ist, es sei denn, Sie wenden einige Dithering-Techniken an (siehe unten).

F C l k = P W M F R e Q u Q N C j × 2 S T e P S

In Ihrem Fall sind die erforderlichen Schritte 10 Bit ... daher benötigen Sie mindestens einen Haupttakt von 100 MHz.

Das Dokument, das ich in meinem Kommentar verlinkt habe, zeigt einige komplexe Möglichkeiten, dies mit niedrigeren Taktraten zu erreichen, indem mehr Timer gedithert und kombiniert werden (es ist ziemlich komplex). Hier ist das Dokument von STM selbst.

Offensichtlich wäre eine andere Lösung die Verwendung einer anderen MCU aus derselben Familie mit höheren Taktraten, wenn Ihre Anwendung/Ihr Budget dies zulässt.