定时器输出PWM想要实现第一个脉冲为持续低电平

2019-07-20 01:19发布

STM32F407在使用定时器进行PWM输出时,我想在定时器初始化之后,进入中断之前,使其输出持续为低电平,一直也没能实现,总是多一个高低电平。我尝试过在初始化函数里进行强制低电平,结果也不符合预期。请大家帮忙修改一下。

现在程序的运行结果如下:

初始化输出极性为低时结果:
微信图片_20190615101659.jpg

初始化输出极性为高时结果:
微信图片_20190615101654.jpg

我想要实现第一个脉冲持续为低电平,不知该怎样配置,向大家请教~


我目前的代码如下:



void TIM12_PWM_Init(u32 arr,u32 psc)
{                              
    //´Ë²¿·ÖÐèÊÖ¶¯ÐÞ¸ÄIO¿ÚÉèÖÃ
   
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM12,ENABLE);      //TIM12ʱÖÓʹÄÜ   
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);     //ʹÄ&#220ORTBʱÖÓ   
   
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_TIM12); //GPIOB14¸´ÓÃΪ¶¨Ê±Æ÷12
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;           //GPIOB10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //¸´Óù¦ÄÜ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    //ËÙ¶È100MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //ÍÆÍ츴ÓÃÊä³ö
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //ÉÏÀ­
    GPIO_Init(GPIOB,&GPIO_InitStructure);              //³õʼ»&#175B14
      
    TIM_TimeBaseStructure.TIM_Prescaler=psc;  //¶¨Ê±Æ÷·ÖƵ
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
    TIM_TimeBaseStructure.TIM_Period=arr;   //×Ô¶¯ÖØ×°ÔØÖµ
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
   
    TIM_TimeBaseInit(TIM12,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷12
   
    //³õʼ»¯TIM12 Channe1 PWMģʽ     
    //TIM_ForcedOC1Config(TIM12, TIM_ForcedAction_InActive);//Ç¿ÖÆÊä³öµÍµçƽ
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ1
     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔµÍ
    TIM_OC1Init(TIM12, &TIM_OCInitStructure);  //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM12OC1

    TIM_OC1PreloadConfig(TIM12, TIM_OCPreload_Enable);  //ʹÄÜTIM12ÔÚCCR1ÉϵÄԤװÔؼĴæÆ÷

  TIM_ARRPreloadConfig(TIM12,ENABLE);//ARPEʹÄÜ

  //TIM_Cmd(TIM12, ENABLE);  //ʹÄÜTIM12
   
     TIM_ITConfig(TIM12,TIM_IT_Update,ENABLE); //ÔÊÐí¶¨Ê±Æ÷12¸üÐÂÖжÏ


    NVIC_InitStructure.NVIC_IRQChannel=TIM8_BRK_TIM12_IRQn ; //¶¨Ê±Æ÷12ÖжÏ
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //ÇÀÕ¼ÓÅÏȼ¶1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //×ÓÓÅÏȼ¶3
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);
   
  TIM_Cmd(TIM12, ENABLE);  //ʹÄÜTIM12   
}  


void TIM8_BRK_TIM12_IRQHandler(void)
{
    uint16_t tmpccmr1 = 0;
    int t;
    extern int j;
    extern int ADSB[117];
    if(TIM_GetITStatus(TIM12,TIM_IT_Update)==SET) //Òç³öÖжÏ
            {
//                  tmpccmr1 = TIM12->CCMR1;

//                    /* Reset the OC1M Bits */
//                    tmpccmr1 &= (uint16_t)~TIM_CCMR1_OC1M;

//                    /* Configure The output Mode--PWM1 */
//                    tmpccmr1 |= TIM_OCMode_PWM1;

//                    /* Write to TIMx CCMR1 register */
//                    TIM12->CCMR1 = tmpccmr1;
                                
               
               
                if(j==117)
                {
                    
                    TIM_Cmd(TIM12, DISABLE);
                  TIM_ForcedOC1Config(TIM12, TIM_ForcedAction_Active);
                }
                else
                {   
                        t=ADSB[j];
                        if(t==0)
                            {
                                TIM12->CCER|=(uint16_t)0x0002;  //TIM_OCPolarity_Low     
                              TIM12->ARR =5000;
                            }
                        else if(t==1)
                            {
                                TIM12->CCER &=~(uint16_t)0x0002;  //TIM_OCPolarity_High
                                TIM12->ARR =5000;
                            }
                      else if(t==2)
                            {
                                TIM12->CCER &=~(uint16_t)0x0002;  //TIM_OCPolarity_High
                                TIM12->ARR =12500;
                          }
                        else if(t==3)
                            {
                                TIM12->CCER &=~(uint16_t)0x0002;  //TIM_OCPolarity_High
                                TIM12->ARR =17500;
                          }   
                }
                j++;
            }
     TIM_ClearITPendingBit(TIM12,TIM_IT_Update);  //Çå³ýÖжϱê־λ
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。