我使用ESP32和一个PWM(LEDC)外围设备控制许多LED。我只需要一次使一个LED变暗,其他LED必须熄灭。
我正确控制了LED调光和PWM占空比。用完该LED后,我必须切换到另一个LED。当我重新配置LEDC通道GPIO引脚,然后再次调用ledc_channel_config()时,PWM会正确显示在新引脚上,这正是我想要的。
问题: 问题在于它还会继续在前一个引脚上输出PWM,这是不希望的。如何断开PWM外设与先前引脚的连接?我尝试了很多没有成功的事情,例如调用ledc_stop()。我还阅读了有关IOMUX的信息。
我的代码: 我将渠道结构设为全局:
ledc_channel_config_t ledc_channel_fade_A = {0};
重置后,我将使用程序中不变的值(GPIO引脚和占空比除外)来初始化结构
void pwm_init_fade_channels(void)
{
ledc_channel_fade_A.gpio_num = LED_PWR_A; // selecting physical GPIO pin, this will be changing for each insert
ledc_channel_fade_A.speed_mode = LEDC_HIGH_SPEED_MODE; // currently this is the only choice
ledc_channel_fade_A.channel = PWM_FADE_CHANNEL_A; // one of LEDC_CHANNEL_0 ... LEDC_CHANNEL_7
ledc_channel_fade_A.intr_type = LEDC_INTR_DISABLE;
ledc_channel_fade_A.timer_sel = PWM_TIMER_FADES; // one of LEDC_TIMER0 ... LEDC_TIMER_3
ledc_channel_fade_A.duty = 0; // Value of the timer (!) after which the signal will drop low (for 10-bit timer 0...1023).
}
然后我开始使用它。我只需更改GPIO引脚号和占空比,然后在所需的引脚上正确输出PWM:
ledc_channel_fade_A.gpio_num = gpio_pin_no; // selecting physical GPIO pin, changing for each insert
ledc_channel_fade_A.duty = duty; // Value of the timer (!) after which the signal will drop low (for 10-bit timer 0...1023).
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel_fade_A));
到目前为止,一切都很好。现在我要停止使用该LED(不仅仅是使占空比= 0,我的意思是不再与PWM外设连接)。我用另一个引脚值调用通道配置。它将在新引脚上正确输出,但不会停止在旧引脚上输出:
ledc_channel_fade_A.gpio_num = NEW_gpio_pin_no; // selecting physical GPIO pin, changing for each insert
ledc_channel_fade_A.duty = NEW_duty; // Value of the timer (!) after which the signal will drop low (for 10-bit timer 0...1023).
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel_fade_A));
我相当确定我知道PWM外设保持连接到两个引脚。如何使用ESP32 API断开连接?