如何在 ESP32 上生成表示正弦波的 PWM 输出 (Arduino/PlatformIO)
以下函数将使用 micros() 作为时基计算正弦波的值,频率可调。它被硬编码为期望 12 位分辨率 PWM
sine_pwm_esp32.cpp
/**
* @brief 计算给定频率正弦波的 PWM 占空比(假设 12 位分辨率)
* 给定频率。micros() 用作时基
*
* @param frequency 频率,单位 Hz
* @return int 对应的 12 位 PWM 值
*/
int sinePWMValue(float frequency) {
unsigned long currentMicros = micros(); // get the current time in microseconds
// 计算当前时间的正弦波值
int sineValue = 2048 + 2047 * sin(2 * PI * currentMicros / (1000000 / frequency));
return sineValue;
}基于此,我们可以使用之前文章ESP32 最小 Arduino PWM 输出示例 (PlatformIO)的基本代码来生成 1Hz 正弦波(由 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 计算给定频率正弦波的 PWM 占空比(假设 12 位分辨率)
* 给定频率。micros() 用作时基
*
* @param frequency 频率,单位 Hz
* @return int 对应的 12 位 PWM 值
*/
int sinePWMValue(float frequency) {
unsigned long currentMicros = micros(); // get the current time in microseconds
// 计算当前时间的正弦波值
int sineValue = 2048 + 2047 * sin(2 * PI * currentMicros / (1000000 / frequency));
return sineValue;
}
void loop() {
// 如何将占空比更改为 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