/**
*****************************************************************************
*文件: pwm.c
*作者: binfran
*时间: 2015.05.10
*描述: 产生200KHZ的PWM和按键音
*版本: V1.0
*其他:
*****************************************************************************
*/
#include "pwm.h"
void Pwm200KHGpioConfig(void) //产生200KH的引脚配置 PA4 TIM14 CH1
{
GPIO_InitTypeDef io;
RCC_AHBPeriphClockCmd(Pwm200KHz_RCC_AHB, ENABLE);
io.GPIO_Mode=GPIO_Mode_AF;
io.GPIO_Speed=GPIO_Speed_50MHz;
io.GPIO_OType=GPIO_OType_PP;
io.GPIO_PuPd=GPIO_PuPd_UP;
io.GPIO_Pin=Pwm200KHz_GPIO_PIN;
GPIO_Init(Pwm200KHz_GPIO, &io);
GPIO_PinAFConfig(Pwm200KHz_GPIO,Pwm200KHz_GPIO_PinSource,Pwm200KHz_GPIO_AF);
}
//void Pwm200KHModeConfig(void) //产生200KH的定时器配置 PA4 TIM14 CH1
//入口参数,主晶振分频(需大于0),要产生的HZ频率
void Pwm200KHModeConfig(UINT16 prescaler, UINT32 HZ) //产生200KH的定时器配置 PA4 TIM14 CH1
{
/* -----------------------------------------------------------------------
TIM14 Configuration: generate 4 PWM signals with 4 different duty cycles:
TIM14CLK = 48 MHz, Prescaler = 0x0, TIM14 counter clock = 48 MHz
TIM14 ARR Register = 239 => TIM14 Frequency = TIM14 counter clock/(ARR + 1)
TIM14 Frequency = 200 KHz.
TIM14 Channel1 duty cycle = (TIM14_CCR1/ TIM14_ARR)* 100 = 50%
TIM14 Channel2 duty cycle = (TIM14_CCR2/ TIM14_ARR)* 100 = 37.5%
TIM14 Channel3 duty cycle = (TIM14_CCR3/ TIM14_ARR)* 100 = 25%
TIM14 Channel4 duty cycle = (TIM14_CCR4/ TIM14_ARR)* 100 = 12.5%
----------------------------------------------------------------------- */
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
UINT16 timerPeriod=0;
UINT32 timerPulse=0;
timerPeriod=((SystemCoreClock/prescaler)/HZ);
/*PWM信号电平跳变值*/
timerPulse = timerPeriod/2; //一半的占空比
/* PWM信号电平跳变值 */
// UINT16 CCR1_Val = 120; //一半的占空比
//UINT16 CCR2_Val = 45; //37.5%
//UINT16 CCR3_Val = 30; //25%
//UINT16 CCR4_Val = 15; //12.5%
RCC_APB1PeriphClockCmd(Pwm200kHZ_RCC_APB, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = timerPeriod-1; //当定时器从0计数到239,即为240次,为一个定时周期
TIM_TimeBaseStructure.TIM_Prescaler = prescaler-1; //
// TIM_TimeBaseStructure.TIM_Period = 239; //当定时器从0计数到239,即为240次,为一个定时周期
// TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置预分频:不预分频,即为48MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = timerPulse; //
// TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平
TIM_OC1Init(Pwm200KHz_TIM, &TIM_OCInitStructure); //使能通道1
TIM_OC1PreloadConfig(Pwm200KHz_TIM, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(Pwm200KHz_TIM, ENABLE); // 使能TIM14重载寄存器ARR
/* TIM14 enable counter */
//TIM_Cmd(TIM14, ENABLE); //使能定时器14
}
void Pwm200KHZ_init(void)
{
Pwm200KHGpioConfig();
// Pwm200KHModeConfig();
Pwm200KHModeConfig(PWM_CAMERA_PRESCALER,PWM_CAMERA_FREQUENCY);
}
void KeyToneGpioConfig(void) //产生按键音PWM引脚配置,PA8 TIM1 CH1
{
GPIO_InitTypeDef io;
RCC_AHBPeriphClockCmd(keyPwmTone_RCC_AHB, ENABLE);
io.GPIO_Mode=GPIO_Mode_AF;
io.GPIO_Speed=GPIO_Speed_50MHz;
io.GPIO_OType=GPIO_OType_PP;
io.GPIO_PuPd=GPIO_PuPd_UP;
io.GPIO_Pin=keyPwmTone_GPIO_PIN;
GPIO_Init(keyPwmTone_GPIO, &io);
GPIO_PinAFConfig(keyPwmTone_GPIO,keyPwmTone_GPIO_PinSource,keyPwmTone_GPIO_AF);
}
//入口参数,主晶振分频(需大于0),要产生的HZ频率
void KeyTonePwmModeConfig(UINT16 prescaler, UINT16 HZ) //产生按键音PWM引脚配置,PA8 TIM1 CH1
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
UINT16 timerPeriod=0;
UINT32 timerPulse=0;
timerPeriod=((SystemCoreClock/prescaler)/HZ);
/*PWM信号电平跳变值*/
timerPulse = timerPeriod/2; //一半的占空比
RCC_APB2PeriphClockCmd(keyPwmTone_RCC_APB, ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = timerPeriod-1; //当定时器从0计数到239,即为240次,为一个定时周期
TIM_TimeBaseStructure.TIM_Prescaler = prescaler-1; //
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_Pulse = timerPulse; //
TIM_OC1Init(keyPwmTone_TIM, &TIM_OCInitStructure); //
TIM_CtrlPWMOutputs(keyPwmTone_TIM,ENABLE);
}
void KeyTonePwmInit(void)
{
KeyToneGpioConfig();
KeyTonePwmModeConfig(2,600);
}