71 lines
2.1 KiB
C
71 lines
2.1 KiB
C
|
/*
|
|||
|
* Copyright (c) 2006-2023, RT-Thread Development Team
|
|||
|
*
|
|||
|
* SPDX-License-Identifier: Apache-2.0
|
|||
|
*
|
|||
|
* Change Logs:
|
|||
|
* Date Author Notes
|
|||
|
* 2023-3-27 wcx1024979076 first version.
|
|||
|
*/
|
|||
|
/*
|
|||
|
* 程序清单:这是一个 PWM 设备使用例程
|
|||
|
* 例程导出了 pwm_led_sample 命令到控制终端
|
|||
|
* 命令调用格式:pwm_led_sample
|
|||
|
* 程序功能:通过 PWM 设备控制 LED 灯的亮度,可以看到LED不停的由暗变到亮,然后又从亮变到暗。
|
|||
|
*/
|
|||
|
#include <rtthread.h>
|
|||
|
#include <rtdevice.h>
|
|||
|
|
|||
|
#ifdef RT_USING_PWM
|
|||
|
|
|||
|
#define LED_PIN_NUM 8 /* LED PIN脚编号,查看驱动文件drv_gpio.c确定 */
|
|||
|
#define PWM_DEV_NAME "pwm" /* PWM设备名称 */
|
|||
|
#define PWM_DEV_CHANNEL 0 /* PWM通道 */
|
|||
|
struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
|
|||
|
static int pwm_led_sample(int argc, char *argv[])
|
|||
|
{
|
|||
|
rt_uint32_t period, pulse, dir;
|
|||
|
period = 500000; /* 周期为0.5ms,单位为纳秒ns */
|
|||
|
dir = 1; /* PWM脉冲宽度值的增减方向 */
|
|||
|
pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */
|
|||
|
|
|||
|
/* 查找设备 */
|
|||
|
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
|
|||
|
if (pwm_dev == RT_NULL)
|
|||
|
{
|
|||
|
rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
|
|||
|
return -RT_ERROR;
|
|||
|
}
|
|||
|
/* 设置PWM周期和脉冲宽度默认值 */
|
|||
|
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
|
|||
|
/* 使能设备 */
|
|||
|
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
|
|||
|
|
|||
|
while (1)
|
|||
|
{
|
|||
|
rt_thread_mdelay(50);
|
|||
|
if (dir)
|
|||
|
{
|
|||
|
pulse += 400000; /* 从0值开始每次增加5000ns */
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
pulse -= 400000; /* 从最大值开始每次减少5000ns */
|
|||
|
}
|
|||
|
if (pulse >= period)
|
|||
|
{
|
|||
|
dir = 0;
|
|||
|
}
|
|||
|
if (0 == pulse)
|
|||
|
{
|
|||
|
dir = 1;
|
|||
|
}
|
|||
|
/* 设置PWM周期和脉冲宽度 */
|
|||
|
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
|
|||
|
}
|
|||
|
}
|
|||
|
/* 导出到 msh 命令列表中 */
|
|||
|
MSH_CMD_EXPORT(pwm_led_sample, pwm sample);
|
|||
|
|
|||
|
#endif /* RT_USING_PWM */
|