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

[复制链接]
9142|22
 楼主| 玉骄龙 发表于 2013-8-11 09:23 | 显示全部楼层 |阅读模式
各位关注的朋友好!
我刚学STM32,最近有一项目,想要用STM32F051的PWM来驱动H桥。可忙了一段时间,还是没能搞出来。想请教各位大神,STM32F051能实现这样的功能吗?




PWM问题.jpg
logokfu 发表于 2013-8-11 09:38 | 显示全部楼层
你这个是要做什么东西,
 楼主| 玉骄龙 发表于 2013-8-11 10:40 | 显示全部楼层
驱动H桥,实现移相调功
zoujiachi 发表于 2013-8-11 10:44 | 显示全部楼层
可以的,用定时器输出PWM完全可以实现,驱动全桥的话要注意死区的建立。不过建议不用单片机直接驱动桥,加个专用驱动芯片比较好
 楼主| 玉骄龙 发表于 2013-8-11 13:18 | 显示全部楼层
zoujiachi 发表于 2013-8-11 10:44
可以的,用定时器输出PWM完全可以实现,驱动全桥的话要注意死区的建立。不过建议不用单片机直接驱动桥,加 ...

谢谢你的参与!驱动全桥自然是有专门的驱动芯片的。我只想用STM32来产生所需的移相PWM功能。不知您是怎么实现这一功能的。能详细讲讲吗?谢谢!
人生之际 发表于 2013-8-11 16:45 | 显示全部楼层
Timer1可以实现3相带互补带死区外加刹车输入。你的2相应该也可以,不过功能实现只有看datasheet了,或者st及别人的电机驱动的例子
zoujiachi 发表于 2013-8-11 22:06 | 显示全部楼层
玉骄龙 发表于 2013-8-11 13:18
谢谢你的参与!驱动全桥自然是有专门的驱动芯片的。我只想用STM32来产生所需的移相PWM功能。不知您是怎么 ...

利用定时器的输出比较功能,根据你需要的相移和输出的频率,计算出相应的捕获值,即Capture寄存器的值,然后就可以输出你需要的PWM波了,具体可以去参照下官方的PWM输出例子
 楼主| 玉骄龙 发表于 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信号。
说错了请拍砖!欢迎讨论!谢谢!
 楼主| 玉骄龙 发表于 2013-8-12 09:28 | 显示全部楼层
netjob 发表于 2013-8-11 17:29
可以的。 STM32可以驱动H桥, 但驱动电路要认真设计。 光耦、变压器。。。闭锁保护,过流保护。。。

资料 ...

版主好!
STM32F10xx的可以用TIM1+TIM8来实现这个功能,可我目前用的是STM32F05xx的。只有TIM1才具备带死区互补的PWM功能。从这几天的研究来看,要想用STM32F05xx来做这件事,应该是一件不可能的事。原因在另一个贴子内回复了。由于我是初学,也许还有很多我没有理解到的地方。欢迎您指导!
 楼主| 玉骄龙 发表于 2013-8-12 09:39 | 显示全部楼层
zoujiachi 发表于 2013-8-11 22:06
利用定时器的输出比较功能,根据你需要的相移和输出的频率,计算出相应的捕获值,即Capture寄存器的值, ...

Capture寄存器的值只对PWM的脉宽有作用,对PWM的相位是没有影的。这是我这几天研究的“成果”。如果有可能,麻烦你给我一个链接。我去再研究一下。谢谢!
 楼主| 玉骄龙 发表于 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);       
按上面的设置还是不行。就算这样可行的话,那怎样设置两个通道的相位关系值?哪个参数决定相位?
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
 楼主| 玉骄龙 发表于 2013-8-12 21:08 | 显示全部楼层
GONGO 发表于 2013-8-12 10:49
刚才的方法有点问题,需要软件干预。
你在试一下下面的方法,和上面的差不多,总体思想都是用相邻的两个周 ...

你好!那张图片看了一下,应该是能达到我的要求的。只是我没找到你的这个文档,所以还是没搞出来。可以麻烦你告诉我那张图是那个文档上面的?我想去找来看看。或麻烦你上传到贴子里。先谢了!如果再也没有好的方法。下次我就结贴了。
GONGO 发表于 2013-8-13 09:13 | 显示全部楼层
这个是我画的,方法已经告诉你啦,很容易。可以先用中断来处理看一下效果,
如果要PWM调整的话,在箭头处,同时修改相应的 CCR 即可实现。
s_f_tan 发表于 2013-8-13 10:10 | 显示全部楼层
反相输出不就可以调相了?输出0控制相位时间,输出1 就开始驱动
 楼主| 玉骄龙 发表于 2013-8-13 17:33 | 显示全部楼层
s_f_tan 发表于 2013-8-13 10:10
反相输出不就可以调相了?输出0控制相位时间,输出1 就开始驱动

你能详细讲讲吗?不是很明白。
 楼主| 玉骄龙 发表于 2013-8-13 17:35 | 显示全部楼层
GONGO 发表于 2013-8-13 09:13
这个是我画的,方法已经告诉你啦,很容易。可以先用中断来处理看一下效果,
如果要PWM调整的话,在箭头处, ...

我基础太差,我再试试!谢谢!
hawksabre 发表于 2013-8-13 20:25 | 显示全部楼层
帮楼主顶一个   看看别人的意见吧   顶一个
yinyangdianzi 发表于 2013-8-14 09:29 | 显示全部楼层
hehe ,观望楼主
sun1238898 发表于 2013-8-15 16:12 | 显示全部楼层
你试着修改PWM的产生参数,来测试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部