STM32F4系列单片机的定时器讲解和计数器,PWM信号输出,PWM信号捕获的实现对电机进行控制和监测功能

本文详细介绍了STM32F4的定时器功能,包括高级定时器TIM1/TIM8的精密计时、通用定时器TIM2/TIM5/TIM3/TIM4的使用,以及基本定时器TIM6/TIM7的简单计时和输入捕获功能。同时展示了TIM3输出4路PWM波和TIM5输入捕获的配置实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定时器功能介绍:

在控制领域里面,我们可以用信号输出定时器,进行PWM的控制,从而达到控制电机的目的,通过输入捕获功能可以用来接收外部的数字信号,用于测量脉冲宽度、频率或周期等。在这里给大家介绍下,具体用定时器做计数,输出和捕获的功能实现。

STM32F4一共有三种14个定时器。(12个16位的,2个32位的),STM32F1系列只有8个16位的。

高级定时器:TIM1、TIM8。通常用于特定领域和专业需求用户使用的精密计时工具,通常适用于需要精度更高的领域。通常可以精确到毫秒或更小的时间单位,并具有更复杂的逻辑和算法。

通用定时器:TIM2、TIM5、TIM3、TIM4,TIM9~TIM14。 

基本定时器:TIM6、TIM7,没有捕获等通道,用作简单定时。

STM32通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。

2.计数定时器配置

在STM32F429上实现TIM6的计时,可以通过以下步骤进行:

  1. 使能TIM6时钟。

  2. 初始化TIM6时基单元,设置时钟分频系数和计数周期。

  3. 使能更新中断(如果需要)。

  4. 使能TIM6。

  5. 等待中断处理(如果使能了中断)。

以下是一个简单的示例代码,展示如何使用HAL库函数来配置TIM6作为一个简单的计时器:

/* 注意:1. 中断相关名称。注意基本定时器TIM6 的中断名为 TIM6_DAC_IRQn,< TIM6 global and DAC1&2 underrun error  interrupts>,其他一些定时器为 TIMx_IRQn(x=2,3,4,7 etc)	*/
/* 中断函数名为 TIM6_DAC_IRQHandler(),而不是 TIM6_IRQHandler()		*/
/* 3. 基本定时器(TIM6, TIM7),通用定时器,高级定时器(TIM1, TIM8),功能越来越多,此处只做个简单计时,基本定时器足够了	*/

#include "timer.h"

uint32_t tim = 0;						// 全局变量,每0.1ms加1
TIM_HandleTypeDef TIM6_Handler;      	//定时器句柄 

/* 基本定时器6初始化						*/
/* 实现 0.1ms 计时中断					*/
/* 90M/90=1M,1M/100 = 10kHz = 0.1ms	*/
void TIM6_Init(void)
{  

    TIM_MasterConfigTypeDef sMasterConfig = {0};
    TIM6_Handler.Instance			= TIM6;                  		// 基本定时器
    TIM6_Handler.Init.Prescaler		= 180-1;                 		// 分频系数 180MHz,得到 180M/180=1M 时钟
    TIM6_Handler.Init.CounterMode	= TIM_COUNTERMODE_UP;    		// 向上计数器
    TIM6_Handler.Init.Period		= 100-1;                  		// 自动装载值 100,每 100/1M = 100us=0.1ms中断一次
    htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
    HAL_TIM_Base_Init(&TIM6_Handler);
	
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
    HAL_TIM_Base_Start_IT(&TIM6_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE   
}
/* 定时器底册驱动,开启时钟,设置中断优先级	*/
/* 此函数会被HAL_TIM_Base_Init()函数调用		*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim-&g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驽马匠人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值