PWM can't output low level when it is idle.

Hi,

    ncs v3.2.0,nRF54LM20-DK,I drive a buzzer. When the buzzer doesn't ring, I need a low level. I tried it according to the following method. I can't output a low level when pwm is idle.

①Change PWM_POLARITY_NORMAL to PWM_POLARITY_INVERTED,Pwm can't output low when it is idle.

nrf_pwm_channel_idle_set(NRF_PWM21, 0, false);Pwm can't output low when it is idle.

void buzzer_off(void)   function i had try 

pwm_set_dt(&buzzer_pwm, PWM_PERIOD_2_7KHZ_NS, PWM_PERIOD_2_7KHZ_NS );  and  pwm_set_dt(&buzzer_pwm, PWM_PERIOD_2_7KHZ_NS, 0);Pwm can't output low when it is idle.

/* Code */

void buzzer_on(void)
{
if (!device_is_ready(buzzer_pwm.dev)) {
LOG_ERR("PWM device not ready");
return;
}

int ret = pwm_set_dt(&buzzer_pwm, PWM_PERIOD_2_7KHZ_NS, PWM_PERIOD_2_7KHZ_NS / 2);
if (ret < 0) {
LOG_ERR("Failed to turn on buzzer: %d", ret);
} else {
LOG_INF("Buzzer ON (2.7KHz)");
}
}

void buzzer_off(void)
{
int ret = pwm_set_pulse_dt(&buzzer_pwm, 0);
if (ret < 0) {
LOG_ERR("Failed to turn off buzzer: %d", ret);
} else {
LOG_INF("Buzzer OFF");
}
}

/* overlay */

&pwm21 {
    status = "okay";
    pinctrl-0 = < &pwm21_default >;
    pinctrl-1 = < &pwm21_sleep >;
    pinctrl-names = "default", "sleep";
    zephyr,pm-device-runtime-auto;
};
    /omit-if-no-ref/ pwm21_default: pwm21_default {
        group1 {
            psels = <NRF_PSEL(PWM_OUT0, 1, 23)>;
            nordic,invert;  /* 添加这一行来反转极性 */
        };
    };

    /omit-if-no-ref/ pwm21_sleep: pwm21_sleep {
        group1 {
            psels = <NRF_PSEL(PWM_OUT0, 1, 23)>;
            low-power-enable;
        };
    };
pwm_peripherals: pwm-peripherals {
        compatible = "pwm-leds";
        status = "okay";

        buzzer0: buzzer {
            pwms = <&pwm21 0 PWM_MSEC(20) PWM_POLARITY_INVERTED>;
            label = "Buzzer";
        };
    };
Parents Reply Children
No Data
Related