资讯详情

STM32高级定时器详解

目录标题

  • 一.基本定时器
    • 1.基本定时器简介
    • 2.时基单元
    • 3.基本定时器定时实验
  • 二.高级/通用定时器
    • 1.计数器模式
    • 2.时钟选择
    • 3.产生输出比较PWM波
    • 4.通用定时器PWM输出实验
    • 5.高级定时器死区时间的互补输出PWM实验
    • 6.高级定时器输入捕获-测量脉宽
    • 7.TIM—高级定时器-PWM输入捕获实验
  • 三.总结

一.基本定时器

1.基本定时器简介

数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC通过触发输出直接驱动DAC。这两个定时器是独立的,不共享任何资源

2.时基单元

在这里插入图片描述

**

计数模式 预加载自动重装载使能量位置(ARPE)

时钟源

计算定时时间 *定时器的定时时间等于计数器的中断周期乘以中断次数。计数器在 CK_CNT 在驱动下,计数的时间是 CK_CLK 倒数等于:1/(TIMxCLK/(PSC 1),中断时间等于:1/(CK_CLK * ARR)。如果在中断服务程序中设置 time,用来 记 录 中 断的 次 数,那 么 就 可 以计 算 出我们 需 要 的 定时 时 间等于 : 1/CK_CLK * (ARR 1)time。

定时器初始化结构的详细解释

滤波器分频比,基本定时器无此功能,无需设置。 (5) TIM_RepetitionCounter:属于高级控制寄存器专用寄存器位的重复计数器,它可以很容易地控制输出 PWM 的个数,以后会解释。

3.基本定时器定时实验

main.c

int main(void) { 
           //LED 端口初始化   LED_GPIO_Config();    ///基本定时器初始化    BASIC_TIM_Init();  while(1)
	{ 
        
		//500次更新中断(500ms),LED翻转一次
		if( g_time==500 )
		{ 
        
			LED1_TOGGLE
			g_time=0;
		}
	}
}

BasicTim.h

#ifndef __BASICTIM_H
#define __BASICTIM_H

#include "stm32f10x.h"

#define BASIC_TIM6

#ifdef BASIC_TIM6
#define BASIC_TIM TIM6
#define BASIC_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
#define BASIC_TIM_CLK RCC_APB1Periph_TIM6
#define BASIC_TIM_Prescaler (72-1)
#define BASIC_TIM_Period (1000-1)
#define BASIC_TIM_IRQn TIM6_IRQn
#define BASIC_TIM_IRQHandler TIM6_IRQHandler

#else

#define BASIC_TIM TIM6
#define BASIC_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
#define BASIC_TIM_CLK RCC_APB1Periph_TIM6
#define BASIC_TIM_Prescaler (72-1)
#define BASIC_TIM_Period (1000-1)
#define BASIC_TIM_IRQn TIM6_IRQn
#define BASIC_TIM_IRQHandler TIM6_IRQHandler

#endif /* BASIC_TIM6 */ 

void BASIC_TIM_Init(void);

#endif /*__BASICTIM_H*/

BasicTim.c

#include "BasicTim.h"

static void BASIC_TIM_NVIC_Config(void)
{ 
        	
	NVIC_InitTypeDef NVIC_InitStructrue;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitStructrue.NVIC_IRQChannel = BASIC_TIM_IRQn;
	NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority =1;
	NVIC_InitStructrue.NVIC_IRQChannelSubPriority =1;
	NVIC_InitStructrue.NVIC_IRQChannelCmd =ENABLE;
	NVIC_Init(&NVIC_InitStructrue);
}
	

static void BASIC_TIM_Config(void)
{ 
        
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructrue;
	
	//开启定时器时钟
	BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK,ENABLE);
	//时钟预分频
	TIM_TimeBaseInitStructrue.TIM_Prescaler =BASIC_TIM_Prescaler;
	//重装载寄存器
	TIM_TimeBaseInitStructrue.TIM_Period =BASIC_TIM_Period;
	TIM_TimeBaseInit(BASIC_TIM,&TIM_TimeBaseInitStructrue);

	TIM_ClearFlag(BASIC_TIM,TIM_FLAG_Update);
	TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);
	
	TIM_Cmd(BASIC_TIM, ENABLE);
}


void BASIC_TIM_Init(void)
{ 
        
	BASIC_TIM_NVIC_Config();
	BASIC_TIM_Config();
}


二.高级/通用定时器

高级定时器的功能: 编码器和霍尔传感器电路 ● 触发输入作为外部时钟或者按周期的电流管理

1.计数器模式

当更新事件由软件产生(通过设置TIMx_EGR 中的UG位)或者通过硬件的从模式控制器产生,则无论重复计数器的值是多少,立即发生更新事件,并且TIMx_RCR寄存器中的内容被重载入到重复计数器。

在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)−1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。

2.时钟选择

计数器在每2个ETR上升沿计数一次

  • 4.内部触发输入(ITRx)

3.输出比较产生PWM波

微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

。**

4.通用定时器PWM输出实验

main.c

#include "stm32f10x.h"
#include "bsp_led.h"
#include "GeneralTim.h"

#define SOFT_DELAY Delay(0x0FFF1);

void Delay(__IO u32 nCount); 


int main(void)
{ 
        	
	uint16_t led0pwmval=600;    
	uint8_t  dir=1;	 
	/* LED 端口初始化 */
	LED_GPIO_Config();	
  //通用定时器初始化 
  GENERAL_TIM_Init();

while(1)
{ 
         
		SOFT_DELAY
		if(dir==1)
		{ 
        
			led0pwmval--;
		}
		else 	
		{ 
        
			led0pwmval++;
		}			
		if(led0pwmval<300)
		{ 
        
			 dir=0;
		}
		if(led0pwmval==600)
		{ 
        
			 dir=1;
		}
		TIM_SetCompare3(GENERAL_TIM,led0pwmval);
	}
}


void Delay(__IO uint32_t nCount)	 //简单的延时函数
{ 
        
	for(; nCount != 0; nCount--);
}

GeneralTim.c

#include "GeneralTim.h"

static void GENERAL_TIM_GPIO_Config(void)
{ 
        
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(GENERAL_TIM_CH3_GPIO_CLK,ENABLE);
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin =GENERAL_TIM_CH3_PIN;
	GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
	GPIO_Init(GENERAL_TIM_CH3_PORT,&GPIO_InitStructure);
}
static void GENERAL_TIM_Mode_Config(void)
{ 
        
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructrue;
	TIM_OCInitTypeDef  TIM_OCInitStructrue;
	//开启定时器时钟
	GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);
	//时钟预分频
	TIM_TimeBaseInitStructrue.TIM_Prescaler =GENERAL_TIM_Prescaler;
	//重装载寄存器
	TIM_TimeBaseInitStructrue.TIM_Period =GENERAL_TIM_Period;
	//向上计数
	TIM_TimeBaseInitStructrue.TIM_CounterMode =TIM_CounterMode_Up;
	TIM_TimeBaseInitStructrue.TIM_ClockDivision =TIM_CKD_DIV1;
	TIM_TimeBaseInit(GENERAL_TIM,&TIM_TimeBaseInitStructrue);
	//选择PWM1模式 
	TIM_OCInitStructrue.TIM_OCMode =TIM_OCMode_PWM1;
	//使能输出通道
	TIM_OCInitStructrue.TIM_OutputState =TIM_OutputState_Enable;
	//高电平有效
	TIM_OCInitStructrue.TIM_OCPolarity =TIM_OCPolarity_High;
	TIM_OCInitStructrue.TIM_Pulse =600;
	TIM_OC3Init(GENERAL_TIM, &TIM_OCInitStructrue);
	//CRR3预装载使能
	TIM_OC3PreloadConfig(GENERAL_TIM,TIM_OCPreload_Enable);
	TIM_Cmd(GENERAL_TIM, ENABLE);
}


void GENERAL_TIM_Init(void)
{ 
        
  GENERAL_TIM_GPIO_Config();
	GENERAL_TIM_Mode_Config();
}

GeneralTim.h

#ifndef __GENERALTIM_H
#define __GENERALTIM_H

#include "stm32f10x.h"

// TIM3 输出比较通道
#define GENERAL_TIM_CH3_GPIO_CLK RCC_APB2Periph_GPIOB
#define GENERAL_TIM_CH3_PORT GPIOB
#define GENERAL_TIM_CH3_PIN GPIO_Pin_0

#define GENERAL_TIM TIM3
#define GENERAL_TIM_APBxClock_FUN RCC_APB1PeriphClockCmd
#define GENERAL_TIM_CLK RCC_APB1Periph_TIM3
#define GENERAL_TIM_Prescaler 0
#define GENERAL_TIM_Period (600-1)

void GENERAL_TIM_Init(void);

#endif /*__GENERALTIM_H */

5.高级定时器死区时间的互补输出PWM实验

为什么要有死区时间

如何配置死区时间 断路功能

断路和死区初始化结构体 定级别配置, BDTR 寄存器 LOCK[1:0]位的值。 (4) TIM_DeadTime:配置死区发生器,定义死区持续时间,可选设置范围为 0x0 至 0xFF。它设定 BDTR 寄存器 DTG[7:0]位的值。 (5) TIM_Break:断路输入功能选择,可选使能或禁止。它设定 BDTR 寄存器 BKE 位的值。 (6) TIM_BreakPolarity:断路输入通道 BRK 极性选择,可选高电平有效或低电平有效。它设定 BDTR 寄存器 BKP 位的值。 (7) TIM_AutomaticOutput:自动输出使能,可选使能或禁止,它设定 BDTR 寄存器 AOE位的值。

Advance_Tim.h

#ifndef __ADVANCETIM_H
#define __ADVANCETIM_H


#include "stm32f10x.h"

/************高级定时器TIM参数定义,只限TIM1和TIM8************/
// 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意
// 这里我们使用高级控制定时器TIM1

#define ADVANCE_TIM TIM1
#define ADVANCE_TIM_APBxClock_FUN RCC_APB2PeriphClockCmd
#define ADVANCE_TIM_CLK RCC_APB2Periph_TIM1
// PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}
#define ADVANCE_TIM_PERIOD (8-1)
#define ADVANCE_TIM_PSC (9-1)
#define ADVANCE_TIM_PULSE 4


// TIM1 输出比较通道
#define ADVANCE_TIM_CH1_GPIO_CLK RCC_APB2Periph_GPIOA
#define ADVANCE_TIM_CH1_PORT GPIOA
#define ADVANCE_TIM_CH1_PIN GPIO_Pin_8

// TIM1 输出比较通道的互补通道
#define ADVANCE_TIM_CH1N_GPIO_CLK RCC_APB2Periph_GPIOB
#define ADVANCE_TIM_CH1N_PORT GPIOB
#define ADVANCE_TIM_CH1N_PIN GPIO_Pin_13

// TI

标签: mos环振式数字加速度传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台