1
0

pwm_led_sample.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. #ifdef RT_USING_PWM
  19. #define LED_PIN_NUM 8 /* LED PIN脚编号,查看驱动文件drv_gpio.c确定 */
  20. #define PWM_DEV_NAME "pwm" /* PWM设备名称 */
  21. #define PWM_DEV_CHANNEL 0 /* PWM通道 */
  22. struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
  23. static int pwm_led_sample(int argc, char *argv[])
  24. {
  25. rt_uint32_t period, pulse, dir;
  26. period = 500000; /* 周期为0.5ms,单位为纳秒ns */
  27. dir = 1; /* PWM脉冲宽度值的增减方向 */
  28. pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */
  29. /* 查找设备 */
  30. pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
  31. if (pwm_dev == RT_NULL)
  32. {
  33. rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
  34. return -RT_ERROR;
  35. }
  36. /* 设置PWM周期和脉冲宽度默认值 */
  37. rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
  38. /* 使能设备 */
  39. rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
  40. while (1)
  41. {
  42. rt_thread_mdelay(50);
  43. if (dir)
  44. {
  45. pulse += 400000; /* 从0值开始每次增加5000ns */
  46. }
  47. else
  48. {
  49. pulse -= 400000; /* 从最大值开始每次减少5000ns */
  50. }
  51. if (pulse >= period)
  52. {
  53. dir = 0;
  54. }
  55. if (0 == pulse)
  56. {
  57. dir = 1;
  58. }
  59. /* 设置PWM周期和脉冲宽度 */
  60. rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
  61. }
  62. }
  63. /* 导出到 msh 命令列表中 */
  64. MSH_CMD_EXPORT(pwm_led_sample, pwm sample);
  65. #endif /* RT_USING_PWM */