ESP32: PWM-Ausgabe einer Sinuswelle erzeugen (Arduino/PlatformIO)
English
Deutsch
Die folgende Funktion berechnet den Wert einer Sinuswelle unter Verwendung von micros() als Zeitbasis, mit einstellbarer Frequenz. Sie ist fest darauf programmiert, eine 12-Bit-Auflösungs-PWM zu erwarten
sine_pwm_esp32.cpp
/**
* @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) {
unsigned long currentMicros = micros(); // aktuelle Zeit in Mikrosekunden holen
// Sinuswellenwert für die aktuelle Zeit berechnen
int sineValue = 2048 + 2047 * sin(2 * PI * currentMicros / (1000000 / frequency));
return sineValue;
}Darauf aufbauend können wir den Grundcode aus unserem vorherigen Beitrag ESP32 minimal Arduino PWM output example (PlatformIO) verwenden, um eine 1Hz-Sinuswelle zu erzeugen (dargestellt durch ein 10kHz-PWM):
#include <Arduino.h> #include <driver/ledc.h>
sine_pwm_example.cpp
#include <Arduino.h>
#include <driver/ledc.h>
void setup() {
Serial.begin(115200);
ledcSetup(LEDC_CHANNEL_0, 10000 /* Hz */, 12);
ledcAttachPin(GPIO_NUM_14, LEDC_CHANNEL_0);
ledcWrite(LEDC_CHANNEL_0, 2048); // 50%
}
/**
* @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) {
unsigned long currentMicros = micros(); // aktuelle Zeit in Mikrosekunden holen
// Sinuswellenwert für die aktuelle Zeit berechnen
int sineValue = 2048 + 2047 * sin(2 * PI * currentMicros / (1000000 / frequency));
return sineValue;
}
void loop() {
// Beispiel: Ändern des Tastverhältnisses auf 25%
ledcWrite(LEDC_CHANNEL_0, sinePWMValue(1.0));
}Check out similar posts by category:
Arduino, 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