/*********************************************
標題:操作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。其實還是很簡單的。