OpenEdv-开源电子网

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

stm32高级定时器的互补输出pwm空闲电平设置问题

[复制链接]

3

主题

15

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-11-23
在线时间
9 小时
发表于 2018-11-23 17:23:00 | 显示全部楼层 |阅读模式
1金钱
想通过配置 stm32 的 TIM1 输出1ms 5个的 200KHz 的互补PWM,希望两路互补PWM空闲时均为低电平。

方法为在TIM更新中断函数中通过全局变量自加到5,改变 CCxE CCxEN 来控制PWM的开关。结果发现两路空闲时均为高电平。
1.尝试过 TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_InActive)  和 TIM_ForcedOC2Config(TIM1, TIM_ForcedAction_InActive),发现只能对互补路有效果,另外一路不论在pwm工作或空闲都一直保持高电平没有pwm。


2.修改OSSR OSSI OCPolarity IdelState等均无效果,两路空闲时依旧是高电平。


3.采用重复计数器关闭TIM计数器的方式,两路互补电平为一高一低

调了好多天了依然不出效果,很急,有没有前辈有类似经验啊?

1

1

2

2

3

3
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-11-23
在线时间
9 小时
 楼主| 发表于 2018-11-23 17:24:46 | 显示全部楼层
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-7-26
在线时间
8 小时
发表于 2018-11-23 21:41:52 | 显示全部楼层
兄弟,你解决了么,我和你碰到了同样的问题,
微信图片_20181123214039.jpg
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-7-26
在线时间
8 小时
发表于 2018-11-23 21:43:43 | 显示全部楼层
我的这个是隔一段时间输出互补的PWM,但是需要输出完后,全部是低电平,我这总是一高一低,可以加我微信一起探讨一下,zgq593543
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-23 21:45:48 | 显示全部楼层
这个我是将PWM的引脚初始化为普通IO口拉低,然后在需要PWM功能时在初始化为PWM的

原来我也是希望我的PWM在空闲时输出固定的低电平,可是配置了不行。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-11-23
在线时间
9 小时
 楼主| 发表于 2018-11-26 16:50:10 | 显示全部楼层
心静 发表于 2018-11-23 21:41
兄弟,你解决了么,我和你碰到了同样的问题,

木有啊,我都准备换方案了
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-11-23
在线时间
9 小时
 楼主| 发表于 2018-11-26 16:51:52 | 显示全部楼层
szczyb1314 发表于 2018-11-23 21:45
这个我是将PWM的引脚初始化为普通IO口拉低,然后在需要PWM功能时在初始化为PWM的

原来我也是希望我的PWM ...

大佬,有详细的例程之类的吗?我试过变成普通io不好使,是不是我哪部出错了。
回复

使用道具 举报

11

主题

95

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2017-3-19
在线时间
116 小时
发表于 2018-11-26 17:08:45 | 显示全部楼层
心静 发表于 2018-11-23 21:43
我的这个是隔一段时间输出互补的PWM,但是需要输出完后,全部是低电平,我这总是一高一低,可以加我微信一 ...

你把定时器关了,就恢复成你开始定义的状态,你可以设置为互补这两路开始状态都为低电平
回复

使用道具 举报

11

主题

95

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2017-3-19
在线时间
116 小时
发表于 2018-11-26 17:11:42 | 显示全部楼层
互补两路PWM空闲时要都为同一电平,需要设置起始电平,然后空闲时关闭定时器,不然定时器开启,一定呈现互补状态
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-27 08:07:59 | 显示全部楼层
szczyb1314 发表于 2018-11-23 21:45
这个我是将PWM的引脚初始化为普通IO口拉低,然后在需要PWM功能时在初始化为PWM的

原来我也是希望我的PWM ...

就是在空闲的时候你不是需要输出固定的电平嘛,直接初始化为普通输出,原子哥的LED的初始化一样的,设置成你要的电平,在需要输出PWM时再初始化为PWM输出。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-11-23
在线时间
9 小时
 楼主| 发表于 2018-11-27 09:01:55 | 显示全部楼层
123将321 发表于 2018-11-26 17:11
互补两路PWM空闲时要都为同一电平,需要设置起始电平,然后空闲时关闭定时器,不然定时器开启,一定呈现互 ...

怎么设置起始电平呢?
回复

使用道具 举报

11

主题

95

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2017-3-19
在线时间
116 小时
发表于 2018-11-27 10:38:55 | 显示全部楼层
zzqssq 发表于 2018-11-27 09:01
怎么设置起始电平呢?

看图上标记的就是了
微信截图_20181127102226.png
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-11-23
在线时间
9 小时
 楼主| 发表于 2018-11-27 11:16:42 | 显示全部楼层
123将321 发表于 2018-11-27 10:38
看图上标记的就是了

这个应该是有效电平的意思吧,在通过重复计数器输出固定数量PWM的前提下,原本正向pwm初始为低电平,反向pwm为高电平,我按照你的方法把两个High改为Low,正向pwm初始电平变为高,反向pwm电平变为低了。
回复

使用道具 举报

11

主题

95

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2017-3-19
在线时间
116 小时
发表于 2018-11-27 11:30:18 | 显示全部楼层
zzqssq 发表于 2018-11-27 11:16
这个应该是有效电平的意思吧,在通过重复计数器输出固定数量PWM的前提下,原本正向pwm初始为低电平,反向 ...

你不是要设置 两路互补PWM空闲时均为低电平,你按照我那样设置,然后空闲时,你把定时器关了,两路互补PWM都为低电平,这个我是一直在用的
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-11-23
在线时间
9 小时
 楼主| 发表于 2018-11-27 13:39:21 | 显示全部楼层
123将321 发表于 2018-11-27 11:30
你不是要设置 两路互补PWM空闲时均为低电平,你按照我那样设置,然后空闲时,你把定时器关了,两路互补PW ...

好的我试试
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-11-23
在线时间
9 小时
 楼主| 发表于 2018-11-27 13:52:35 | 显示全部楼层
123将321 发表于 2018-11-27 11:30
你不是要设置 两路互补PWM空闲时均为低电平,你按照我那样设置,然后空闲时,你把定时器关了,两路互补PW ...

刚刚试过了,还是不行啊,老哥方便发完整的代码吗?我对比看看有什么差别
回复

使用道具 举报

11

主题

95

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2017-3-19
在线时间
116 小时
发表于 2018-11-27 14:10:11 | 显示全部楼层
zzqssq 发表于 2018-11-27 13:52
刚刚试过了,还是不行啊,老哥方便发完整的代码吗?我对比看看有什么差别

主要函数就这些了,DMA功能我这版本没有加,忽略过去了

微信截图_20181127140532.png
微信截图_20181127140659.png
微信截图_20181127140729.png
微信截图_20181127140800.png
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-7-26
在线时间
8 小时
发表于 2018-11-28 16:29:43 | 显示全部楼层
123将321 发表于 2018-11-27 14:10
主要函数就这些了,DMA功能我这版本没有加,忽略过去了

兄弟,你这样我试过了,不行啊
3f393563ac5f8334db6f6d1d8bfdfe7.jpg
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-7-26
在线时间
8 小时
发表于 2018-11-28 17:08:28 | 显示全部楼层
szczyb1314 发表于 2018-11-23 21:45
这个我是将PWM的引脚初始化为普通IO口拉低,然后在需要PWM功能时在初始化为PWM的

原来我也是希望我的PWM ...

兄弟可以发一下代码么,我试了一下,不行啊,我的是在定时器里面开启的PWM模式
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-29 08:18:45 | 显示全部楼层
代码在公司电脑上,发不上来
你的需求:输出PWM,空闲的时候输出PWM的引脚是固定的低电平?
我的做法:需要输出PWM时,初始化定时器输出PWM,在空闲的时候初始化这个引脚为普通输出引脚,设置低电平输出。等你再次需要输出PWM时重新初始化为PWM输出即可。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-7-26
在线时间
8 小时
发表于 2018-11-29 09:10:13 | 显示全部楼层
szczyb1314 发表于 2018-11-29 08:18
代码在公司电脑上,发不上来
你的需求:输出PWM,空闲的时候输出PWM的引脚是固定的低电平?
我的做法:需 ...

是的,我的需求就是在关闭定时器后,是固定的低电平,(因为我是隔一段时间发几个脉冲),昨天试了一下,改成IO模式,也就是(GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能)改成输出模式,然后确实可以拉低,但是再改成复用模式后,就没有PWM产生了;
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-7-26
在线时间
8 小时
发表于 2018-11-29 09:20:33 | 显示全部楼层
szczyb1314 发表于 2018-11-29 08:18
代码在公司电脑上,发不上来
你的需求:输出PWM,空闲的时候输出PWM的引脚是固定的低电平?
我的做法:需 ...

还有哥们,你这个重新初始化是你全部初始化还是如何初始化啊
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-29 09:23:49 | 显示全部楼层
空闲的时候把定时器失能关掉,初始化为普通IO,设置低电平。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
之后你要初始的啊:GPIO_Init();不调用这个那叫初始化?                                       
然后GPIO_ResetBits();                                               

需要PWM的时候,重新初始PWM功能,定时器使能打开。
直接调用下你的PWM的初始化函数重新从头到尾初始化一遍PWM。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-29 09:24:24 | 显示全部楼层
库函数麻烦了可以直接用寄存器版的修改寄存器更快
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

0

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2018-11-29
在线时间
9 小时
发表于 2018-11-29 16:50:23 | 显示全部楼层
学习了,谢谢各位
回复

使用道具 举报

11

主题

95

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2017-3-19
在线时间
116 小时
发表于 2018-11-30 10:46:01 | 显示全部楼层
心静 发表于 2018-11-28 16:29
兄弟,你这样我试过了,不行啊

不要意思,原来的配置,空闲时是高电平,修改为下面的,空闲时时低电平

我测试出来是没问题,你看下图片对应的波形


修改的配置

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;


微信图片编辑_20181130104116.jpg
微信图片编辑_20181130104149.jpg
微信图片编辑_20181130104229.jpg
微信图片编辑_20181130104258.jpg
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 23:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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