细说STM32单片机通用定时器使用输出比较功能生成PWM波的方法

目录

一、本实例测试的目的

二、硬件和CubeMX项目配置

1、硬件开发板 

2、项目配置

(1)定时器TIM2_CH1

(2)时钟和Debug

三、使用比较功能生成PWM

1、启动定时器

2、TIM2_CH1通道GPIO初始化

3、下载与测试


一、本实例测试的目的

  • 使用TIM2_CH1的输出比较功能,控制PA5引脚翻转输出,使得LD2闪烁; 
  • TIM2_CH1的输出PWM方波占空比恒为50%,不受CCR控制;
  • 通过输出比较生成的PWM的起始位置由CCR控制;

二、硬件和CubeMX项目配置

1、硬件开发板 

        本试验使用的硬件资源参考本文作者的文章:细说STM32单片机使用通用定时器生成固定占空比和可变占空比PWM波的方法-CSDN博客  https://wenchm.blog.csdn.net/article/details/142212487

2、项目配置

(1)定时器TIM2_CH1

        Channel1选择Output Compare CH1;Clock Source选择Internal Clock;

  •  One PulseMode复选框用于设置单脉冲模式,定时器输出比较的单脉冲模式是一种特殊模式,有一组以“HAL_TIM_OnePulse”为前缀的HAL 驱动函数。本例不使用单脉冲模式。
  • Counter Settings组用于设置定时器的基本参数,主要设置结果如下。
  •  PSC的值设置为16999,所以计数器时钟频率为10000Hz。
  • ARR的值设置为4999,所以定时器 UEV事件周期为500ms。
  • Output Compare Channel1组是通道1的输出比较参数,各个参数的意义和设定值如下。
  •  Mode,输出比较模式,有冻结、有效电平、翻转等多种选择。这里设置为Toggle on match,也就是在计数器的值与CCR的值相等时,使CH1输出翻转。
  •  Pulse,脉冲宽度,也就是CCR的值,这里设置为3000,所以脉冲宽度是300 ms。
  • Output compare preload,设置CCR是否使用预装载功能。本示例设置为Enable或Disable无影响。
  •  CH Polarity,通道极性。本示例模式设置为匹配时输出翻转,与此参数无关。

        如果CCR和计数器的值匹配,就会使CH1的输出翻转。从原理图上可以看出,CH1的输出是一个方波信号,且不管CCR的值为多少(需要小于ARR的值),方波的占空比总是50%,脉宽总是与ARR的值相等。

(2)时钟和Debug

        HSE选择外部晶振,24MHZ,APB1 = APB2 = 170MHz;

        Debug选择Serial Wire;

三、使用比较功能生成PWM

        自动定义表示定时器TIM2的外设对象变量htim2,在函数MX_TIM2_Init()中,设置htim2各参数的值之后,调用HAL_TIM_Base Init()进行定时器初始化,调用HAL_TIM_OC_Init() 进行输出比较初始化,然后使用TIM_OC_InitTypeDef类型的变量sConfigOC设置输出比较通道的参数,再调用函数HAL_TIM_OC_ConfigChannel()对TIM2的CH1进行输出比较配置。 

1、启动定时器

/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim2); 				//启动定时器TIM2
  HAL_TIM_OC_Start(&htim2,TIM_CHANNEL_1);	//启动CH1的输出比较功�??
/* USER CODE END 2 */

2、TIM2_CH1通道GPIO初始化

        自动生成 :

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(htim->Instance==TIM2)
  {
  /* USER CODE BEGIN TIM2_MspPostInit 0 */

  /* USER CODE END TIM2_MspPostInit 0 */

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**TIM2 GPIO Configuration
    PA5     ------> TIM2_CH1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM2_MspPostInit 1 */

  /* USER CODE END TIM2_MspPostInit 1 */
  }

}

3、下载与测试

        下载、运行,用眼睛观察到LD2以生成的PWM的频率闪烁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wenchm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值