PWM輸出 STM32呼吸燈

脈衝寬度調製模式可以產生一個由TIMx_ARR(自動裝載寄存器)寄存器確定頻率、由TIMx_CCRx(捕獲/比較寄存器)寄存器確定佔空比的信號。
在這裏插入圖片描述
在TIMx_CCMRx(捕獲/比較模式寄存器)寄存器中的OCxM位寫入’110’(PWM模式1)或’111’(PWM模式2),能夠獨立地設置每個OCx輸出通道產生一路PWM。
在這裏插入圖片描述
必須設置TIMx_CCMRx寄存器OCxPE位以使能相應的預裝載寄存器.
在這裏插入圖片描述
最後還要設置TIMx_CR1(控制寄存器)寄存器的ARPE位,(在向上計數或中心對稱模式中)使能自動重裝載的預裝載寄存器。
在這裏插入圖片描述
OCx的極性可以通過軟件在TIMx_CCER(捕獲比較使能寄存器)寄存器中的CCxP位設置,它可以設置爲高電平有效或低電平有效。TIMx_CCER寄存器中的CCxE位控制OCx輸出使能。詳見TIMx_CCERx寄存器的描述。
在這裏插入圖片描述
在這裏插入圖片描述
在PWM模式(模式1或模式2)下,TIMx_CNT和TIMx_CCRx始終在進行比較,(依據計數器的計數方向)以確定是否符合TIMx_CCRx≤TIMx_CNT或者TIMx_CNT≤TIMx_CCRx。

PWM的工作過程
在這裏插入圖片描述
PWM輸出配置步驟

 1.使能定時器3和相關IO口時鐘。
    	使能定時器3時鐘:RCC_APB1PeriphClockCmd();
        使能GPIOB時鐘:RCC_APB2PeriphClockCmd();
2.初始化IO口爲複用功能輸出。函數:GPIO_Init();
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      
這裏我們是要把PB5用作定時器的PWM輸出引腳,所以要重映射配置,
       所以需要開啓AFIO時鐘。同時設置重映射。
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); 
3.初始化定時器:ARR,PSC等:TIM_TimeBaseInit();
4.初始化輸出比較參數:TIM_OC2Init();
4.使能預裝載寄存器: TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); 
5.使能定時器。TIM_Cmd();
6.不斷改變比較值CCRx,達到不同的佔空比效果:TIM_SetCompare2();

呼吸燈

//TIM3 PWM部分初始化 
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預分頻數
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//使能定時器3時鐘
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外設和AFIO複用功能模塊時鐘
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    
 
   //設置該引腳爲複用輸出功能,輸出TIM3 CH2的PWM脈衝波形	GPIOB.5
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //複用推輓輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
 
   //初始化TIM3
	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(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
	//初始化TIM3 Channel2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈衝寬度調製模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根據T指定的參數初始化外設TIM3 OC2
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的預裝載寄存器
	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章