求解一段程序以及IR2110驱动的问题

2019-08-20 19:10发布

/*******************************************************
*        定时器产生2路互补的PWM波
*          channel1 ,channel2 -->A.8, A.9       
                        channel1N,channel2N-->B.13, B.14 (互补)
*                TimerPeriod          --> ×Ô¶ˉÖØ×°ÔØÖüÆúÖμ
*                ChannelxPulse --> Õ¼¿ÕÖüÆúÖμ
******************************************************/
void TIM1_PWM_Init(u16 pfreq ,u16 psc)                        //pfreqÎa2»·ÖÆμê±μ&#196WMÆμÂ꣬pscÎaÔ¤·ÖÆμÖμ
{  
        GPIO_InitTypeDef                                   GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;               
        TIM_OCInitTypeDef                            TIM_OCInitStructure;                        //êä3öí¨μàÅäÖÃ
        TIM_BDTRInitTypeDef                   TIM_BDTRInitStructure;                //ËàÇøoíé23μÅäÖÃ

        TimerPeriod = (SystemCoreClock / pfreq) - 1;                         //×Ô¶ˉÖØ×°ÔØÖüÆúÖμ

        /* ChannelxPulse = DutyCycle * (TIM1_Period - 1) / 100 */
        Channel1Pulse = (u16)((u32)(50  * (TimerPeriod - 1)) / 100 );        //Õ¼¿Õ±è50%
        Channel2Pulse = (u16)((u32)(50  * (TimerPeriod - 1)) / 100 );        //Õ¼¿Õ±è50%

        /* ê1ÄüTIM1£¬GPIOA£¬GPIOB£¬GPIOE */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
       
        /*channel1 ,channel2 -->A.8,A.9*
         *channel1N,channel2N-->B.13,B.14*/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;          
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                                   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

  /*  3õê¼»ˉTIM1  */
        TIM_TimeBaseStructure.TIM_Period            = TimerPeriod;       //éèÖÃÖØ×°ÔØÖüÆúÖμ  
        TIM_TimeBaseStructure.TIM_Prescaler         = psc;                            //éèÖÃÔ¤·ÖÆμÖμ
        TIM_TimeBaseStructure.TIM_ClockDivision     = 0;                        //ê±Öó·ÖÆμòò×󣬽öóëêäèë2¶»ñóD1Ø£¨¶¨ê±Æ÷óëÂË2¨Æ÷μÄÆμÂê±è£©
        TIM_TimeBaseStructure.TIM_CounterMode       = TIM_CounterMode_Up;//TIMÏòéϼÆêyÄ£ê½
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;                                                                 //Öظ′òç3öÖD¶Ï
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                  //3õê¼»ˉ¶¨ê±Æ÷»ù±¾ÅäÖÃ
       
        /* Channel_1   TIM_OCMode_PWM1Ä£ê½ */         
        TIM_OCInitStructure.TIM_OCMode       = TIM_OCMode_PWM1;                //&#212;ú&#207;òé&#207;&#188;&#198;êyê±£&#172;ò&#187;μ&#169;TIMx_CNT<TIMx_CCR1ê±í¨μà1&#206;aóDD§μ&#231;&#198;&#189;
        TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable;          //±è&#189;&#207;ê&#228;3&#246;ê1&#196;ü
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;         //PWM&#187;¥21ê&#228;3&#246;ê1&#196;ü
        TIM_OCInitStructure.TIM_Pulse        = Channel1Pulse;                                //&#213;&#188;&#191;&#213;±è = TIM_Pulse/TIM_Period;
        TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;             //óDD§μ&#231;&#198;&#189;&#206;a&#184;&#223;μ&#231;&#198;&#189;
        TIM_OCInitStructure.TIM_OCNPolarity  = TIM_OCNPolarity_High;           //&#187;¥21PWM&#188;&#171;D&#212;
        TIM_OCInitStructure.TIM_OCIdleState  = TIM_OCIdleState_Set;                   //ê&#228;3&#246;&#191;&#213;&#207;D×′ì&#172;
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;          //PWM&#187;¥21ê&#228;3&#246;&#191;&#213;&#207;D×′ì&#172;
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);                                //&#184;ù&#190;Y&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèTIM1 OC1
       
        /* Channel_2          TIM_OCMode_PWM1&#196;£ê&#189; */
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;              //&#212;ú&#207;òé&#207;&#188;&#198;êyê±£&#172;ò&#187;μ&#169;TIMx_CNT>TIMx_CCR1ê±í¨μà1&#206;aóDD§μ&#231;&#198;&#189;
        TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable;          //±è&#189;&#207;ê&#228;3&#246;ê1&#196;ü
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;         //PWM&#187;¥21ê&#228;3&#246;ê1&#196;ü
        TIM_OCInitStructure.TIM_Pulse  = Channel2Pulse;                       //&#213;&#188;&#191;&#213;±è = TIM_Pulse/TIM_Period;
        TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;             //óDD§μ&#231;&#198;&#189;&#206;a&#184;&#223;μ&#231;&#198;&#189;
        TIM_OCInitStructure.TIM_OCNPolarity  = TIM_OCNPolarity_High;           //&#187;¥21PWM&#188;&#171;D&#212;
        TIM_OCInitStructure.TIM_OCIdleState  = TIM_OCIdleState_Set;                   //ê&#228;3&#246;&#191;&#213;&#207;D×′ì&#172;
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;          //PWM&#187;¥21ê&#228;3&#246;&#191;&#213;&#207;D×′ì&#172;
        TIM_OC2Init(TIM1, &TIM_OCInitStructure);                       //&#184;ù&#190;Y&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèTIM1 OC2

        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);          //ê1&#196;üTIM3&#212;úCCR1é&#207;μ&#196;&#212;¤×°&#212;&#216;&#188;&#196;′&#230;&#198;÷
        TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);          //ê1&#196;üTIM3&#212;úCCR2é&#207;μ&#196;&#212;¤×°&#212;&#216;&#188;&#196;′&#230;&#198;÷

        /*&#203;à&#199;&#248;oíé23μ1|&#196;ü&#197;&#228;&#214;&#195;*/
        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        = 0x2F;                //éè&#214;&#195;TIM1_BDTRμ&#196;DTG[7:0]
        TIM_BDTRInitStructure.TIM_Break           = TIM_Break_Disable;
        TIM_BDTRInitStructure.TIM_BreakPolarity   = TIM_BreakPolarity_High;
        TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
        TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
       
        TIM_Cmd(TIM1, ENABLE);                                                 //ê1&#196;üTIM1
        TIM_CtrlPWMOutputs(TIM1,ENABLE);        //PWMê&#228;3&#246;ê1&#196;ü
}
求解哦,以上程序的意思是不是A8和A9输出相同信号,而B13和B14也输出相同信号?(不知道为什么后面的注释成乱码了)
另外,图下部分的IR2110驱动,求解是不是HLN端入口的信号进去由HO端口输出?从图上来说就是A8控制Q1,A9控制Q3?
麻烦各位大佬了!!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
麻婆豆腐233
2019-08-21 06:27
void TIM2_IRQHandler(void)  
{
        extern float Period_percent;
       
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查更新发生
        {         
                        TIM_SetCompare1(TIM1,(u16)(Period_percent*spwm[i])) ;       
                        TIM_SetCompare2(TIM1,(u16)(Period_percent*spwm[i++]));       
                        if(i == 401)  //采样400个点
                        {

                                i = 0;
                        }

                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  
        }
}
再加上这一段,通过定时中断来输出PWM波,总觉得越来越糊涂了。是不是这里设定A8和A9占空比的原因导致的波形相似啊?

一周热门 更多>