/*********************************************
标题:操作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。其实还是很简单的。