STM32 定时器浅谈_1

看了整整一周的定时器,整理一下一周来学习笔记.


定时器的组成包括四部分:时钟选择单元,时基单元 ,输入捕获 ,输出比较!


一,时钟选择单元:

       内部时钟(CK_INT)

  外部时钟模式1:外部引脚输入

  外部时钟模式2:外部触发输入ETR

 内部触发输入(ITRX):定时器级联

STM32 定时器浅谈_1_第1张图片


二,时基单元组成

CNT计数器 :向上、 向下、中央对齐 三种计数方

PSC预分频寄存器
ARR自动重装载寄存器


STM32 定时器浅谈_1_第2张图片


三,输入捕获单元

      此处应注意的是实际采样频率F = 1/2*Fdts {  香侬采样定理}

     并在滤波电路处进行高频滤波,即一些高频波在滤波电路被滤掉  


     STM32 定时器浅谈_1_第3张图片 

 捕获通道

STM32 定时器浅谈_1_第4张图片

这里实现了高频滤波,当系统的时钟为72MHZ时,假设选用TDTS=2*TINT

 则实际采样频率为F=1/2(1/2*72MHZ)=18MHZ

当N(采样次数)=4时,最大有效频率为18/4=4.25MHZ

即大于4.25MHZ的波被滤掉

注意:TI1F滤波后的有效波形有N个延时

四,输出比较单元

     此处应注意的是输出通道和输入通道是同一条,应进行设置!



   STM32 定时器浅谈_1_第5张图片



PWM 冲宽度调制)

  是用数字信号对模拟信号的一种表达,上下两个波形的面积相等,上图为模拟信号,下图是转换的PWM 波形~ b的高度相同,只需改变宽度就可表示上图分隔的面积~


  STM32 定时器浅谈_1_第6张图片

     PWM共有两种模式:PWM模式1和PWM模式2 两种模式计数方式相反 

   重点在占空比:

   占空比:在一串理想的脉冲周期序列中(如方波),正脉冲的持续时间与脉冲总周期的比值。(百度)简单来说就是高电平在整个时钟周期所占的比值

  影响占空比的两个因素: 1,PWM周期   2 ,CCR寄存器里的预先放入的比较数 (可以看做高电平)

  影响PWM 周期两个因素:1 ,ARR寄存器里重装载数值(可以看做时钟的周期) 2 ,计数模式

  所以占空比=(TIMx_CRR/TIMx_ARR)%100%;

 定时器编程步骤:

1. 配置优先级;  2. 使能时钟  3. 配置GPIO; 4. 配置TIME; 5.使能计数器; 6.开中断; 7.清除标志位; 
具体配置如下: 
(1) NVIC_Configuration(void);配置优先级 
(2) void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)使能时钟 
(3) void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);配置GPIO  
(4) TIM_Configuration (void); 
(5) TIM_Cmd(TIM7, ENABLE);使能定时器 
(6) TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);使能中断 
(7) TIM_ClearFlag(TIM7, TIM_FLAG_Update);清除标志位

 奋斗板例程:

main.c

#include  "stm32f10x.h"
#include  "stm32f10x_tim.h"
#include  "misc.h"

unsigned int CCR2_Val=13100; 
extern void time_ini(void);

/****************************************************************************
* 名    称:void RCC_Configuration(void)
* 功    能:系统时钟配置为72MHZ, 外设时钟配置
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无 
****************************************************************************/ 
void RCC_Configuration(void){

  SystemInit(); 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC 
  						| RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE , ENABLE);
}



/****************************************************************************
* 名    称:void NVIC_Configuration(void)
* 功    能:中断源配置
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无 
****************************************************************************/ 
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  NVIC_InitStructure.NVIC_IRQChannel =TIM3_IRQn ;			   //配置定时器中断 
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);  	
}


/****************************************************************************
* 名    称:int main(void)
* 功    能:主函数
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无 
****************************************************************************/ 
int main(void)
{    
  RCC_Configuration();   	                 //系统时钟设置及外设时钟使能					     
  NVIC_Configuration();						 //中断源配置
  time_ini();								 //定时器3的初始化
  while(1);
}

tim.c

#include "stm32f10x_tim.h"
#include "stm32f10x_gpio.h"
#include  <stm32f10x.h>	
void time_ini(void);
extern unsigned int CCR2_Val;
TIM_TimeBaseInitTypeDef  TIM3_TimeBaseStructure;
TIM_OCInitTypeDef  TIM3_OCInitStructure;
TIM_BDTRInitTypeDef TIM3_BDTRInitStructure;

/****************************************************************************
* 名    称:void time_ini(void)
* 功    能:TIM3初始化
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:无 
****************************************************************************/ 
void time_ini(void){
									  
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);		    //定时器3 时钟使能
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;						//PB5复用为TIM3的通道2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* TIM3局部复用功能开启	 在TIM3的局部复用开启时,PB5会被复用为TIM3_CH2*/
  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE);	

  /* Time Base configuration */
  /*-------------------------------------------------------------------
  TIM3CLK=72MHz  预分频系数Prescaler=63 经过分频 定时器时钟为1.125MHz
  捕获/比较寄存器2 TIM3_CCR2= CCR2_Val 
  2通道产生的更新频率是=1.125MHz/CCR2_Val=25Hz
   
  -------------------------------------------------------------------*/
  TIM3_TimeBaseStructure.TIM_Prescaler = 63;						//预分频器TIM3_PSC=63	 
  TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;		//计数器向上计数模式 TIM3_CR1[4]=0
  TIM3_TimeBaseStructure.TIM_Period =0xffff;				        //自动重装载寄存器TIM3_APR      		     
  TIM3_TimeBaseStructure.TIM_ClockDivision = 0x0;					//时钟分频因子 TIM3_CR1[9:8]=00

  TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseStructure);					//写TIM3各寄存器参数
  
  TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle ;				//TIM3_CCMR1[14:12]=011  翻转 当TIM3_CCR2=TIM3_CNT时,翻转OC2REF的电平 
 // TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2 ;
  TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//输入/捕获2输出允许  OC2信号输出到对应的输出引脚PB5
  TIM3_OCInitStructure.TIM_Pulse =CCR2_Val;						    //若CC1通道配置为输出:CCR2是装入当前捕获/比较2 TIM3_CCR2寄存器的值(预装载值)。
  																	//当前捕获/比较寄存器包含了与计数器TIM3_CNT比较的值,并且在OC端口上输出信号
  TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;			//输出极性  低电平有效 TIM3_CCER[5]=1;

  TIM_OC2Init(TIM3, &TIM3_OCInitStructure);


  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable);			    //TIM3_CCMR1[1]=0  禁止TIM3_CCR2寄存器的预装载功能,可随时写入TIM3_CCR2
                                                                    //且新值马上起作用	  
   TIM_Cmd(TIM3,ENABLE);											//启动定时器3 TIM3_CR1[0]=1;  
   TIM_ITConfig(TIM3,TIM_IT_CC2,ENABLE); 							//TIM3_DIER[2]=1  允许捕获/比较2中断
}

it.c

void TIM3_IRQHandler(void)
{
 	if(TIM_GetITStatus(TIM3,TIM_IT_CC2)!=RESET)
	{
		TIM_ClearITPendingBit (TIM3,TIM_IT_CC2);
		capture1=TIM_GetCapture2(TIM3);
		TIM_SetCompare2(TIM3,capture1+CCR2_Val);  	
	}
}

当我们把tim.c中的TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle ;

                    换成:TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2 ;时可以看到占空一个近似于1:2的占空比波形图

STM32 定时器浅谈_1_第7张图片



                                    

  





  

你可能感兴趣的:(it,stm32,嵌入式系统,Tim)