pwm_led_sample.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-11-25 misonyo first implementation.
  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. #define LED_PIN_NUM 57 /* LED PIN脚编号,查看驱动文件drv_gpio.c确定 */
  19. #define PWM_DEV_NAME "pwm3" /* PWM设备名称 */
  20. #define PWM_DEV_CHANNEL 4 /* PWM通道 */
  21. struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
  22. static int pwm_led_sample(int argc, char *argv[])
  23. {
  24. rt_uint32_t period, pulse, dir;
  25. period = 500000; /* 周期为0.5ms,单位为纳秒ns */
  26. dir = 1; /* PWM脉冲宽度值的增减方向 */
  27. pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */
  28. /* 设置LED引脚脚模式为输出 */
  29. rt_pin_mode(LED_PIN_NUM, PIN_MODE_OUTPUT);
  30. /* 拉高LED引脚 */
  31. rt_pin_write(LED_PIN_NUM, PIN_HIGH);
  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. while (1)
  44. {
  45. rt_thread_mdelay(50);
  46. if (dir)
  47. {
  48. pulse += 5000; /* 从0值开始每次增加5000ns */
  49. }
  50. else
  51. {
  52. pulse -= 5000; /* 从最大值开始每次减少5000ns */
  53. }
  54. if (pulse >= period)
  55. {
  56. dir = 0;
  57. }
  58. if (0 == pulse)
  59. {
  60. dir = 1;
  61. }
  62. /* 设置PWM周期和脉冲宽度 */
  63. rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
  64. }
  65. }
  66. /* 导出到 msh 命令列表中 */
  67. MSH_CMD_EXPORT(pwm_led_sample, pwm sample);