初级会员

- 积分
- 106
- 金钱
- 106
- 注册时间
- 2021-3-14
- 在线时间
- 20 小时
|
1金钱
我程序要在TIM1CH3、TIM1CH4进行输出比较中断 ch1、ch2这两句输出互补波 在网上参考了几个输出比较定时器初始化配置的代码,本人用的是定时器1高级定时器 因为要用到死区互补输出,而网上一般用的是tim3、tim2,遇到的问题是一直无法进入中断 我的定时器的中断初始化用的这句 NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM1的输出比较/输入捕获中断 而网上如果是tim2 用的是 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
程序如下
void ConfigTimer( void )
{
GPIO_InitTypeDef GPIO_InitSturcture;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );
//TIM1 ??PWM CH1->PA8 CH2->PA9 CH1N->PB13 CH2N->PB14
GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11;
GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitSturcture );
GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOB, &GPIO_InitSturcture );
//?????
TIM_TimeBaseInitStructure.TIM_Period = (Fsys/2) / Fpwm;;
TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x00;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;
TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure );
//CH1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_Pulse = ccr1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OC1Init( TIM1, &TIM_OCInitStructure );
//CH2
TIM_OCInitStructure.TIM_Pulse = ccr2;
TIM_OC2Init( TIM1, &TIM_OCInitStructure );
//
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM_BDTRInitStructure.TIM_DeadTime = deadtime;
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig( TIM1, &TIM_BDTRInitStructure );
/* CH3 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC3Init(TIM1,&TIM_OCInitStructure);
/* CH4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_Pulse =((Fsys/2) / Fpwm) ;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC4Init(TIM1,&TIM_OCInitStructure);
TIM_CtrlPWMOutputs( TIM1, ENABLE );
TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Enable );
TIM_OC2PreloadConfig( TIM1, TIM_OCPreload_Enable );
TIM_OC3PreloadConfig( TIM1, TIM_OCPreload_Disable );
TIM_OC4PreloadConfig( TIM1, TIM_OCPreload_Disable );
TIM_ARRPreloadConfig( TIM1, ENABLE );
TIM_ClearFlag(TIM1, TIM_FLAG_CC3) ;
TIM_ClearFlag(TIM1, TIM_FLAG_CC4) ;
TIM_ITConfig( TIM1,TIM_IT_CC3 |TIM_IT_CC4,ENABLE);
TIM_Cmd( TIM1, ENABLE );
/* Configure one bit for preemption priority */
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM1的输出比较/输入捕获中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM1_IRQHandler(void)
{
if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET) // CH3′¥·¢êä3ö±è½ÏÖD¶Ï
{
LED0=0;
if(flag_ch3==0)
{
// capture= TIM_GetCapture3(TIM1);
// TIM_SetCompare3(TIM1, capture +(((Fsys/2) / Fpwm) * PWM_DUTY) / 100);
TIM_SetCompare3(TIM1, (((Fsys/2) / Fpwm) * PWM_DUTY) / 100 );
flag_ch3=1;
}
else
{
TIM_SetCompare3(TIM1, 0);
flag_ch3=0;
}
}
if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET) // CH4′¥·¢êä3ö±è½ÏÖD¶Ï
{
LED0=0;
if(flag_ch4==0)
{
// capture= TIM_GetCapture4(TIM1);
// TIM_SetCompare4(TIM1, capture -(((Fsys/2) / Fpwm) * PWM_DUTY) / 100);
TIM_SetCompare4(TIM1, (((Fsys/2) / Fpwm) * (100-PWM_DUTY)) / 100 );
flag_ch4=1;
}
else
{
TIM_SetCompare4(TIM1, ((Fsys/2) / Fpwm));
flag_ch4=0;
}
}
TIM_ClearITPendingBit(TIM1, TIM_IT_CC3|TIM_IT_CC4); //Çå3yCH3¡¢CH4μÄêä3ö±è½ÏÖD¶Ï±ê־λ
}
|
|