【前言】
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
【效果】
下载到开发板后就实现了非常美的呼吸灯,当然还有更加美的效果,详见源代码:
我要赚赏金
