定時器的使用注意事項

當使用定時器1輸出pwm功能時,定時器的配置過程:

1>在自動重裝載寄存器TIM1_ARR寄存器中寫入重裝載值(0x0000~0xffff)。

2>在預分頻寄存器TIM1_PSC寄存器中寫入分頻值,計數器的時鐘頻率 = fCK_PSC/( PSC[15:0]+1),當不分頻時,定時器頻率等於系統APB1時鐘頻率。

3>時鐘分割,一般都是設置成0;

4>計數模式,設置TIM1_CR1寄存器的DIR位,0:向上計數,1:向下計數。

5>通過設置捕獲/比較模式寄存器選PWM的模式1,還是模式2。

6>寫TIM1_CCER寄存器的CC1P位設置輸出的極性,0:高電平有效,捕獲後變爲高電平,1:低電平有效。

7>寫TIM1_CCER寄存器的CC1E位設置,寫1,開啓- OC1信號輸出到對應的輸出引腳。

8>預裝載使能TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //在CCMR1寄存器中使能,注意這裏的TIM_OCPreload_Enable=0x0008,對應的就是輸出比較通道1,當使用第二通道時就是調用:TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable)函數,在這個函數裏面有對0x0008左移8位,正好對應OC2通道的預裝載使能,位說明如下:

OC1PE: 輸出比較1預裝載使能 (Output compare 1 preload enable)
0:禁止TIMx_CCR1寄存器的預裝載功能,可隨時寫入TIMx_CCR1寄存器,並且新寫入的數
值立即起作用。
1:開啓TIMx_CCR1寄存器的預裝載功能,讀寫操作僅對預裝載寄存器操作, TIMx_CCR1的
預裝載值在更新事件到來時被傳送至當前寄存器中。

9>TIMx->CR1 |= TIM_CR1_CEN;使能計數器

CEN:使能計數器
0:禁止計數器;
1:使能計數器。
注:在軟件設置了CEN位後,外部時鐘、門控模式和編碼器模式才能工作。觸發模式可以自動
地通過硬件設置CEN位。
在單脈衝模式下,當發生更新事件時, CEN被自動清除。

代碼如下,輸出引腳的是定時器1的第一通道:

void TIM1_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	

	RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);	//使能定時器3時鐘
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA   | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外設和AFIO複用功能模塊時鐘
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //Timer1部分重映射  TIM1_CH1->PA8   
 
   //設置該引腳爲複用輸出功能,輸出TIM1 CH1的PWM脈衝波形	GPIOA.8
	GPIO_InitStructure.GPIO_Pin = LD_DRIVER_PIN; //TIM1_CH1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //複用推輓輸出,不用選第幾個複用功能,區分m0
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
 
     //初始化TIM1
	TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器週期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作爲TIMx時鐘頻率除數的預分頻值 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
	
	//初始化TIM1 Channel1 PWM模式	 
	//首先是向上計數模式,選擇PWM2模式,當TIM_CNT < TIM_CCR1時是無效電平,相反是有效電平。
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈衝寬度調製模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高 到比較值的時候變爲高電平

    TIM_OCInitStructure.TIM_OutputNState =TIM_OutputNState_Disable;  //互補輸出
    TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;         //空閒狀態
    TIM_OCInitStructure.TIM_Pulse = arr>>1;                                    //
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根據T指定的參數初始化外設TIM1 OC1

       //當使用定時器1的時候,這條一定要加上,
       //ENABLE:如果設置了相應的使能位(TIMx_CCER寄存器的CCxE、 CCxNE位),則開啓OC和OCN輸出。
       TIM_CtrlPWMOutputs(TIM1,ENABLE); 

	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //在CCMR1寄存器中使能
 
	TIM_Cmd(TIM1, ENABLE);  //使能TIM1	
}

初始化完成後,記得設置TIM1_CCR1寄存器的值

只有當更新事件發生時,此預裝載值才傳輸至當前捕獲/比較1寄存器中。
當前捕獲/比較寄存器參與同計數器TIMx_CNT的比較,並在OC1端口上產生輸出信號
 	TIM1_PWM_Init(2399,0);	     //不分頻。PWM頻率=72000000/2400=30Khz
	TIM1->CCR1 = 1200;           //30k,50% 佔空比

 

實際調試定時器1過程遇到的問題:

1、當使用定時器1的時候,下面兩個必須要加上,不加就沒有pwm輸出!!!!!!

      TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;         //空閒狀態設置,必須在初始化的時候加上!!!

     TIM_CtrlPWMOutputs(TIM1,ENABLE);      //這個一定要加上啊,是使能定時器1的OC輸出的啊!!!(BDTR寄存器)

這兩個地方就是定時器1輸出pwm與其他普通定時器輸出pwm不一樣的地方,一定要注意這裏啊!!!!!!                              

 

2、下面這個函數千萬不要亂加。

 TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Single);/******* 單脈衝模式 **********/

 

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