• stm32 笔记 PWM及HAL库应用


    stm32 PWM原理

     STM32 使用一个定时器作为 PWM 输出,在上图中,ARR 即为重装载值。在计数器的值大于CRRx的值并且小于 ARR 之间,即区分高低电平。输出在图中分别有 ① 和 ② 两种情况.

    分别为:

    ①CRR 和 ARR 区间为低电平。

    ②CRR 和 ARR 区间为高电平。

    设置输出方式

    有两个配置可以配置输出方式:

    PWM 模式 1–– 在递增计数模式下,只要 TIMx_CNTTIMx_CCR1,通道 1 便为无效状态,否则为有效状态。

    PWM 模式 2–– 在递增计数模式下,只要 TIMx_CNTTIMx_CCR1,通道 1 便为有效状态,否则为无效状态。

    TIMx_CNT即为当前计数值

    其中 PWM 模式 1 和模式 2 完全相反。

     除了设置PWM模式之外,还可以设置 CERR:CC1P 位,置 0 高电平有效,置 1 低电平有效。

     例:

    如果设置为 PWM1 模式,CC1P 设置为 0,即为:①波形

    如果设置为 PWM1 模式,CC1P 设置为 1,即为:②波形

     初始化 PWM

    1. TIM_HandleTypeDef TIM3_Handler; //定时器3PWM句柄
    2. TIM_OC_InitTypeDef TIM3_CH4Handler; //定时器3通道4句柄
    3. void TIM3_PWM_Init()
    4. {
    5. TIM3_Handler.Instance=TIM3; //定时器3
    6. TIM3_Handler.Init.Prescaler=90-1; //定时器分频
    7. TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    8. TIM3_Handler.Init.Period=500-1; //自动重装载值
    9. HAL_TIM_PWM_Init(&TIM3_Handler); //初始化PWM
    10. TIM3_CH4Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    11. TIM3_CH4Handler.Pulse=250; //设置默认占空比
    12. TIM3_CH4Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 cc1p为0
    13. HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4);//配置TIM3通道4
    14. HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_4);//开启PWM通道4
    15. }

     在上边我们设置了 90分频(Prescaler),我当前机器设置的是 90mhz,90 分频后即为 1mhz 即一秒计数 1000 次,重装载值 (Period)设置为 500。也就说,对于当前 PWM 周期为 500ms。

    在之后,我们设置了 TIM3_CH4Handler.Pulse=250; 这即是默认的输出占空比。

    输出波形如图所示:

     

    设置 GPIO 状态

    在芯片手册中,我们发现 PB1 可以被复用为 TIM3,于是做出如下设置: 

    1. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
    2. {
    3. GPIO_InitTypeDef GPIO_Initure;
    4. __HAL_RCC_TIM3_CLK_ENABLE(); //使能定时器3
    5. __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
    6. GPIO_Initure.Pin=GPIO_PIN_1; //PB1
    7. GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
    8. GPIO_Initure.Pull=GPIO_PULLUP; //上拉
    9. GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
    10. GPIO_Initure.Alternate= GPIO_AF2_TIM3; //PB1复用为TIM3_CH4
    11. HAL_GPIO_Init(GPIOB,&GPIO_Initure);
    12. }

     我们想让 PB1 输出 PWM 波,需要开启时钟这些常规配置。并且需要使用GPIO_Initure.Alternate= GPIO_AF2_TIM3; 使 PB1 复用成 TIM3。这样才可以输出 PWM 波。

    编写设置 PWM 值函数

    因为我们刚才在初始化的时候用了:

    HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4)

    HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_4)

    均是 CHANNEL_4 使用了通道4。

    1. //设置TIM通道4的占空比
    2. //compare:比较值
    3. void TIM_SetTIM3Compare4(u32 compare)
    4. {
    5. TIM3->CCR4=compare;
    6. }

    全部代码

    1. #include "sys.h"
    2. #include "delay.h"
    3. TIM_HandleTypeDef TIM3_Handler; //定时器3PWM句柄
    4. TIM_OC_InitTypeDef TIM3_CH4Handler; //定时器3通道4句柄
    5. void TIM3_PWM_Init()
    6. {
    7. TIM3_Handler.Instance=TIM3; //定时器3
    8. TIM3_Handler.Init.Prescaler=90-1; //定时器分频
    9. TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    10. TIM3_Handler.Init.Period=500-1; //自动重装载值
    11. HAL_TIM_PWM_Init(&TIM3_Handler); //初始化PWM
    12. TIM3_CH4Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    13. TIM3_CH4Handler.Pulse=250; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
    14. TIM3_CH4Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 cc1p为0
    15. HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4);//配置TIM3通道4
    16. HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_4);//开启PWM通道4
    17. }
    18. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
    19. {
    20. GPIO_InitTypeDef GPIO_Initure;
    21. __HAL_RCC_TIM3_CLK_ENABLE(); //使能定时器3
    22. __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
    23. GPIO_Initure.Pin=GPIO_PIN_1; //PB1
    24. GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
    25. GPIO_Initure.Pull=GPIO_PULLUP; //上拉
    26. GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
    27. GPIO_Initure.Alternate= GPIO_AF2_TIM3; //PB1复用为TIM3_CH4
    28. HAL_GPIO_Init(GPIOB,&GPIO_Initure);
    29. }
    30. //设置TIM通道4的占空比
    31. //compare:比较值
    32. void TIM_SetTIM3Compare4(u32 compare)
    33. {
    34. TIM3->CCR4=compare; //因为使用了通道4,所以需要修改 CCR4 寄存器
    35. }
    36. int main(void)
    37. {
    38. GPIO_InitTypeDef GPIO_Initure;
    39. HAL_Init(); //初始化HAL库
    40. Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
    41. TIM3_PWM_Init();
    42. while(1){
    43. TIM_SetTIM3Compare4(0); //因为使用了 PWM模式1 以及cc1p0 所以设置0是最暗 设置500是最亮
    44. }
    45. }

  • 相关阅读:
    四肽Suc-AAPD-对硝基苯胺,165174-58-3
    MP4 格式:最少加载多少数据就能渲染出视频首帧?优化短视频播放体验必须先了解它丨音视频基础
    【多目标优化算法】多目标粘液霉菌算法(MOSMA)附Matlab代码
    SystemUI导航栏
    [go学习笔记.第十五章.反射,常量] 2.常量
    听说转行软件测试只能自学,培训机构是个坑?
    论文阅读:HarDNet: A Low Memory Traffic Network
    牛客 ---- 复数乘法
    PHP 运行 mkdir() Permission Denied 的原因
    理解ROS tf
  • 原文地址:https://blog.csdn.net/nullccc/article/details/128132290