1 /*
2 * Copyright (c) 2006-2023, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2023-3-27 wcx1024979076 first version.
9 */
10 /*
11 * 程序清单:这是一个 PWM 设备使用例程
12 * 例程导出了 pwm_led_sample 命令到控制终端
13 * 命令调用格式:pwm_led_sample
14 * 程序功能:通过 PWM 设备控制 LED 灯的亮度,可以看到LED不停的由暗变到亮,然后又从亮变到暗。
15 */
16 #include <rtthread.h>
17 #include <rtdevice.h>
18
19 #ifdef BSP_USING_PWM
20
21 #define LED_PIN_NUM 8 /* LED PIN脚编号,查看驱动文件drv_gpio.c确定 */
22 #define PWM_DEV_NAME "pwm" /* PWM设备名称 */
23 #define PWM_DEV_CHANNEL 0 /* PWM通道 */
24 struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
pwm_led_sample(int argc,char * argv[])25 static int pwm_led_sample(int argc, char *argv[])
26 {
27 rt_uint32_t period, pulse, dir;
28 period = 500000; /* 周期为0.5ms,单位为纳秒ns */
29 dir = 1; /* PWM脉冲宽度值的增减方向 */
30 pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */
31
32 /* 查找设备 */
33 pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
34 if (pwm_dev == RT_NULL)
35 {
36 rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
37 return -RT_ERROR;
38 }
39 /* 设置PWM周期和脉冲宽度默认值 */
40 rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
41 /* 使能设备 */
42 rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
43
44 while (1)
45 {
46 rt_thread_mdelay(50);
47 if (dir)
48 {
49 pulse += 400000; /* 从0值开始每次增加5000ns */
50 }
51 else
52 {
53 pulse -= 400000; /* 从最大值开始每次减少5000ns */
54 }
55 if (pulse >= period)
56 {
57 dir = 0;
58 }
59 if (0 == pulse)
60 {
61 dir = 1;
62 }
63 /* 设置PWM周期和脉冲宽度 */
64 rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
65 }
66 }
67 /* 导出到 msh 命令列表中 */
68 MSH_CMD_EXPORT(pwm_led_sample, pwm sample);
69
70 #endif /* RT_USING_PWM */
71