Timer2兩個PWM實現互爲180度

/*********************************************
     標題:操作DMA的練習
     軟件平臺:MDK-ARM Standard Version4.23
     硬件平臺:stm32f4-discovery
     主頻:168M     
     描述:Timer2兩個PWM實現互爲180度
     author:大舟
     data:2012-09-13
 **********************************************/
/*-----------------------------------------------------
 分頻和週期計算公式:
 Prescaler = (TIMxCLK / TIMx counter clock) - 1;
 Period = (TIMx counter clock / TIM3 output clock) - 1 
 TIMx counter clock爲你所需要的TXM的定時器時鐘 
 
 在system_stm32f4xx.c中設置的APB1_Prescaler = 4 ,可知
 APB1時鐘爲168M/4*2=84M,因爲如果APB1分頻不爲1,則定時時鐘*2 
 APB2時鐘爲168M(Timer1/Timer8)
 ------------------------------------------------------*/	
void TIM2_PWM_PhaseShift_Init(void)
 {
 	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 	TIM_OCInitTypeDef TIM_OCInitStructure;
 	
 	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);		//開戶Timer2的時鐘
 	
 	TIM_DeInit(TIM2);							//重新將Timer設置爲缺省值
 	TIM_TimeBaseStructure.TIM_Period = 5000-1;				//10ms更新一次,即PWM輸出頻率爲100Hz
 	TIM_TimeBaseStructure.TIM_Prescaler = 84-1;				//84M/84=1M
 	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
 	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned3;	//向上向下計數,並且向上向下比較時,都會反轉
 	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
 	
 	/*配置輸出比較,產生佔空比爲20%的PWM方波*/
 	TIM_OCStructInit(&TIM_OCInitStructure);				//設置缺省值
 	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;		//PWM1爲正常佔空比模式,PWM2爲反極性模式	
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//使能輸出狀態
 	
 	//PWM1 Mode configuration: Channel1	
 	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;	//High爲佔空比高極性,此時佔空比爲20%;Low則爲反極性,佔空比爲80%
 	TIM_OCInitStructure.TIM_Pulse = 1000;				//輸入CCR(佔空比數值)1000/5000=20%
 	TIM_OC1Init(TIM2, &TIM_OCInitStructure);			//Timer2的CH2輸出
 	TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);		//CCR自動裝載默認也是打開的
 	
 	//PWM1 Mode configuration: Channel2	
 	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;	
 	TIM_OCInitStructure.TIM_Pulse = 4000;				//輸入CCR(佔空比數值)(5000-1000)/5000=20%
 	TIM_OC2Init(TIM2, &TIM_OCInitStructure);			//Timer2的CH2輸出
 	TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);		//CCR自動裝載默認也是打開的
 	
 	TIM_ARRPreloadConfig(TIM2, ENABLE);  				//ARR自動裝載默認是打開的,可以不設置
 	TIM_Cmd(TIM2, ENABLE); 						//使能TIM2定時器
 }
 
 void TIM2_PWM_PhaseShift_GPIO_Init(void)
 {
 	GPIO_InitTypeDef GPIO_InitStructure;
 	
 	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);		// 使能GPIOG時鐘
 	
 	GPIO_StructInit(&GPIO_InitStructure);//重新將GPIO設置爲缺省值	
 	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;			//模式必須爲複用!
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   		//頻率爲快速
 	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        		//上拉與否對PWM產生無影響
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
 	
 	/*配置PA0 PA1,作爲TIM2_Channel的PWM輸出*/
 	GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM2);	//複用PA0爲TIM2_CH1
 	GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2);	//複用PA1爲TIM2_CH2
 }

PWM的參數:週期10ms,頻率100Hz(注意!不是1M/5000=200Hz),至於爲什麼不是,查看上一篇博客。

以上程序是在上一篇博客所敘方法的基礎上編寫的,一個PWM模式1,一個PWM模式2。其實還是很簡單的。


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