打印
[应用相关]

stm32使用PWM时,关闭PWM引脚会出现高电平解决方案

[复制链接]
5731|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
643757107|  楼主 | 2017-12-27 14:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在使用TIM3来产生PWM波形,并通过软件打开/关闭PWM以实现调制波形。做法是:
打开:TIM_Cmd(TIM3, ENABLE);
关闭:TIM_Cmd(TIM3, DISABLE);
跟踪到TIM_Cmd之后,发现直接操作寄存器就可以了:TIMx->CR1 |= CR1_CEN_Set;
这个问题算解决了。
但是PWM关闭后,管脚电平是高电平,这不是我需要的……需要的是低电平。尝试关闭PWM后,加一行GPIO_ResetBits(GPIOC, GPIO_Pin_6);以把管脚设置为低电平。测试代码:
while(1)
{
       ENABLE_PWM();
        Delay_ms(10);//延时若干ms
        DISABLE_PWM();
        GPIO_ResetBits(GPIOC, GPIO_Pin_6);
        Delay_ms(10);//延时若干ms
}
用示波器观测了一下,发现PWM关闭期间管脚电平有时是高电平,有时是低电平……查找手册也没找到相关说法。用TIM_OC1Init()把TIM3重新配置一下倒是可以解决,但是速度太慢了。


沙发
643757107|  楼主 | 2017-12-27 14:22 | 只看该作者
更为快捷的方式是:通过TIM_ForcedOC1Config(TIM3, TIM_ForcedAction_InActive);强制输出低电平解决了,呵呵。
在使用PWM时,在设置为活动电平TIM_ForcedOC3Config(TIM4, TIM_ForcedAction_Active);,成功解决这个问题

使用特权

评论回复
板凳
fengfeng的恒| | 2017-12-27 14:45 | 只看该作者
关闭定时器后,把定时器值设置为0吧。

使用特权

评论回复
地板
一周一天班| | 2017-12-27 15:38 | 只看该作者
io口加下拉电阻,关闭后是输入高阻状态

使用特权

评论回复
5
一周一天班| | 2017-12-27 15:39 | 只看该作者
不对,可以把pwm设置为反向的

使用特权

评论回复
6
sdggg| | 2017-12-27 18:19 | 只看该作者
最快捷就是把占空比设0,即CCRx寄存器置0,这是PWM模式1下的,无需停止定时器计数和关闭输出就可以置为低电平(前提是初始化时配置是高电平活跃)。也可以直接关闭OCxREF输出使能(CCER寄存器就是使能和关闭输出及活跃电平极性),不用关闭定时器。

使用特权

评论回复
7
643757107|  楼主 | 2017-12-27 18:20 | 只看该作者
sdggg 发表于 2017-12-27 18:19
最快捷就是把占空比设0,即CCRx寄存器置0,这是PWM模式1下的,无需停止定时器计数和关闭输出就可以置为低电 ...

你说的这个方法好,调节成占空比为0,就是低电平,调节为100%就是高电平

使用特权

评论回复
8
sdggg| | 2017-12-28 09:00 | 只看该作者
643757107 发表于 2017-12-27 18:20
你说的这个方法好,调节成占空比为0,就是低电平,调节为100%就是高电平

我做的产品都用到蜂鸣器,就是用定时器启动PWM输出,关闭就置0,不用关闭定时器,而且频繁启动和关闭定时器会出问题,定时器不能启动,我一个项目就是频繁启动定时器和关闭,正常环境温度下工作正常,但主板温度高后以及干扰大了后,定时器就不工作了,改成CCRx置0就没发现这种问题了

使用特权

评论回复
9
CCompton| | 2017-12-28 15:30 | 只看该作者
可以直接关闭OCxREF输出使能

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

3849

帖子

11

粉丝