STM32CubeMX之定时器TIM,PWM


参考资料:

  1. 《STM32中文参考手册_V10》
  2. 《零死角玩转STM32—F103霸道》

下文出现参考XXX章,默认为 《STM32中文参考手册_V10》里的章节

1 基础定时器的应用

1.1 基础定时器TIM6的应用

实现功能:

  1. 基础定时器TIM6间隔500ms中断一次;

1.1.1 TIM6的参数配置

在这里插入图片描述
定时时间计算:
  所以定时器频率为 f = 72M / Prescaler / Period = 72000 000 / 7200 /5000 = 2Hz;
  定时时间T = 1 / f 则: 1s / 2Hz = 1000 000us / 2Hz = 500 000us =500ms。

1.1.2 TIM6的NVIC配置

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201128095929230.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyOTAwOTk2,size_16,color_FFFFFF,t_70
在这里插入图片描述

1.1.3 生成代码

  1. 在main函数中开启基础定时器TIM6的中断 HAL_TIM_Base_Start_IT(&htim6);
int main(void)
{
  HAL_TIM_Base_Start_IT(&htim6);
  while (1){}
}
  1. 在tim.c文件中实现中断回调函数
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) // 该函数在 stm32f1xx_hal_tim.c 中定义为弱函数(__weak),由用户再定义
{
	  if(htim == &htim6)
	 {
	    HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
	 }
}
/* USER CODE END 1 */

1.1.4 实现现象

将PE5接到逻辑分析仪,注意前提是已经将PE5初始化为输出,由图可以看出中断周期为500ms
在这里插入图片描述

2 高级定时器的应用

2.1 STM32CubeMX中参数分析

2.1.1 Slave Mode

在这里插入图片描述

  1. External Clock Mode 1 :参考 13.3.4 时钟选择
  2. Reset Mode、Gated Mode、Trigger Mode:参考13.4.3 TIM1 和TIM8 从模式控制寄存器(TIMx_SMCR)14.3.14 定时器和外部触发的同步

2.1.2 Trigger Output(TRGO)Parameters

在这里插入图片描述该部分内容实现定时器同步,参考内容如下:

  1. 13.4.3 TIM1 和TIM8 从模式控制寄存器(TIMx_SMCR) 章的 MSM
  2. 13.4.2 TIM1 和TIM8 控制寄存器 2(TIMx_CR2) 章的 MMS[2:0]
  3. 14.3.15 定时器同步

2.1.3 定时器输出引脚选择

  1. 可作为输出的引脚选择,参考 8.3.7 定时器复用功能重映射
  2. 使用STM32CubeMX选择输出引脚有两种方式,选择默认引脚和选择指定引脚
    例如使用高级定时器TIM1通道1输出PWM
    1、选择默认引脚
    在这里插入图片描述2、选择指定引脚
    根据 8.3.7 定时器复用功能重映射 找出可用的引脚,如下图
    在这里插入图片描述
    可作为TIM1_CH1的引脚有PA8和PE9,这里指定PA8作为TIM1_CH1输出PWM
    则先在Pinout view 中将PA8选中作为TIM1_CH1
    在这里插入图片描述
    再按如下操作
    在这里插入图片描述

2.2 PWM互补输出实验

实现功能:TIM1的通道1输出互补PWM,带死区时间,带刹车引脚

2.2.1 CubeMX中TIM1的MODE配置

在这里插入图片描述

2.2.2 CubeMX中TIM1的输出引脚配置

在这里插入图片描述

2.2.3 CubeMX中TIM1的参数配置

在这里插入图片描述
其余的参数请参考:《STM32中文参考手册_V10》《零死角玩转STM32—F103霸道》

  1. PWM的频率及周期计算:
    芯片的时钟为72MHz;Prescaler为7200;Period为200;且计数方式为向上计数
    频率:f = 72M / Prescaler / Period = 72000 000 / 7200 /200 = 50Hz;
    周期:T = 1 / f 则: 1s / 50Hz = 1000 000us / 50Hz = 20 000us =20ms。
    如果计数方式为中央计数: f = 72M / Prescaler / Period / 2 = 25Hz;T = 40ms

  2. 占空比的计算,Period为200;Pulse为100。所以占空比为50%

  3. 死区时间计算:
    参考 13.4.18 TIM1 和TIM8 刹车和死区寄存器(TIMx_BDTR) 章的 DTG[7:0]
    13.4.1 TIM1 和TIM8 控制寄存器 1(TIMx_CR1) 章的 CKD[1:0]

2.2.4 工程的程序修改

main 函数中 MX_TIM1_Init 初始化之后开启CH1和CH1N的PWM输出

	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);    /*开启CH1的PWM输出*/
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1); /*开启CH1N的PWM输出*/

2.2.5 实验现象

  1. 从逻辑分析仪中可以看出,输出频率为50Hz,周期为20ms,占空比为50%。
    在这里插入图片描述
  2. 将PWM放大可以看到存在死区时间
    在这里插入图片描述
  3. 刹车现象
    在这里插入图片描述

3 通用定时器的应用

3.1 通用定时器TIM3输出PWM

3.1.1 基础参数的配置

在这里插入图片描述
定时周期计算:
  所以定时器频率为 f = 72M / Prescaler / Period = 72000 000 / 7200 /200 = 50Hz;
  定时时间T = 1 / f 则: 1s / 50Hz = 1000 000us / 50Hz = 20 000us =20ms。

3.1.2 生成代码

3.1.2.1 开启通道1的PWM并验证
int main(void)
{
  ... /*系统其他的初始化*/
  MX_TIM3_Init();
  HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); /*开启通道1的PWM*/
  while (1)
  {
  }
}
定时器TIM3的通道(引脚)映射:

在这里插入图片描述

使用逻辑分析仪查看产生的PWM
在这里插入图片描述

3.1.2.2 调节PWM的占空比
  1. 自定义函数,调节参数可以调节占空比,注意参数范围是0 ~ Counter Period 。

    void TIM_SetTIM3Compare1(uint32_t compare)
    {
    	TIM3->CCR1=compare; // 注意该值需要在定时器初始化参数Counter Period 范围内 
    }
    
    int main(void)
    {
      ... /*系统其他的初始化*/
      MX_TIM3_Init();
      HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); /*开启通道1的PWM*/
      TIM_SetTIM3Compare1(20);
      while (1)
      {
      }
    }
    

    产生的占空比
    在这里插入图片描述

  2. 使用官方函数调节

    __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,18); 
    

    使用逻辑分析仪查看PWM
    在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值