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:

Check out similar posts by category:
Analog, Arduino, Electronics, ESP8266/ESP32, PlatformIO
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow