初级会员

- 积分
- 78
- 金钱
- 78
- 注册时间
- 2016-3-14
- 在线时间
- 12 小时
|
void timer_initPWM(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseStructure;
TIM_OCInitTypeDef TIM_OcStructure;
TIM_BDTRInitTypeDef TIM_BdtrStructure;
NVIC_InitTypeDef NVICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);//PC6/PC7/PC8 = High Side, PA7/PB0/PB1 = Low Side端口复用
// PC6/PC7/PC8 = High Side, PA7/PB0/PB1 = Low Side)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Kommutierungsinterrupt im NVIC eintragen
NVICInitStructure.NVIC_IRQChannel = TIM8_TRG_COM_IRQn;
NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVICInitStructure.NVIC_IRQChannelSubPriority = 1;
NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVICInitStructure);
//TMR1 刷新中断
NVICInitStructure.NVIC_IRQChannel = TIM8_UP_IRQn;
NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVICInitStructure.NVIC_IRQChannelSubPriority = 1;
NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVICInitStructure);
//Deinitializes the TIM1 peripheral registers to their default reset values
TIM_DeInit(TIM8);
//(TIM1CLK = SYSCLK = 72MHz) => MAX_PWM_VALUE=3600 => f_PWM=20kHz (unsymmetrische PWM)(50us)
//TIM_BaseStructure.TIM_Period = MAX_PWM_VALUE; //自动装载值,累计次数
TIM_BaseStructure.TIM_Period = 3600; //自动装载值,累计次数
TIM_BaseStructure.TIM_Prescaler = 0;
TIM_BaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_BaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned2; //TIM8中央对齐模式2
TIM_BaseStructure.TIM_RepetitionCounter = 1;
TIM_TimeBaseInit(TIM8, &TIM_BaseStructure);
//Einstellungen f黵 Kanal 1, 2 und 3 (alle gleich)
TIM_OcStructure.TIM_OCMode = TIM_OCMode_Timing; //TMR8输出比较时间模式,初始化的时候不需要输出
TIM_OcStructure.TIM_OutputState = TIM_OutputState_Disable; //使能输出比较状态
TIM_OcStructure.TIM_OutputNState = TIM_OutputNState_Disable;//使能输出比较N状态
TIM_OcStructure.TIM_Pulse = 0; //待装入捕获比较寄存器的脉冲值
TIM_OcStructure.TIM_OCPolarity = TIM_OCPolarity_High; //TMR1输出比较极性高
TIM_OcStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //TMR1输出比较N极性高
TIM_OcStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //当MOE=0设置TIM8输出比较空闲状态
TIM_OcStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set; //当MOE=0设置TIM8输出比较N空闲状态
TIM_OC1Init(TIM8, &TIM_OcStructure);
TIM_OC2Init(TIM8, &TIM_OcStructure);
TIM_OC3Init(TIM8, &TIM_OcStructure);
//Einstellungen f黵 Totzeit und automatische Ausgabe der PWMs
TIM_BdtrStructure.TIM_OSSRState = TIM_OSSRState_Enable; //使能TIM8 OSSR状态
TIM_BdtrStructure.TIM_OSSIState = TIM_OSSIState_Enable; //使能TIM8 OSSI状态
TIM_BdtrStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //不锁任何位
TIM_BdtrStructure.TIM_DeadTime = 2; //输出打开和关闭状态之间的延时,死区时间
TIM_BdtrStructure.TIM_Break = TIM_Break_Disable; //失能TIM8刹车输入
TIM_BdtrStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; //TIM8刹车输入管脚极性高
TIM_BdtrStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; //自动输出功能使能
TIM_BDTRConfig(TIM8, &TIM_BdtrStructure);
TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE); //使能刷新中断
TIM_ITConfig(TIM8, TIM_IT_COM, ENABLE); //使能比较
// TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能捕获比较寄存器预装载(通道1)
// TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能捕获比较寄存器预装载(通道2)
// TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能捕获比较寄存器预装载(通道3)
// TIM_CCPreloadControl(TIM1, ENABLE); //使能TMR8捕获比较控制位
TIM_Cmd(TIM8, ENABLE); //使能TMR8
TIM_CtrlPWMOutputs(TIM8, ENABLE); //使能TIM8的主输出
}
void TIM8_UP_IRQHandler()
{
TIM_ClearITPendingBit(TIM8, TIM_IT_Update);
}
|
|