OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8950|回复: 4

关于PWM的关闭问题?

[复制链接]

35

主题

227

帖子

3

精华

高级会员

Rank: 4

积分
956
金钱
956
注册时间
2014-3-5
在线时间
35 小时
发表于 2016-2-21 11:43:24 | 显示全部楼层 |阅读模式
5金钱
最近做直流无刷电机的控制,需要3路PWM,3路频率占空比一致,由同一个timer产生。现在需要循环打开其中一路PWM输出,其余两路保持关闭。
请教各位都有哪些实现方法,stm32能不能在不关闭pwm外设的同时,直接断开其对IO的输出,并将IO设置为指定高低电平状态???
希望大家指教。@正点原子。

最佳答案

查看完整内容[请看2#楼]

问题已解决: void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx); 关闭后输出为空闲电平 极性可以自定义TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
把看到的有意义的例子进行扩充,并将其切实的运用到自己的设计中。 应用确实不容易,水平是在不断的实践中完善和发展的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

35

主题

227

帖子

3

精华

高级会员

Rank: 4

积分
956
金钱
956
注册时间
2014-3-5
在线时间
35 小时
 楼主| 发表于 2016-2-21 11:43:25 | 显示全部楼层
问题已解决:
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
关闭后输出为空闲电平
极性可以自定义TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
把看到的有意义的例子进行扩充,并将其切实的运用到自己的设计中。 应用确实不容易,水平是在不断的实践中完善和发展的。
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2014-2-25
在线时间
230 小时
发表于 2016-2-21 14:38:46 | 显示全部楼层
其实按照你说的不大好,我的建议是不关闭它的输出,而是设置占空比为0或者满占空比,就是对应的高电平或者低电平
回复

使用道具 举报

35

主题

227

帖子

3

精华

高级会员

Rank: 4

积分
956
金钱
956
注册时间
2014-3-5
在线时间
35 小时
 楼主| 发表于 2016-2-22 11:36:43 | 显示全部楼层
经过自己试验,发现在使用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

不知大家怎么用???
把看到的有意义的例子进行扩充,并将其切实的运用到自己的设计中。 应用确实不容易,水平是在不断的实践中完善和发展的。
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2019-10-14
在线时间
24 小时
发表于 2020-3-26 19:42:35 | 显示全部楼层
通用定时器好像关了没用呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 18:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表