STM32定时器TIM1输出互补脉冲加死区

下面是代码和个人愚见,还没完全搞透,但基本发现以下规律。
调试的过程中出现一个问题,就是没有波形输出。
原因是刹车和死区的配置中, tim1_BDTR.TIM_Break=TIM_Break_Disable;//TIM_Break_Enable;
刹车要失能(Disable),具体原因和MOE相关寄存器配置有关。

另外还有个参数疑问,就是
oc.TIM_OCIdleState = TIM_OCIdleState_Reset;
oc.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
这两个参数是干吗的?简单百度了下,发现没有答案,也可能是我找得不仔细。

这个其实也和刹车有相关,在使能(Enable)刹车后。
出现没有脉冲输出,输出引脚都是高电平或低电平。(因为暂时不使用,也不考虑刹车信号问题)
这个高电平和低电平就是取决于上面的两个参数。
具体可以参考寄存器TIMx_BDTR和TIMx_CR2

void PWM_Configuration(void)
{
TIM_TimeBaseInitTypeDef tim;
TIM_BDTRInitTypeDef tim1_BDTR;
TIM_OCInitTypeDef oc;
GPIO_InitTypeDef gpio;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE);	

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | 
                        RCC_APB2Periph_GPIOB |
                        RCC_APB2Periph_AFIO, ENABLE);


//Driver PWM output
gpio.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpio);

gpio.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;
gpio.GPIO_Mode = GPIO_Mode_AF_PP;
gpio.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &gpio);

tim.TIM_Period=5000;
tim.TIM_Prescaler=0;
tim.TIM_ClockDivision=TIM_CKD_DIV1;
tim.TIM_CounterMode=TIM_CounterMode_Up;
tim.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &tim);



oc.TIM_OCMode = TIM_OCMode_PWM1 ;
oc.TIM_OutputState = TIM_OutputState_Enable;
oc.TIM_OutputNState = TIM_OutputNState_Enable;
oc.TIM_Pulse = 0;
oc.TIM_OCPolarity = TIM_OCPolarity_High;
oc.TIM_OCNPolarity = TIM_OCNPolarity_High;
oc.TIM_OCIdleState = TIM_OCIdleState_Reset;
oc.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

TIM_OC2Init(TIM1, &oc);
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);


oc.TIM_OCMode = TIM_OCMode_PWM1 ;
oc.TIM_OutputState = TIM_OutputState_Enable;
oc.TIM_OutputNState = TIM_OutputNState_Enable;
oc.TIM_Pulse = 0;
oc.TIM_OCPolarity = TIM_OCPolarity_High;
oc.TIM_OCNPolarity = TIM_OCNPolarity_High;
oc.TIM_OCIdleState = TIM_OCIdleState_Reset;
oc.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OC3Init(TIM1, &oc);    
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);


/****** 配置BDTR寄存器,配置死区时间****************/
/*
定时器时钟 72M   TIM_ClockDivision = TIM_CKD_DIV1时,  Tdts = 13.89ns
0 - 1.764us  用算法一
1.778us - 3.505us  用算法二
3.556us - 7.000us  用算法三 
7.1117us - 14us    用算法四
需要更长时间,使用TIM_ClockDivision分频
 */
tim1_BDTR.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;
tim1_BDTR.TIM_Break=TIM_Break_Disable;//TIM_Break_Enable;
tim1_BDTR.TIM_BreakPolarity=TIM_BreakPolarity_High;
tim1_BDTR.TIM_OSSRState = TIM_OSSRState_Disable;
tim1_BDTR.TIM_OSSIState = TIM_OSSIState_Disable;
tim1_BDTR.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
tim1_BDTR.TIM_DeadTime = 72; //死区时间  72:1us 172:3us 205:5us
TIM_BDTRConfig(TIM1,&tim1_BDTR);

TIM_ARRPreloadConfig(TIM1, ENABLE);


TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1,ENABLE);

}

你可能感兴趣的:(STM32)