关于PWM的关闭问题?

2019-10-15 00:07发布

最近做直流无刷电机的控制,需要3路PWM,3路频率占空比一致,由同一个timer产生。现在需要循环打开其中一路PWM输出,其余两路保持关闭。
请教各位都有哪些实现方法,stm32能不能在不关闭pwm外设的同时,直接断开其对IO的输出,并将IO设置为指定高低电平状态???
希望大家指教。@正点原子。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
爱博不专
2019-10-15 12:02
经过自己试验,发现在使用TIM_CCxCmd关闭单一通道后,IO总是输出高电平(自己需要低电平来保持MOS关闭),好像不受TIM_OCIdleState 设置的影响,IdleState看手册应该是使用互补输出刹车功能是才有效(或是TIM_CtrlPWMOutputs(TIM1, DISABLE);意思必须是MOE位为0,也就是全部PWM输出关闭),单纯使用CCx而不使用CCn好像没有什么效果。。。
而使用TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_InActive);将IO强制输出低电平,会导致TIM_CCxCmd无法开启该通道的pwm输出,想要再次开启需要配置的比较麻烦,无异于重新关闭打开所有通道的pwm输出一次。。。
自己尝试在TIM_CCxCmd关闭channelx之后将IO改为一般输出,并reset该位,可以达到效果
又尝试不关闭channelx而直接改变IO配置,也可以将IO置为所需状态,但是不知道这样有没什么风险。。。
建议还是先暂停channelx的输出,再改IO配置
                t=key_scan();
                if(t==1) {pwm_ioAF();}
                if(t==2) {pwm_ioOUT();}
               
                //if(t==1) {TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);pwm_ioAF();}
                //if(t==2) {TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Disable);pwm_ioOUT();}

void pwm_ioAF(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //GPIO_PuPd_NOPULL;//
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        //GPIO_SetBits(GPIOA,GPIO_Pin_8);//输出高电平
}
void pwm_ioOUT(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //GPIO_PuPd_NOPULL;//
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);//输出低电平
}

或者像楼上说的直接将占空比设为0

不知大家怎么用???

一周热门 更多>