rtthread pwm设备控制led小灯亮度

迷南。 2022-08-31 13:19 387阅读 0赞

本文所讲内容的开发坏境基于keil5,rt-thread-4.0.3,env,STM32CubeMX等,硬件为德飞莱尼莫m3s开发板。开发环境搭建及安装请自行百度。内容简单粗暴,不要太计较,主要是实现了功能。

本文不讲理论知识,rttheard PWM设备驱动相关知识请移步官网https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm

本文也不讲rtthread移植相关及env环境搭建,要想了解相关知识请移步官网https://www.rt-thread.org/document/site/#/development-tools/env/env

德飞莱尼莫m3s开发板采用STM32F103ZET6作为主控芯片,共有两个红色用户功能led灯,如下图:

20210725212025706.png

本文选用led3 作为被控led灯,由图可知要想控制led3的亮度,就是控制PB5引脚的低电平持续时间,持续时间越长越亮,越短越暗。

查询STM32F103ZET6相关手册可知PB5对应TIM3_CH2通道,所以我们就是要配置此引脚的PWM功能。方法如下:

1.通过env配置相关功能,进入工程目录下,rt-thread-4.0.3\bsp\stm32\stm32f103-dofly-M3S,右击鼠标,弹出如下画面

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ3NTQ4NDE_size_16_color_FFFFFF_t_70

选择ConEmu Here后弹出如下所示画面

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ3NTQ4NDE_size_16_color_FFFFFF_t_70 1

输入menuconfig后按回车键打开配置画面,如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ3NTQ4NDE_size_16_color_FFFFFF_t_70 2

按键盘上下箭头选择第二项,RT-Thread Components —->,如下图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ3NTQ4NDE_size_16_color_FFFFFF_t_70 3

按回车进入,进入后按键盘上下箭头选择Device Drivers —->,如下图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ3NTQ4NDE_size_16_color_FFFFFF_t_70 4

按回车进入,进入后按键盘上下箭头选择[ ] Using hardware timer device drivers,如下图

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ3NTQ4NDE_size_16_color_FFFFFF_t_70 5

按下Y键使能此项配置,选项前面的方挂号内会多出*,使能后如下图所示

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ3NTQ4NDE_size_16_color_FFFFFF_t_70 6

继续往下找到 [ ] Using PWM device drivers选项,并使能它,方法如上。如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ3NTQ4NDE_size_16_color_FFFFFF_t_70 7

使能之前需要修改一下Kconfig配置文件,此文件在rt-thread-4.0.3\components\drivers目录下,修改内容如下:

  1. config RT_USING_PWM
  2. bool "Using PWM device drivers"
  3. default n
  4. if RT_USING_PWM
  5. config BSP_USING_PWM1
  6. bool "Using TIM1_PWM"
  7. default n
  8. if BSP_USING_PWM1
  9. config BSP_USING_PWM1_CH1
  10. bool "Using TIM1 PWM channel1"
  11. default n
  12. config BSP_USING_PWM1_CH2
  13. bool "Using TIM1 PWM channel1"
  14. default n
  15. config BSP_USING_PWM1_CH3
  16. bool "Using TIM1 PWM channel1"
  17. default n
  18. config BSP_USING_PWM1_CH4
  19. bool "Using TIM1 PWM channel1"
  20. default n
  21. endif
  22. config BSP_USING_PWM2
  23. bool "Using TIM2_PWM"
  24. default n
  25. if BSP_USING_PWM2
  26. config BSP_USING_PWM2_CH1
  27. bool "Using TIM2 PWM channel1"
  28. default n
  29. config BSP_USING_PWM2_CH2
  30. bool "Using TIM2 PWM channel2"
  31. default n
  32. config BSP_USING_PWM2_CH3
  33. bool "Using TIM2 PWM channel3"
  34. default n
  35. config BSP_USING_PWM2_CH4
  36. bool "Using TIM2 PWM channel4"
  37. default n
  38. endif
  39. config BSP_USING_PWM3
  40. bool "Using TIM3_PWM"
  41. default n
  42. if BSP_USING_PWM3
  43. config BSP_USING_PWM3_CH1
  44. bool "Using TIM3 PWM channel1"
  45. default n
  46. config BSP_USING_PWM3_CH2
  47. bool "Using TIM3 PWM channel2"
  48. default n
  49. config BSP_USING_PWM3_CH3
  50. bool "Using TIM3 PWM channel3"
  51. default n
  52. config BSP_USING_PWM3_CH4
  53. bool "Using TIM3 PWM channel4"
  54. default n
  55. endif
  56. config BSP_USING_PWM4
  57. bool "Using TIM4_PWM"
  58. default n
  59. if BSP_USING_PWM4
  60. config BSP_USING_PWM4_CH1
  61. bool "Using TIM4 PWM channel1"
  62. default n
  63. config BSP_USING_PWM4_CH2
  64. bool "Using TIM4 PWM channel2"
  65. default n
  66. config BSP_USING_PWM4_CH3
  67. bool "Using TIM4 PWM channel3"
  68. default n
  69. config BSP_USING_PWM4_CH4
  70. bool "Using TIM4 PWM channel4"
  71. default n
  72. endif
  73. config BSP_USING_PWM5
  74. bool "Using TIM5_PWM"
  75. default n
  76. if BSP_USING_PWM5
  77. config BSP_USING_PWM5_CH1
  78. bool "Using TIM5 PWM channel1"
  79. default n
  80. config BSP_USING_PWM5_CH2
  81. bool "Using TIM5 PWM channel2"
  82. default n
  83. config BSP_USING_PWM5_CH3
  84. bool "Using TIM5 PWM channel3"
  85. default n
  86. config BSP_USING_PWM5_CH4
  87. bool "Using TIM5 PWM channel4"
  88. default n
  89. endif
  90. endif

该段修改的内容具体是啥意思这里不作讲解,想了解的可以百度搜索相关资料研究。这段代码主要用来实现PWM功能的配置。使能后如下图所示:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ3NTQ4NDE_size_16_color_FFFFFF_t_70 8

从图中可以看出选择了 TIM3的PWM_CH2功能。配置好后连续按ESC键退至如下所示画面

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ3NTQ4NDE_size_16_color_FFFFFF_t_70 9

按下回车键退出配置画面。

输入scons —target=mdk5按回车键重新生成keil5工程。

打开工程,在工程中stm32f1xx_hal_msp.c最下方添加如下代码:

  1. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle)
  2. {
  3. if(tim_pwmHandle->Instance==TIM3)
  4. {
  5. /* USER CODE BEGIN TIM3_MspInit 0 */
  6. /* USER CODE END TIM3_MspInit 0 */
  7. /* TIM3 clock enable */
  8. __HAL_RCC_TIM3_CLK_ENABLE();
  9. /* USER CODE BEGIN TIM3_MspInit 1 */
  10. /* USER CODE END TIM3_MspInit 1 */
  11. }
  12. }
  13. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
  14. {
  15. GPIO_InitTypeDef GPIO_InitStruct = {0};
  16. if(timHandle->Instance==TIM3)
  17. {
  18. /* USER CODE BEGIN TIM3_MspPostInit 0 */
  19. /* USER CODE END TIM3_MspPostInit 0 */
  20. __HAL_RCC_GPIOB_CLK_ENABLE();
  21. /**TIM3 GPIO Configuration
  22. PB5 ------> TIM3_CH2
  23. */
  24. GPIO_InitStruct.Pin = GPIO_PIN_5;
  25. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  26. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  27. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  28. __HAL_AFIO_REMAP_TIM3_PARTIAL();
  29. /* USER CODE BEGIN TIM3_MspPostInit 1 */
  30. /* USER CODE END TIM3_MspPostInit 1 */
  31. }
  32. }
  33. void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle)
  34. {
  35. if(tim_pwmHandle->Instance==TIM3)
  36. {
  37. /* USER CODE BEGIN TIM3_MspDeInit 0 */
  38. /* USER CODE END TIM3_MspDeInit 0 */
  39. /* Peripheral clock disable */
  40. __HAL_RCC_TIM3_CLK_DISABLE();
  41. /* USER CODE BEGIN TIM3_MspDeInit 1 */
  42. /* USER CODE END TIM3_MspDeInit 1 */
  43. }
  44. }

该段代码主要用于初始化PB5引脚的PWM硬件功能,此段代码可以通过STM32CubeMX生成,生成方法自己百度搜索解决。

编译工程测试设备驱动添加是否成功,如果编译无错表示添加成功,编译有误根据实际错误排查问题,如有疑问可以联系我一起帮忙解决。

在主程序中添加测试代码,如下:

  1. int main(void)
  2. {
  3. struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
  4. static rt_uint32_t period, pulse;
  5. #define PWM_DEV_NAME "pwm3" /* PWM设备名称 */
  6. #define PWM_DEV_CHANNEL 2 /* PWM通道 */
  7. period = 500000; /* 周期为0.5ms,单位为纳秒ns */
  8. pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */
  9. /* 查找设备 */
  10. pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
  11. /* 设置PWM周期和脉冲宽度 */
  12. rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
  13. /* 使能设备 */
  14. rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
  15. // /* 关闭设备通道 */
  16. // rt_pwm_disable(pwm_dev,PWM_DEV_CHANNEL);
  17. while (count++)
  18. {
  19. pulse = pulse + 2000;
  20. if(pulse >= period) pulse = 0;
  21. rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
  22. rt_thread_mdelay(10);
  23. }
  24. return RT_EOK;
  25. }

编译后下载至开发板中观察led3调节亮度效果,如下:

rtthread pwm调节led亮度

https://v.qq.com/x/page/n3263z7js0k.html

发表评论

表情:
评论列表 (有 0 条评论,387人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PWM

    PWM脉冲宽调点灯 前言 对于灯等来说有很多种方法,前面介绍了一些基础的点灯方法,比如直接点灯,按键控制点灯,按键中断点灯,但都是比较简单的一些方法也很基础,要问我

    相关 PWM --呼吸

    呼吸灯最早见于苹果的电脑,近年来,在各种手机上也频频出现。 呼吸灯是很简单的东西,用一片 555,搭成一个多谐振荡器,再用 RC 电路滤成锯齿波,再驱动 LED 就