定时器&PWM应用编程

STM32定时器

定时器的原理作用

在STM32中定时器的原理是通过一个时钟源计数器来实现的,时钟源为系统时钟或者外部时钟源。计数器会递增并形成一个计数序列,当计数器达到预设的值时。会出现定时事件或者产生中断。定时器还可以通过输入捕获和输出比较等方式来实现更加精细的定时、计数和控制等任务。

定时器的分类

  1. 基本定时器:通常由一个简单的计数器和一个预分频器组成,用于产生延时、计数和计时等简单的定时应用。
  2. 通用定时器:通常包含多个计数器和预分频器,可用于产生多种不同精度和周期的PWM信号和中断。
  3. 高级定时器:通常包含多个计数器、预分频器和输入捕获/输出比较等功能模块,可用于更加复杂的计数、测量和控制任务。
  4. 看门狗定时器:用于监控系统运行状态并在系统崩溃时进行复位操作。
  5. RTC实时时钟:用于实现实时时间的计算和管理,通常具有更高的精度和更低的功耗。
  6. DMA定时器:用于定时触发DMA数据传输,提高数据传输的效率。

使用定时器方式控制LED

构建项目

1、创建项目并选择芯片
在这里插入图片描述
2、配置SYS
在这里插入图片描述
3、配置RCC
在这里插入图片描述
4、配置GPIO口(将PA5配置为GPIO_OutPut)
在这里插入图片描述
5、设置定时器TIME2
在这里插入图片描述
6、配置中断NVIC
在这里插入图片描述
7、生成Keil工程
在这里插入图片描述

添加中断函数

1、在main函数中添加配置定时器代码

HAL_TIM_Base_Start_IT(&htim2);	

2、设置中断函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
   
   static uint32_t time_cnt =0;
	 static uint32_t time_cnt1 =0;
   if(htim->Instance == TIM2)
   {
	   if(++time_cnt>=20)
	   {
		   time_cnt=0;
		   HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);
		     
	   }	
   }
}

效果展示

在这里插入图片描述

PWM波形

PWM原理

PWM 原理基于周期性的数字信号,通过控制信号高电平和低电平的持续时间比例来控制输出电压的大小。当占空比为50%时,高电平和低电平的持续时间相等,输出电压等于输入电压的一半。当占空比为100%时,输出电压等于输入电压;占空比为0%时,输出电压为0。通过改变占空比,可以实现对输出信号的改变,从而实现对电路的控制。

在具体实现中,PWM 常常使用定时器模块来产生一定频率的固定周期信号,同时通过输出比较模块或者自动重载模式等方式来控制占空比。在输出比较模式下,定时器计数值与比较寄存器值比较后产生电平翻转;在自动重载模式下,计数器每次计数到设定值后自动重载初始值,从而产生固定频率和占空比的 PWM 信号输出。

PWM控制优点

PWM的一个优点是从处理器到被控系统
信号都是数字形式的,再进行数模转换。可将噪声影响降到最低(可以跟电脑一样)。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。

对噪声抵抗能力的增强是PWM相对于模拟控制的另外一个优点,而且这也是在某些时候将PWM用于通信的主要原因。从模拟信号转向PWM可以极大地延长通信距离。在接收端,通过适当的RC或LC网络可以滤除调制高频方波并将信号还原为模拟形式.

PWM产生方法

1、软件产生 PWM:在处理器上通过软件编程实现 PWM。这种方法适用于资源有限的系统,但由于软件处理的延迟,频率和精度相对较低。

2、定时器产生 PWM:利用微控制器的定时器模块来产生 PWM 信号。通过配置定时器的计数周期和比较值,可以控制 PWM 的频率和占空比。这种方法具有较高的频率和精度,并且不受处理器负载的影响。

3、专用硬件产生 PWM:一些微控制器和专用 PWM 控制器集成了特殊的 PWM 模块,可以直接产生 PWM 信号。这种方法具有高频率、高精度和低延迟等优点。

4、FPGA 产生 PWM:在可编程逻辑器件(FPGA)中通过逻辑设计实现 PWM 信号的产生。FPGA 可以提供高度自定义的 PWM 产生方法,具有高灵活性和可扩展性。

采用PWM模式的LED呼吸灯

构建项目

1、新建项目和选择芯片(参照前文)
2、配置RCC
在这里插入图片描述
3、配置定时器TIM3、TIM4
在这里插入图片描述
在这里插入图片描述

4、配置LED引脚
在这里插入图片描述
5、生成keil工程

修改代码

在main函数中添加如下函数:

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);

修改while循环

while (1)
 {
 
     HAL_Delay(50);
     num=num+10;
     if(num>500)
		 {
   	   num=0;  
         }
       
     __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,num);
     __HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_2,num);
   /* USER CODE BEGIN 3 */
 }

6、设置相关参数
在这里插入图片描述

运行效果

在这里插入图片描述

波形

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值