STM32学习问题记录(10) - 定时器(PWM)

今天看来定时器这一部分,现在做一下总结,STM32总共分有8个定时器,包括基本定时器,通用定时器和高级定时器,其中基本定时器为TIM6,TIM7;通用定时器为TIM2,TIM3,TIM4,TIM5;高级定时器包括TIM1和TIM8。

下面总结三种定时功能:

基本定时器:只能定时,只能上升计时,可产生中断,DMA请求和触发内部DAC。

通用定时器:可定时,输入捕捉,输出比较,编码器接口,可上下计数,同样可产生中断,DMA请求和触发内部DAC。

高级定时器:具有以上两者所有功能,有三相六步电机接口,刹车功能及用于PWM驱动的死区时间控制等。

定时器的时钟来源


下面来看一下TIM2的实例代码,产生一个时间基准

TIM2_Configuration();
void TIM2_Configuration(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
    //TIM_DeInit(TIM2);
 
    TIM_TimeBaseStructure.TIM_Period=1000;
 
    TIM_TimeBaseStructure.TIM_Prescaler= 71;
 
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
 
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
   
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
 
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
 
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
  
    TIM_Cmd(TIM2, ENABLE);                  
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE);   
}

接下来是TIM2产生PWM势力代码:(代码为4个IO产生占空比不同的方波)

static void TIM3_GPIO_Config(void) 
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); 

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /*GPIOB Configuration: TIM3 channel 3 and 4 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}
static void TIM3_Mode_Config(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	/* PWMÐźŵçƽÌø±äÖµ */
 	u16 CCR1_Val = 500;        
 	u16 CCR2_Val = 375;
 	u16 CCR3_Val = 250;
 	u16 CCR4_Val = 125;

/* ----------------------------------------------------------------------- 
    TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR+1)* 100% = 50%
    TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR+1)* 100% = 37.5%
    TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR+1)* 100% = 25%
    TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR+1)* 100% = 12.5%
  ----------------------------------------------------------------------- */

  /* Time base configuration */		 
  TIM_TimeBaseStructure.TIM_Period = 999;      
  TIM_TimeBaseStructure.TIM_Prescaler = 0;	   
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;	
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	   
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;	  
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);	 
  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;	  
  TIM_OC2Init(TIM3, &TIM_OCInitStructure);	 
  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel3 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;	
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);	 
  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

  /* PWM1 Mode configuration: Channel4 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;	
  TIM_OC4Init(TIM3, &TIM_OCInitStructure);	
  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM3, ENABLE);			
  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);                  
}


void TIM3_PWM_Init(void){ TIM3_GPIO_Config(); TIM3_Mode_Config(); }简而言之,定时器就是一个计数器,当计数到某一可设定值时就会产生中断,计数器的时钟频率也有分频器控制,因此可以精确的产生定时和精准的中断,PWM则是多了一位反转寄存器,有两种模式PWM1和PWM2,详细不再赘述,使用起来也比较方便,PWM在驱动中使用比较多,是一个十分重要的信号种类,下次使用时希望可以更加深入了解。


猜你喜欢

转载自blog.csdn.net/vca821/article/details/80682330