ESP32-S3 PWM控制:解决等待期间PWM信号持续输出问题
ESP32-S3 PWM控制:解决等待期间PWM信号持续输出问题
在使用ESP32-S3的LED控制器 (LEDC) 生成PWM信号时,你可能会遇到在等待期间PWM信号持续输出的问题。例如,当你使用vTaskDelay()函数暂停程序执行时,PWM信号可能不会按预期停止。
问题分析
考虑以下代码:cppconst int pwmPin = 48; // 选择一个PWM引脚,这里使用GPIO 48
void setup() { ledcAttachPin(pwmPin, 0); // 将PWM引脚连接到LED控制器0 ledcSetup(0, 1000, 8); // 设置LED控制器0,频率为1000Hz,分辨率为8位}
void loop() { // 生成自定义的PWM波形 for(int i = 0 ; i < 2000 ; i++){ ledcWrite(0, 128); // 占空比为50% vTaskDelay(5); } ledcWrite(0, 0); // 停止PWM信号的输出 vTaskDelay(50000); // 等待50秒}
在这段代码中,我们希望在生成一系列PWM脉冲后停止PWM信号输出并等待50秒。然而,由于ledcWrite(0, 0)指令位于vTaskDelay(50000)之后,所以在等待的50秒期间,PWM信号仍然会继续输出。
解决方案
要解决这个问题,只需将ledcWrite(0, 0)指令移到vTaskDelay(50000)之前即可:cppconst int pwmPin = 48; // 选择一个PWM引脚,这里使用GPIO 48
void setup() { ledcAttachPin(pwmPin, 0); // 将PWM引脚连接到LED控制器0 ledcSetup(0, 1000, 8); // 设置LED控制器0,频率为1000Hz,分辨率为8位}
void loop() { // 生成自定义的PWM波形 for(int i = 0 ; i < 2000 ; i++){ ledcWrite(0, 128); // 占空比为50% vTaskDelay(5); } ledcWrite(0, 0); // 停止PWM信号的输出 vTaskDelay(50000); // 等待50秒}
通过将ledcWrite(0, 0)指令放在vTaskDelay(50000)之前,我们确保在进入50秒的等待期之前停止PWM信号输出。
注意事项
- 在ESP32-S3上,我们使用
vTaskDelay()函数而不是delay()函数来实现任务延迟,因为它基于FreeRTOS操作系统。* 确保在项目中包含了FreeRTOS的头文件。
通过以上调整,你就可以在使用ESP32-S3的LEDC生成PWM信号时,精确控制PWM信号的输出,并在需要时停止信号输出。
原文地址: https://www.cveoy.top/t/topic/iGp 著作权归作者所有。请勿转载和采集!