您的位置:首页 > 其它

使用TIM3定时输出PWM控制LED灯实现呼吸灯

2016-07-04 22:43 555 查看
/*************************************

使用TIM3定时输出PWM控制LED灯实现呼吸灯

**************************************/

void BreathLightInit()//LED初始化

{
GPIO_InitTypeDef GPIO_InitStructure;   //声明一个结构体变量,用来初始化GPIO

/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

    /*  配置GPIO的模式和IO口 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOC,&GPIO_InitStructure);

}

void PwmInit()//PWM初始化

{

   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器

   TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx

   //step1:开启时针

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启TIM3时钟

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启管脚复用时针

   //step2:初始化定时器TIM3

    TIM_TimeBaseInitStructure.TIM_Period = 900;
  //不分频,PWM 频率=72000/900=8Khz//设置自动重装载寄存器周期的值

    TIM_TimeBaseInitStructure.TIM_Prescaler = 0;//设置用来作为TIMx时钟频率预分频值

    TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim

    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式

    TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);

    TIM_Cmd(TIM3,ENABLE);//使能或者失能TIMx外设

   //step3:改变指定管脚的映射

    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //PC7

   //step4:初始化PWM

   //PWM初始化  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

   TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//输出比较模式

   TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能

   TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//输出极性

   TIM_OC2Init(TIM3,&TIM_OCInitStructure);

   //step5:使能TIMx在CCR2上的预装载寄存器

   TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
}

int main()

{

  u8 fx = 1;//方向

  u32 CCRx = 0;//CCRx值

  BreathLightInit();

  PwmInit();

  while(1)

  {

    DelayMs(10);

  if(1 == fx)
{
  CCRx++;
  if(300 == CCRx )
  {
    fx = 0;
  }
}
else
{
CCRx--;
  if( 0 == CCRx )
  {
    fx = 1;
  }
}
TIM_SetCompare2(TIM3, CCRx);//设置TIMx捕获比较2寄存器值

  }

}

 

补充说明:

如果是PWM1模式

 

如果设置TIM_OCPolarity_High     TIMx_CNT<TIMx_CCR输出为高电平   TIMx_CNT>TIMx_CCR输出为低电平

                                  

如果设置TIM_OCPolarity_Low      TIMx_CNT<TIMx_CCR输出就为低电平  TIMx_CNT><TIMx_CCR输出就为高电平

如果是PWM2模式

如果设置TIM_OCPolarity_High     TIMx_CNT<TIMx_CCR输出为低电平   TIMx_CNT>TIMx_CCR输出为高电平 

                                                              

 如果设置TIM_OCPolarity_Low      TIMx_CNT<TIMx_CCR输出就为高电平  TIMx_CNT>TIMx_CCR输出就为低电平

 

总结:设置TIM_OCPolarity_High,则输出电平与CCxREF的电平相同

            设置TIM_OCPolarity_Low,则输出电平与CCxREF的电平相反 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TIM PWM 呼吸灯