打印

STM32F051 驱动H桥的PWM 能实现吗?

[复制链接]
8352|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
玉骄龙|  楼主 | 2013-8-11 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位关注的朋友好!
我刚学STM32,最近有一项目,想要用STM32F051的PWM来驱动H桥。可忙了一段时间,还是没能搞出来。想请教各位大神,STM32F051能实现这样的功能吗?




PWM问题.jpg (120.47 KB )

PWM问题.jpg
沙发
logokfu| | 2013-8-11 09:38 | 只看该作者
你这个是要做什么东西,

使用特权

评论回复
板凳
玉骄龙|  楼主 | 2013-8-11 10:40 | 只看该作者
驱动H桥,实现移相调功

使用特权

评论回复
地板
zoujiachi| | 2013-8-11 10:44 | 只看该作者
可以的,用定时器输出PWM完全可以实现,驱动全桥的话要注意死区的建立。不过建议不用单片机直接驱动桥,加个专用驱动芯片比较好

使用特权

评论回复
5
玉骄龙|  楼主 | 2013-8-11 13:18 | 只看该作者
zoujiachi 发表于 2013-8-11 10:44
可以的,用定时器输出PWM完全可以实现,驱动全桥的话要注意死区的建立。不过建议不用单片机直接驱动桥,加 ...

谢谢你的参与!驱动全桥自然是有专门的驱动芯片的。我只想用STM32来产生所需的移相PWM功能。不知您是怎么实现这一功能的。能详细讲讲吗?谢谢!

使用特权

评论回复
6
人生之际| | 2013-8-11 16:45 | 只看该作者
Timer1可以实现3相带互补带死区外加刹车输入。你的2相应该也可以,不过功能实现只有看datasheet了,或者st及别人的电机驱动的例子

使用特权

评论回复
7
zoujiachi| | 2013-8-11 22:06 | 只看该作者
玉骄龙 发表于 2013-8-11 13:18
谢谢你的参与!驱动全桥自然是有专门的驱动芯片的。我只想用STM32来产生所需的移相PWM功能。不知您是怎么 ...

利用定时器的输出比较功能,根据你需要的相移和输出的频率,计算出相应的捕获值,即Capture寄存器的值,然后就可以输出你需要的PWM波了,具体可以去参照下官方的PWM输出例子

使用特权

评论回复
8
玉骄龙|  楼主 | 2013-8-12 09:20 | 只看该作者
本帖最后由 玉骄龙 于 2013-8-12 09:22 编辑
人生之际 发表于 2013-8-11 16:45
Timer1可以实现3相带互补带死区外加刹车输入。你的2相应该也可以,不过功能实现只有看datasheet了,或者st ...

谢谢关注!
TIMER1定时器仅有一个计数器TIM1_CNT,这个TIM1_CNT的值决定了PWM的周期。TIMER1同时有4个比较寄存器TIM1_CCR1~TIM1_CCR4。这个四比较寄存器的值决定四个通道的PWM脉宽。所以,TIMER1只能输出频率相同,最多四路脉宽不同的PWM。或3对带死区互补的PWM加一路普通的PWM。此时的PWM也都是频率相同的。
TIMER1定时器仅有一个计数器TIM1_CNT。TIM1_CNT的计数开始时间就决定了PWM的相位。而TIMER1的CCR寄存器是不能对相位产生影响的。所以,TIMER1就只能输出频率相同,脉宽不同的PWM.不能产生有相位差的PWM信号。
说错了请拍砖!欢迎讨论!谢谢!

使用特权

评论回复
9
玉骄龙|  楼主 | 2013-8-12 09:28 | 只看该作者
netjob 发表于 2013-8-11 17:29
可以的。 STM32可以驱动H桥, 但驱动电路要认真设计。 光耦、变压器。。。闭锁保护,过流保护。。。

资料 ...

版主好!
STM32F10xx的可以用TIM1+TIM8来实现这个功能,可我目前用的是STM32F05xx的。只有TIM1才具备带死区互补的PWM功能。从这几天的研究来看,要想用STM32F05xx来做这件事,应该是一件不可能的事。原因在另一个贴子内回复了。由于我是初学,也许还有很多我没有理解到的地方。欢迎您指导!

使用特权

评论回复
10
玉骄龙|  楼主 | 2013-8-12 09:39 | 只看该作者
zoujiachi 发表于 2013-8-11 22:06
利用定时器的输出比较功能,根据你需要的相移和输出的频率,计算出相应的捕获值,即Capture寄存器的值, ...

Capture寄存器的值只对PWM的脉宽有作用,对PWM的相位是没有影的。这是我这几天研究的“成果”。如果有可能,麻烦你给我一个链接。我去再研究一下。谢谢!

使用特权

评论回复
11
玉骄龙|  楼主 | 2013-8-12 10:15 | 只看该作者
GONGO 发表于 2013-8-12 09:41
你试一下,TIM_CH1 用 PWM1方式,TIM_CH2 用 PWM2 方式。可以得到你要的波形的。 ...

                /* Time 定时基础设置*/
                TIM_TimeBaseStructure.TIM_Prescaler = 0;//不分频
                TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;        //TIM_CounterMode_Up/TIM_CounterMode_Down/TIM_CounterMode_CenterAligned1
                                                                                                                                                        //TIM_CounterMode_CenterAligned2/TIM_CounterMode_CenterAligned3
                TIM_TimeBaseStructure.TIM_Period = (SystemCoreClock / Frequency ) - 2;//PWM頻率  
                TIM_TimeBaseStructure.TIM_ClockDivision = 0;
                TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//
                TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

                /* 频道1,2的PWM 模式设置 */
                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//
                TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
                TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
                TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//
                TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;//
                TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
                TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
                TIM_OCInitStructure.TIM_Pulse = ((SystemCoreClock / Frequency ))/ 200 * Pulse;//PWM脉宽
                 
                TIM_OC1Init(TIM1, &TIM_OCInitStructure);
                TIM_OC2Init(TIM1, &TIM_OCInitStructure);
               
                TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//
                TIM_OC3Init(TIM1, &TIM_OCInitStructure);
                TIM_OC4Init(TIM1, &TIM_OCInitStructure);
               
                /* TIM1 计算器使能*/
                  TIM_Cmd(TIM1, ENABLE);
       
                  /* TIM1 主输出使能 */
                  TIM_CtrlPWMOutputs(TIM1, ENABLE);       
按上面的设置还是不行。就算这样可行的话,那怎样设置两个通道的相位关系值?哪个参数决定相位?

使用特权

评论回复
12
GONGO| | 2013-8-12 10:49 | 只看该作者
本帖最后由 GONGO 于 2013-8-12 14:29 编辑
玉骄龙 发表于 2013-8-12 10:15
/* Time 定时基础设置*/
                TIM_TimeBaseStructure.TIM_Prescaler = 0;//不分频
                TIM_TimeBaseStructur ...

刚才的方法有点问题,需要软件干预。
你在试一下下面的方法,和上面的差不多,总体思想都是用相邻的两个周期来调整,单周期像你说的,是固定的,没法调相位。

在所有箭头处切换 PWM 方式 ,
图中 实心箭头 的是由 PWM2 切换成 PWM1 。沿的宽度等于 CNT 值,用 CCR1 和 CCR 2 来调整 相位差。

绘图30.jpg (11.57 KB )

绘图30.jpg

使用特权

评论回复
13
玉骄龙|  楼主 | 2013-8-12 21:08 | 只看该作者
GONGO 发表于 2013-8-12 10:49
刚才的方法有点问题,需要软件干预。
你在试一下下面的方法,和上面的差不多,总体思想都是用相邻的两个周 ...

你好!那张图片看了一下,应该是能达到我的要求的。只是我没找到你的这个文档,所以还是没搞出来。可以麻烦你告诉我那张图是那个文档上面的?我想去找来看看。或麻烦你上传到贴子里。先谢了!如果再也没有好的方法。下次我就结贴了。

使用特权

评论回复
14
GONGO| | 2013-8-13 09:13 | 只看该作者
这个是我画的,方法已经告诉你啦,很容易。可以先用中断来处理看一下效果,
如果要PWM调整的话,在箭头处,同时修改相应的 CCR 即可实现。

使用特权

评论回复
15
s_f_tan| | 2013-8-13 10:10 | 只看该作者
反相输出不就可以调相了?输出0控制相位时间,输出1 就开始驱动

使用特权

评论回复
16
玉骄龙|  楼主 | 2013-8-13 17:33 | 只看该作者
s_f_tan 发表于 2013-8-13 10:10
反相输出不就可以调相了?输出0控制相位时间,输出1 就开始驱动

你能详细讲讲吗?不是很明白。

使用特权

评论回复
17
玉骄龙|  楼主 | 2013-8-13 17:35 | 只看该作者
GONGO 发表于 2013-8-13 09:13
这个是我画的,方法已经告诉你啦,很容易。可以先用中断来处理看一下效果,
如果要PWM调整的话,在箭头处, ...

我基础太差,我再试试!谢谢!

使用特权

评论回复
18
hawksabre| | 2013-8-13 20:25 | 只看该作者
帮楼主顶一个   看看别人的意见吧   顶一个

使用特权

评论回复
19
yinyangdianzi| | 2013-8-14 09:29 | 只看该作者
hehe ,观望楼主

使用特权

评论回复
20
sun1238898| | 2013-8-15 16:12 | 只看该作者
你试着修改PWM的产生参数,来测试

使用特权

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

本版积分规则

2

主题

18

帖子

0

粉丝