使用TIM3定時輸出PWM控制LED燈實現呼吸燈

/*************************************
使用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的電平相反 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章