[STM32L0] STM32L051C8T6 HAL库 使用PWM控制LED灯

[复制链接]
1735|4
 楼主| wang6623 发表于 2024-3-28 19:03 | 显示全部楼层 |阅读模式
芯片型号: STM32L051C8T6
      通道 :TIM22_CH2

      输出引脚:PA7  

2、知识回顾,要使用PWM功能,必须要在通用定时器配置才行,基本定时器是没有PWM这个功能的。
      1) 通用定时器(TIM2/3,TIM21/22)

      2) 基本定时器(TIM6/7)

          对定时器周期公式的理解:

         F = 1 / T (周期与频率的公式)

         其中TICK为时钟频率,PSC为时钟预分频系数,arr为自动重装载值。

         F = Tick / (psc+1) * (arr+1)

         (注意:频率F来计算ARR和PSC,由于ARR和PSC寄存器只有16位,所以ARR和PSC值都必须小于65535,且只能是整数)

         Tick / (psc+1)即为时钟频率,1/f 为机器周期,乘以(arr+1)即可得出定时器周期。

         例子:TICK=72MHZ,psc=71,时钟周期=1us,(arr+1)值为多少,定时器周期就为多少毫秒。

3、引脚配置
1、STM32CubeMx配置(注:占空比参数不需要填,默认即可)

8419266054e5e04945.png

5836766054e6d80162.png



4801666054e637d735.png
 楼主| wang6623 发表于 2024-3-28 19:03 | 显示全部楼层
main.c文件代码
  1. /* USER CODE BEGIN 1 */
  2.         uint16_t dutycycle=0;
  3.         uint8_t dir=0;
  4.   /* USER CODE END 1 */



  5.   
  6.   /* USER CODE BEGIN 2 */
  7. //        HAL_TIM_PWM_Start(&htim22, TIM_CHANNEL_1);
  8.         HAL_TIM_PWM_Start(&htim22, TIM_CHANNEL_2);
  9.   /* USER CODE END 2 */



  10. /* USER CODE BEGIN WHILE */
  11.   while (1)
  12.   {
  13. #if 0
  14.                 while(dutycycle<1000)
  15.                 {
  16.                         dutycycle++;
  17. //                        __HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_1,dutycycle); //库操作方式
  18.                         __HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_2,dutycycle); //库操作方式
  19. //                        TIM22->CCR2 = dutycycle;         //寄存器操作方式
  20.                         HAL_Delay(1);
  21.                 }
  22.                 while(dutycycle)
  23.                 {
  24.                         dutycycle--;
  25. //                        __HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_1,dutycycle); //库操作方式
  26.                         __HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_2,dutycycle); //库操作方式
  27. //                        TIM22->CCR2 = dutycycle;         //寄存器操作方式
  28.                         HAL_Delay(1);
  29.                 }
  30.                 HAL_Delay(100);
  31. //        HAL_TIM_PWM_Stop(&htim22, TIM_CHANNEL_1);    //这里根据具体情况来定,禁用pwm
  32. //        HAL_TIM_PWM_Stop(&htim22, TIM_CHANNEL_2);    //

  33. #else
  34.                 HAL_Delay(2);
  35.                 if(dir) dutycycle++;
  36.                 else        dutycycle--;
  37.                
  38.                 if(dutycycle>1000)                        dir = 0;
  39.                 else if(dutycycle<=1000)        dir = 1;
  40. //                __HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_1,dutycycle); //库操作方式
  41.                 __HAL_TIM_SET_COMPARE(&htim22,TIM_CHANNEL_2,dutycycle); //库操作方式
  42. #endif
  43.     /* USER CODE END WHILE */

  44.     /* USER CODE BEGIN 3 */
  45.   }
  46.   /* USER CODE END 3 */
 楼主| wang6623 发表于 2024-3-28 19:03 | 显示全部楼层
注:决定输出频率和占空比主要由这三个参数(Prescaler(PSC:分频系数)、Period(重装载值)、Pulse(脉宽值))决定的。

例一:

PWM频率 = 系统时钟32MHZ / 32 / 1000 = 1000HZ = 1KHz

占空比 = 脉宽值(Pulse) / 装载值(Period) * 100% = 999 / 1000 * 100% = 99.9%

例二:

输出1KHz,20%来举例说明:

TIM22_PRESCALER_VALUE = 32M / 2 / 8M - 1 = 1 (也就是2分频)

tim22_Period = 8000 - 1

tim22_Pulse = 1600

频率1KHz  =  16M / 16000

占空比20%  =  1600/16000  

同理:3200/32000也是20%
zwsam 发表于 2024-3-28 22:16 | 显示全部楼层
zwsam 发表于 2024-3-28 22:16 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

617

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部