STM32: Sin- und Cos-Wellen mit LEDC-PWM erzeugen

English Deutsch

Basierend auf unserem vorherigen Beitrag How to generate PWM output representing a sine wave on the ESP32 (Arduino/PlatformIO) verwendet dieser Beitrag zwei verschiedene IO-Pins, um sowohl eine Sinus- als auch eine Kosinuswelle dynamisch zu erzeugen.

stm32_sine_cos.cpp
#include <Arduino.h>
#include <driver/ledc.h>

void setup() {
    Serial.begin(115200);

    ledcSetup(LEDC_CHANNEL_0, 10000 /* Hz */, 12);
    ledcSetup(LEDC_CHANNEL_1, 10000 /* Hz */, 12);

    ledcAttachPin(GPIO_NUM_32, LEDC_CHANNEL_0);
    ledcAttachPin(GPIO_NUM_25, LEDC_CHANNEL_1);
}

/**
 * @brief Berechne das PWM-Tastverhältnis (bei 12-Bit-Auflösung) einer Sinuswelle mit
 * gegebener Frequenz. micros() wird als Zeitbasis verwendet
 *
 * @param frequency Die Frequenz in Hz
 * @return int den entsprechenden 12-Bit-PWM-Wert
 */
int sinePWMValue(float frequency, int maxPWMValue, float (*sinCos)(float)) {
  unsigned long currentMicros = micros(); // aktuelle Zeit in Mikrosekunden holen

  // Sinuswellenwert für die aktuelle Zeit berechnen
  int halfMax = maxPWMValue/2;
  int sineValue = halfMax + (halfMax-10) * sinCos(2 * PI * currentMicros / (1000000 / frequency));
  return sineValue;
}

void loop() {
    // Beispiel: Ändern des Tastverhältnisses auf 25%
    ledcWrite(LEDC_CHANNEL_0, sinePWMValue(1.0, 4096, sinf));
    ledcWrite(LEDC_CHANNEL_1, sinePWMValue(1.0, 4096, cosf));
}

Der Ausgang, jeweils gefiltert durch ein Sallen-Key-Filter 4. Ordnung (mit dem LM324), sieht so aus:

Oszilloskop-Spur der gefilterten Sinus- und Kosinus-PWM-Wellen, erzeugt durch ESP32 LEDC


Check out similar posts by category: Analog, Arduino, Electronics, ESP8266/ESP32, PlatformIO