Cómo desconectar el periférico ESP32 PWM LEDC del pin GPIO

0

Estoy controlando muchos LED utilizando ESP32 y solo un periférico PWM (LEDC). Solo necesito tener un LED atenuado a la vez, los demás LED deben estar apagados.

Controlo correctamente la atenuación del LED y la función PWM. Después de que termine con ese LED, debo cambiar a otro LED. Cuando reconfijo el pin GPIO del canal LEDC, luego llame al ledc_channel_config () nuevamente, el PWM aparece correctamente en el nuevo pin, que es lo que pretendía.

EL PROBLEMA: El problema es que también continúa emitiendo el PWM en el pin anterior, lo cual no es deseable. ¿Cómo desconecto el periférico PWM del pin anterior? Probé muchas cosas sin éxito, como llamar a ledc_stop (). También leí sobre IOMUX.

MI CÓDIGO: Hice la estructura del canal global:

ledc_channel_config_t ledc_channel_fade_A = {0};

Después de restablecer, inicializo la estructura con valores que no cambian durante el programa, excepto el pin GPIO y el deber:

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).
}

Entonces empiezo a usarlo. Acabo de cambiar el número de pin GPIO y el deber, y pin pin sale correctamente el PWM en el pin deseado:

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));

Hasta ahora todo bien. Ahora quiero detenerme con ese LED (no solo hacer el trabajo = 0, quiero decir que no hay más conexión con el periférico PWM). Llamo a la configuración del canal con otro valor de pin. Se emitirá correctamente en el nuevo pin, pero no se detendrá en el pin anterior:

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));

Estoy bastante seguro de que entiendo que el periférico PWM permanece conectado a ambos pines. ¿Cómo lo desconecto usando la API ESP32?

    
pregunta EmbeddedGuy

0 respuestas

Lea otras preguntas en las etiquetas