定时器&PWM应用编程

**

STM32定时器原理

**

STM32F103C8中的定时器

常规定时器功能
基本定时器(TIM6、TIM7)几乎没有任何输入/输出通道,常用作时基,实现基本的定时/计数功能
通用定时器(TIM2、TIM3、TIM4、TIM5)具备多路独立的捕获和比较通道,可以完成定时/计数、输入捕获、输出比较等功能
高级定时器 (TIM1、TIM8)除具备通用定时器的功能外,带死区控制的互补信号输出、紧急刹车关断输入等功能,可用于电机控制和数字电源设计

在这里插入图片描述

基本定时器的内部结构框图

在这里插入图片描述

STM32-PWM相关介绍

STM32-PWM是STM32系列微控制器上的一种重要外设,用于生成脉宽调制(PWM)信号。脉宽调制技术在许多应用中都起着关键作用,如电机控制、LED亮度调节、音频处理等。STM32PWM模块提供了灵活的配置选项和高精度的PWM输出能力。

PWM工作原理

PWM是一种周期性的方波信号,通过调整方波的高电平时间(占空比)来控制输出信号的特性。PWM信号的频率和占空比可以根据应用需求进行配置。在STM32PWM模块中,通过设置定时器的计数周期和比较值,可以实现不同频率和占空比的PWM输出。

STM32PWM模块

STM32PWM模块通常由一个或多个通用定时器(TIM)和相关的GPIO引脚组成。通用定时器提供了灵活的PWM配置选项,可以根据需要进行定时器和GPIO引脚的映射、预分频设置、计数周期和比较值的设定等。

PWM参数配置

为了配置和控制STM32PWM模块,我们可以使用相应的库函数或直接操作寄存器。以下是一些常用的PWM参数和配置选项:

频率设置:通过设置定时器的计数周期来控制PWM信号的频率。

频率 = 定时器时钟频率 / (预分频系数 * 计数周期)

占空比设置:通过设置比较值来控制PWM信号的占空比。

占空比 = (比较值 / 计数周期) * 100%**

极性设置:可以选择正极性或反极性,以控制PWM信号的电平极性。
中断使能:可以选择是否使能PWM定时器的中断功能,用于触发中断任务。

任务一:用定时器计数方式实现LED的亮灭

要求:使用STM32F103的
Tim2~Tim5其一定时器的某一个通道pin(与GPIOx管脚复用,见下图),连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。

STMCubeMX界面

设置SYS和RCC
在这里插入图片描述
在这里插入图片描述
选择PA6管脚进行输出
在这里插入图片描述
设置TIM3
在这里插入图片描述
设置相关参数
![在这里插入图片描述](https://img-blog.csdnimg.cn/5eeb34eb4176433398cabf732eae23c8.png

NVIC勾选

在这里插入图片描述
生成项目

keil界面

在main函数中加入以下代码

  // 启动 PWM 和定时器
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

  // 启动定时器并启用中断
  HAL_TIM_Base_Start_IT(&htim3);

在main函数后重写中断函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  if (htim->Instance == TIM3) {
    static int toggle = 0;
    if (toggle == 0) {
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET);
      toggle = 1;
    } else {
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);
      toggle = 0;
    }
  }
}

编译结果
在这里插入图片描述
烧录结果

VID_20231108_210518

任务二:呼吸灯

要求:接上,采用定时器pwm模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整到一个满意效果。使用Keil虚拟示波器,观察
pwm输出波形。

在以上项目的基础上,在main函数的开头加入以下变量声明

    uint16_t pwmVal=0;   
    uint8_t dir=1; 

开启时钟

 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);

在While循环里面添加以下代码

 while (pwmVal< 500)
	  {
		  pwmVal++;
		  __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwmVal);    
		  HAL_Delay(1);
	  }
	  while (pwmVal)
	  {
		  pwmVal--;
		  __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwmVal);    
		  HAL_Delay(1);
	  }
	  HAL_Delay(200);

编译并烧录得出以下结果
在这里插入图片描述

波形如下:
在这里插入图片描述

总结

本次实验的内容为STM32的定时器和PWM的应用编程。在STMCubeMX中用hal库编写程序能够轻松配置定时器和PWM的参数。实验过程中我认识了定时器和PWM的工作原理,学会了在STMCubeMX中配置PWM输出,包括设置占空比、频率和极性等。还掌握了中断服务程序、定时器中断的编写方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值