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。其实还是很简单的。


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