这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【mcxw71学习使用zephyr开发】3基于zephyr的呼吸灯

共1条 1/1 1 跳转至

【mcxw71学习使用zephyr开发】3基于zephyr的呼吸灯

高工
2025-12-09 14:36:22     打赏

【前言】

FRDM-MCXW71 开发板上有 RGB LED,并且从设备树(DTS)片段可以看到:

blue-pwm-led = &blue_pwm_led;
green-pwm-led = &green_pwm_led;
red-pwm-led = &red_pwm_led;

这说明 红、绿、蓝三个通道都支持 PWM 控制,非常适合做呼吸灯(Breathing LED) 效果!

【目标】

实现一个平滑的“呼吸”效果(亮度从 0 → 最亮 → 0 循环),使用 PWM 驱动 RGB LED 的蓝色通道。

【步骤概览】

1、确认 PWM 设备树别名可用

2、在 prj.conf 中启用 PWM 驱动

3、编写呼吸灯代码(使用正弦波或线性渐变)

4、编译烧录

【操作步骤】

1、通过

BLUE_LED_NODE DT_ALIAS(blue_pwm_led)

获取 PWM 通道。

2、配置文件 prj.conf

# 启用 PWM 子系统
CONFIG_PWM=y

# 启用 NXP MCX TPM PWM 驱动(针对 FRDM-MCXW71)
CONFIG_PWM_MCUX_TPM=y

3、呼吸灯代码

#include <zephyr/kernel.h>
#include <zephyr/drivers/pwm.h>

#define BLUE_LED_NODE DT_ALIAS(blue_pwm_led)
#define GREEN_LED_NODE DT_ALIAS(green_pwm_led)
#define RED_LED_NODE DT_ALIAS(red_pwm_led)

int main(void)
{
    const struct pwm_dt_spec blue = PWM_DT_SPEC_GET(BLUE_LED_NODE);
    const struct pwm_dt_spec green = PWM_DT_SPEC_GET(GREEN_LED_NODE);
    const struct pwm_dt_spec red = PWM_DT_SPEC_GET(RED_LED_NODE);

    if (!device_is_ready(blue.dev))
    {
        return -1;
    }

    uint32_t period_ns = 20000000; // 20 ms
    int pulse_ns = 0;

    while (1)
    {
        // 呼吸灯效果示例
        for (pulse_ns = 0; pulse_ns <= period_ns; pulse_ns += 100000)
        {
            pwm_set_dt(&blue, period_ns, pulse_ns);
            k_msleep(5);
        }
        for (pulse_ns = period_ns; pulse_ns >= 0; pulse_ns -= 100000)
        {
            pwm_set_dt(&blue, period_ns, pulse_ns);
            k_msleep(5);
        }
    }

    return 0;
}

【关键说明】

1、使用 pwm_set_dt()

这是 Zephyr 推荐的方式,自动从设备树获取 PWM 设备、通道、极性等。

你不需要手动处理 PWM_DEV / PWM_CH,除非要做高级控制。

2、 时间单位

PWM_USEC(PERIOD_US) → 周期设为 20,000 微秒(20ms)

pulse_ns 是脉宽(纳秒),所以 PERIOD_US * 1000 转换为 ns

【效果】

下载到开发板后就实现了非常美的呼吸灯,当然还有更加美的效果,详见源代码:

my_blniky.zip





关键词: mcxw71     zephyr     呼吸     pw    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]