14107|27

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

tim1是否能输出互为180度的PWM? [复制链接]

                                 一个项目需要输出两路PWM,但要互为180度相位,看了关于tim1定时器的文档,还是不明白,请高手指点?
此帖出自stm32/stm8论坛

最新回复

看了这个帖子,忍不住要回一帖,那几个解答的大神很敬业,佩服佩服!  详情 回复 发表于 2014-8-15 19:38
点赞 关注
 

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 可以的,一个PWM模式1,一个PWM模式2
此帖出自stm32/stm8论坛
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 好的,我先研究下,多谢
此帖出自stm32/stm8论坛
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
STM32的TIM1有三对互补输出,使能互补输出直接产生互为180度相位的2路PWM输出。

如果不使用TIM1,可以用2楼的办法。
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 版主理解错我的意思了,我说的180度相位差是对整个pwm周期说的,跟互补输出是不同的,我还在研究2楼说的。。。
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 


也许是我理解错了,你能画个波形图出来吗?这样比较直观。

还有你要的PWM输出的占空比是多少?是常量还是变量?如果是变量,在什么范围变化?

想了想,占空比似乎不能大于50%,否则不能满足互为180度相位的要求,不知对不对,恐怕看了波形图才能知道。
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 如果占空比刚好是50%,则这2路信号应该刚好为互补信号。不知对不对,恐怕看了波形图才能知道。
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
pwm180.JPG
我画了一个示意图。我想要pwm的展空比是任意可调的
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

9
 
楼主,看了你上面的图之后,我在2楼说的不能解决你的这个问题

用两个TIMER可以实现这种波形的输出
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
互补的PWM,好像使用TIM2、3也都可以的
TIM1的主要优势是可以生成带有死区的互补PWM
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 这个问题要好好考虑一下。
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

12
 
楼主 你的问题解决没
我现在也到了和你的需求类似的问题
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

13
 
考虑了一下,使用STM32 的任意一个定时器都可以实现楼主的要求。

基本设置如下:
1)配置定时器的计数器为中间对齐计数,即先向上计数再向下计数。
2)在该定时器上选择2个通道,并分别配置为输出比较模式,并配置在比较成功时翻转对应的引脚输出。
3)配置自动重装载寄存器TIMx_ARR为要求输出频率的一半。
4)假定CC1为第一个输出信号的通道,再假定第一个信号的正脉冲宽度对应为W1,则配置TIMx_CCR1为TIMx_ARR-W1/2。
5) 同4),假定CC2为第二个输出信号的通道,正脉冲宽度对应为W2,配置TIMx_CCR2为W2/2。

----------------------------------------------
下面以一个例子说明:

假设要求输出的信号频率为10kHz,占空比为1:3。
再假设定时器的输入时钟为72MHz。

输出信号的频率10kHz,换算为计数器的数值为7200。
按照上述3),设置TIMx_ARR=3600

输出信号1的高电平时间W1,换算为计数器的数值为W1=7200/4=1800
按照上述4),设置TIMx_CC1=3600 - W1/2=2700

输出信号2的高电平时间W2,换算为计数器的数值为W2=7200/4=1800
按照上述5),设置TIMx_CC2=2/2=450

参照下图,图中红线表示计数器的数值变化:
①当计数器的数值从0向上计数,达到TIMx_CC1时,CC1匹配成功,CC1的输出电平翻转;
②计数器继续向上计数,达到TIMx_ARR时开始调头向下计数;当计数器的数值下降到TIMx_CC1时,CC1再次匹配成功,CC1的输出电平再次翻转;
③计数器继续向下计数,达到到TIMx_CC2时,CC2匹配成功,CC2的输出电平翻转;
④计数器继续向下计数,减到0时开始调头向上计数;当计数器的数值上升到TIMx_CC2时,CC2再次匹配成功,CC2的输出电平再次翻转;

如此循环,得到连续的相位互为180度的两路输出波形。

注意:上述描述是一个原理性的说明,但能够输出要求的波形并且占空比可调,实际编程计算中需要可能需要对某些数值加1或者减1,以达到准确地输出。

STM32_Outout_180degree.gif (16.46 KB)

STM32_Outout_180degree.gif

此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

14
 
                                 “中间对齐计数”,这个方法很妙
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

15
 
再来一个占空比大于50%的示意图:

STM32_Outout_180degree1.gif (16.57 KB)

STM32_Outout_180degree1.gif

此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

16
 
个人更倾向于使用PWM1,PWM2的方式,因为Toggle(翻转)模式需要考虑Channel的初始状态
需要在Toggle开始前强制设定两个Channel的相位,曾经产品上就出现过这样的问题(相同的HEX,运行时产生不同的结果)
根据版主的提示写的一段能满足楼主要求的代码
/**
  软件: IAR 4.42 32K 限制版
  库:   2.0
  硬件: 万利 EKSTM3210B-LK1
  说明: 使用TIM3的Channel3和Channel4产生楼主所述波形
*/

#define   Fsys           72000000ul   //  system freq 72MHz
#define   Fpwm           20000        //  PWM freq  20K
#define   PWM_DUTY       20           //  PWM duty 20%
void  ConfigTimer(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  
  RCC_APB1PeriphClockCmd(  RCC_APB1Periph_TIM3,ENABLE);
  RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOB,ENABLE);
  
  TIM_DeInit(TIM3);
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
  TIM_TimeBaseStructure.TIM_Period = (Fsys/2) / Fpwm;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
  
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_Pulse = (((Fsys/2) / Fpwm) * PWM_DUTY) / 100;
  TIM_OC3Init(TIM3,&TIM_OCInitStructure);
  
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_Pulse = (((Fsys/2) / Fpwm) * (100-PWM_DUTY)) / 100;
  TIM_OC4Init(TIM3,&TIM_OCInitStructure);
  
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  TIM_CtrlPWMOutputs(TIM3, ENABLE);
  TIM_Cmd(TIM3,ENABLE);
}

无图无真相。图中CH3即 Timer3 Channel3(GPIOB.0), CH4即 Timer3 Channel4(GPIOB.1)
TEK0001.JPG
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

17
 
呵呵,“中间对齐模式”真的是一语点醒梦中人。
楼主的这个问题我也在想单普通Timer的解决方法,看到你给了个这么好的思路所以忍不住就写了
此帖出自stm32/stm8论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

18
 
                                 真不错!
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

19
 
                                 讨论的这么有深度,很受益
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

20
 
                                 实在太强了, 搭车再问个问题, 正在做一个项目需要在程序运行中可调节占空比的pwm输出,希望各位高人不吝赐教
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表