OpenEdv-开源电子网

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

关于PWM模式,且听我娓娓道来

  [复制链接]

3

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2013-9-9
在线时间
0 小时
发表于 2013-10-5 23:08:08 | 显示全部楼层 |阅读模式

首先,本人虽然初学STM32但极力反对一种误人子弟的观点:“对于STM32这样级别的MCU,有库函数就不用去看寄存器怎么操作的了!”

好了,言归正传,最近总看到很多朋友对于PWM这个实验有很多的疑惑,看到原子也在极力的回复也挺累的(体谅一下幸苦的原子大神,(*^__^*) ),所以我打算写这么一篇文字来阐述一下我个人对STM32的PWM的理解。

首先来说,你要使用PWM模式你得先选择用那个定时器来输出PWM吧!除了TIM6、TIM7这两个普通的定时器无法输出PWM外,其余的定时器都可以输出PWM,每个通用定时器可以输出4路PWM,高级定时器TIM1、TIM8每个可输出7路PWM,这里为了方便起见,我们选择与实验相同的TIM3的通道2来说明。选好定时器及通道后,下一步就是要使能定时器的时钟,根据需要看看是否需要重映射IO,然后就是配置输出PWM的IO及定时器,到这里原子的视频及例程都有详细的介绍,这里只需要提一点有些网友疑惑的TIM_TimeBaseStructure.TIM_ClockDivision = 0;这句话是什么作用?其实仔细看过技术手册后发现这句话与PWM输出实验其实是没关系的,这句话是设置定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例的(与输入捕获相关),0表示滤波器的频率和定时器的频率是一样的。至于其余部分,我就不再赘述。做完这些准备工作后,我就针对大多数朋友疑惑的地方——PWM模式的初始化设置做一个详细的阐述:先贴代码

     1       TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
     2       TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
     3       TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
     4       TIM_OC2Init(TIM3, &TIM_OCInitStructure);   //根据T指定的参数初始化外设TIM3 OC2
     5       TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器,即TIM3_CCR2的预装载值在更新事件到来时才能被传送至当前寄存器中。
     6       TIM_Cmd(TIM3, ENABLE);  //使能TIM3
这6句话就把PWM的通道配置好了,一句句来解释:
这里原子选择的PWM2模式,为什么选择的是PWM2模式呢?为什么不选择PWM1模式呢?两者又有什么区别呢?下面我们就一探究竟,PWM1和PWM2模式是由CCMR1的OC1M和OC2M来决定的,因为我们选择的是是通道2,所以设置的是OC2M,再看相关介绍
OC1M[2:0]:输出比较1模式(Output compare 1 enable)

110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为
无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否
则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为
有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电
平。

 看到红色的“有效电平”了吧,那么这又是谁定义的呢?别急,再看手册,可知它是由CCER这个寄存器的CCxP来决定的这里是通道2,所以是CC2P,继续看介绍

CC1P:输入/捕获1输出极性(Capture/Compare 1 output polarity)  位1
CC1通道配置为输出:
0:OC1高电平有效
1:OC1低电平有效
现在很清楚了吧,又因为第3句,TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高,所以这里我们设置的CC2P是0,也就是默认的OC2高电平有效。这样第3句话也捎带着解释了,哈哈!由于我们的战舰板的LED是低电平亮,而刚开始的给CC2P用来设置占空比的led0pwmval为0它是小于等于TIM3_CNT的,也就符合TIMx_CNT>=TIMx_CCR1时通道2输出有效电平,也就是高电平,所以你把原子的例程原封不动的Down到板子里,会看到刚上电,LED灯是不亮的。现在这块明白了吧!若你觉得还是不爽,我就非得用PWM1模式,那也可以,就像有个网友说“我拿原子的PWM Code就改了一个PWM1模式,按原子讲的PWM1和PWM2的输出是相反的啊,可是我上电发现LED是常亮的啊?怎么回事啊,求解释啊。。。”我们来分析一下这位朋友的代码,他把PWM2改成了PWM1,别的什么都没动,那么现在符合“PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平”
,否则为无效电平。“结果必然是就是LED长亮喽,要想得到跟原代妈一样的效果,那就把CC2P设置成1,OC2低电平有效,这样就可以了,有兴趣的朋友可以动手试试!(实践出真知吗!)
好了,废了这么多话,也不早了 洗洗睡吧!希望这篇文字对PWM有疑惑的朋友有所帮助!希望大家共同进步!分享是一种快乐,欢迎批评指正!

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

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2015-4-30
在线时间
0 小时
发表于 2017-2-28 22:08:34 | 显示全部楼层
可是为什么仅仅将PWM2改为PWM1上电后灯会常亮?而不是从亮逐渐变暗再从暗逐渐变亮?
珍惜你所拥有的,因为你终将失去!
回复 支持 3 反对 0

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-7-17
在线时间
0 小时
发表于 2013-10-22 22:03:40 | 显示全部楼层
发一个自己写的SPWM
//主函数
#include"delay.h"
#include"sys.h"
#include"math.h"
u16 counter; //正弦表移动指针
const float I=3.14159;
u16 SIN_Table[360];//正弦表
u16 CCR2_VAL;
/**************************************
正弦表计算函数Calu_sintable()
**************************************/
void Calcu_sintable()
{
   float a;
   float M=0.80;//定义调制比
   int ortion=5000;
   int i;
   for( i=0;i<360;i++)
   {
    a=Portion*(1+M*sin(((0.5+i)/360)*2*PI));
    SIN_Table=(u16) a;
}
}

//外设时钟配置
void RCC_Configuration()
{
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); 
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);       
}
 //GPIO通道配置
 void GPIO_Configuration()
 { GPIO_InitTypeDef GPIO_InitStructure;
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
 }
 //定时器1初始化配置
void TIM3_Configuration()
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  TIM_TimeBaseInitStruct.TIM_Period=10000;//20000十进制
  TIM_TimeBaseInitStruct.TIM_Prescaler=0;
  TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
  TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_CenterAligned1;
  TIM_TimeBaseInitStruct.TIM_RepetitionCounter=1;
  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
}
// WM配置初始化
void WM_Configuration()
{ TIM_OCInitTypeDef TIM_OCInitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM1; 
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
  TIM_OCInitStructure.TIM_Pulse = CCR2_VAL;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
  TIM_OC2Init(TIM3, &TIM_OCInitStructure);
  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIMx在CCR1上的预装载寄存器
  TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
  TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //开启计数溢出中断
  TIM_Cmd(TIM3, ENABLE);


  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
 
}
//主函数实现程序功能
int main()
{ counter=0;
  CCR2_VAL=3000;
  Calcu_sintable();//计算正弦表
  SystemInit();   //系统时钟初始化为72M   SYSCLK_FREQ_72MHz
  delay_init(72);       //延时函数初始化   
  NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  RCC_Configuration();
  GPIO_Configuration();
  TIM3_Configuration();
  WM_Configuration();
 
  while(1)
  {
  }
}
 //中断处理函数一定要写在stm32f10x_it.c 文件中
extern  u16 counter;
  extern  u16 SIN_Table[360];
  //extern  u16 CCR2_VAL;
  void TIM3_IRQHandler(void)   //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );  //清除TIMx的中断待处理位:TIM 中断源 
    }
//CCR2_VAL=SIN_Table[counter];
TIM_SetCompare2(TIM3,SIN_Table[counter]);
counter++;
if(counter>359)
{
counter=0;
}
}
回复 支持 2 反对 0

使用道具 举报

0

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
379
金钱
379
注册时间
2016-6-2
在线时间
59 小时
发表于 2016-8-23 17:03:55 | 显示全部楼层
就你说的关于原子代码修改为PWM1的有个问题想问下。设置为PWM1且设置高电平有效,那么在向上计数开始时CNT<CCR被设置为高电平,按理说应该LED不亮啊?
回复 支持 1 反对 0

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2016-11-3 21:13:39 | 显示全部楼层
周亚龙 发表于 2016-11-3 16:23
楼主说的很对,但是我觉得改为PW1模式呼吸灯常亮还有一个很重要的原因是原子哥PWM占空比的设置并不是从0~10 ...

经过测试,只改动为PWM1模,然后调占空比的值为600~900;可以实现同样的效果
回复 支持 1 反对 0

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-3-3
在线时间
4 小时
发表于 2016-3-13 09:08:09 | 显示全部楼层
谢谢楼主~~明白了好多呢
回复 支持 1 反对 0

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-7-17
在线时间
0 小时
发表于 2013-10-22 22:14:39 | 显示全部楼层
更正16楼一个错误,不开启端口复用时,没必要开启复用功能外设时钟RCC_APB2Periph_AFIO
回复 支持 1 反对 0

使用道具 举报

3

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2013-9-9
在线时间
0 小时
 楼主| 发表于 2013-10-5 23:18:27 | 显示全部楼层

 遗漏了一点,第5句还没解释呢,

5       TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器,即TIM3_CCR2的预装载值在更新事件到来时才能被传送至当前寄存器中。
这句话是说,CCR2中的预装载值何时被传送到当前的CNT寄存器中,这里我们选择的是当更新事件到来的时候才装载,追踪寄存器的设置可知,原来设置的是CCMR1的OC2PE,其实还有一种方式是立即装载看手册:
OC1PE:输出比较1预装载使能(Output compare 1 preload enable)  位3
0:禁止TIMx_CCR1寄存器的预装载功能,可随时写入TIMx_CCR1寄存器,并且新写入的数
值立即起作用。
1:开启TIMx_CCR1寄存器的预装载功能,读写操作仅对预装载寄存器操作,TIMx_CCR1的
预装载值在更新事件到来时被传送至当前寄存器中。

回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2013-10-6 00:32:52 | 显示全部楼层
分享的很好!
我也是初学者,不过我以为学习因人而异,每个人的起步基础不一样;对于计算机专业且c语言水平很高的人来说,也许单片机就是小儿科;但是对于非电子专业的人来说,学习起来可能就比较费劲。愚以为:学习无捷径,任何事情都是熟能生巧。从操作寄存器版本学习可以更加熟悉STM32芯片的资源。
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2013-10-6 00:34:02 | 显示全部楼层
希望多分享学习心得,多指教!
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2013-10-6 11:33:19 | 显示全部楼层
顶LZ
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-6 14:42:53 | 显示全部楼层
非常不错,分析的到位。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

204

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
287
金钱
287
注册时间
2013-7-17
在线时间
0 小时
发表于 2013-10-6 16:41:32 | 显示全部楼层
谢谢LZ
回复 支持 反对

使用道具 举报

1

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-10-1
在线时间
0 小时
发表于 2013-10-6 18:50:46 | 显示全部楼层
我顶!(此回复虽有且仅有两个字,却深刻地表达了回复人的深深的祝福与刻骨的情感,可谓言简意赅,一字千金,字字扣人心弦,字字催人泪下,足可见回复人扎实的文字功底和信手拈来的写作技巧及惨绝人寰的创新能力。实是佩服佩服!再加上以感叹号收尾,点睛之笔,妙笔生花,意境深远,照应前文,升华主题,把回复人的感情表达得淋漓尽致,给人无限感动和惆怅,有浑然天成之感,实乃回复中之极品,祝福中之绝笔。)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-6 19:30:13 | 显示全部楼层
回复【8楼】 萧狼1989 :
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-10-1
在线时间
0 小时
发表于 2013-10-6 20:07:47 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
在坛友的回复上抄来的,感觉很经典。
回复 支持 反对

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-8-8
在线时间
0 小时
发表于 2013-10-7 22:07:33 | 显示全部楼层
回复【10楼】萧狼1989:
---------------------------------尼玛,,太逗了、、、、
苦逼工科男
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
发表于 2013-10-8 09:25:39 | 显示全部楼层
楼主讲的太好了,解答了我们这些初学者的好多不明白的地方
回复 支持 反对

使用道具 举报

96

主题

762

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1228
金钱
1228
注册时间
2012-10-19
在线时间
15 小时
发表于 2013-10-8 13:27:11 | 显示全部楼层
LZ走的路线是对的,想要了解就必须看寄存器手册
回复 支持 反对

使用道具 举报

75

主题

458

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1635
金钱
1635
注册时间
2012-8-28
在线时间
71 小时
发表于 2013-10-8 14:27:23 | 显示全部楼层
看了半天我还是没看明白。一头雾水。
QQ750273008有好的资料记得发给我哦。。。
回复 支持 反对

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-10-2
在线时间
0 小时
发表于 2013-10-8 22:28:29 | 显示全部楼层
刚学到pwm就看到此贴,真幸运啊!!谢谢楼主,收获很大!
回复 支持 反对

使用道具 举报

5

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2013-10-20
在线时间
0 小时
发表于 2013-10-22 14:37:32 | 显示全部楼层
还没学到- -
加油加油加油!!!嵌入式怎么也要学会写系统吧!
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-7-17
在线时间
0 小时
发表于 2013-10-22 22:00:50 | 显示全部楼层
在使用PWM输出模式时,在输出端口GPIO的配置时,有一点要注意的是输出模式使用复用推挽输出,GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP,时钟配置时相应的要开启RCC_APB2Periph_AFIO,
//外设时钟配置
void RCC_Configuration()
{
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); 
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);       
}
 //GPIO通道配置
 void GPIO_Configuration()
 { GPIO_InitTypeDef GPIO_InitStructure;
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
 },不使用复用推挽输出软仿时没有波形
回复 支持 反对

使用道具 举报

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
876
金钱
876
注册时间
2013-10-3
在线时间
23 小时
发表于 2013-10-24 21:53:47 | 显示全部楼层
我赞、赞、赞、赞、赞、、、、、怒赞,,感谢楼主,哈哈
避免犯错本是错误所在,我错故我在……
回复 支持 反对

使用道具 举报

3

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2013-9-9
在线时间
0 小时
 楼主| 发表于 2013-10-25 10:33:49 | 显示全部楼层
回复【4楼】wangyan915205:
-------------------------------
指教不敢,大家多互相学习!嘻嘻!
回复 支持 反对

使用道具 举报

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2012-9-25
在线时间
0 小时
发表于 2013-10-25 15:19:17 | 显示全部楼层
回复【8楼】萧狼1989:
---------------------------------
不错!
回复 支持 反对

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
发表于 2014-5-23 17:46:12 | 显示全部楼层
TIM_OCInitStructure.TIM_Pulse = 0x3FFF;这个怎么不起作用,有这个为什么在主程序写那么复杂
回复 支持 反对

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
发表于 2014-5-23 17:46:44 | 显示全部楼层
回复【2楼】E-angel:
---------------------------------
TIM_OCInitStructure.TIM_Pulse = 0x3FFF;这个怎么不起作用,有这个为什么在主程序写那么复杂
回复 支持 反对

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-4-25
在线时间
0 小时
发表于 2014-5-23 17:48:45 | 显示全部楼层
回复【2楼】E-angel:
TIM_OCInitStructure.TIM_Pulse = 0x3FFF;这个怎么不起作用,有这个为什么在主程序写那么复杂
 while(1)

     {

                 delay_ms(10);       

                 if(dir)led0pwmval++;

                 else led0pwmval--;

 

                 if(led0pwmval>300)dir=0;

                 if(led0pwmval==0)dir=1;                                                                                                                                   

                 LED0_PWM_VAL=led0pwmval;   

     }         ----------------------------
回复 支持 反对

使用道具 举报

39

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2013-10-23
在线时间
94 小时
发表于 2014-5-26 10:17:00 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-5-8
在线时间
0 小时
发表于 2014-6-2 15:27:57 | 显示全部楼层
不错,写的好啊,楼主,受教了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-6-17
在线时间
0 小时
发表于 2014-6-17 21:12:11 | 显示全部楼层
不错,受教了
回复 支持 反对

使用道具 举报

3

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2013-9-13
在线时间
3 小时
发表于 2014-12-3 09:06:04 | 显示全部楼层
楼主分析得很不错,学习了
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-9-21
在线时间
4 小时
发表于 2014-12-24 12:07:57 | 显示全部楼层
不错!TIM_TimeBaseStructure.TIM_ClockDivision = 0;在输出比较是为0或输入补捉为1,效果都是滤波频率等于其定时器时钟频率,这又是为什么勒?
回复 支持 反对

使用道具 举报

17

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2012-11-3
在线时间
30 小时
发表于 2014-12-24 12:32:59 | 显示全部楼层
回复【8楼】萧狼1989:
---------------------------------
此乃回复中之极品,祝福中之绝笔
老夫驾鹤,有事烧纸!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-12-26
在线时间
0 小时
发表于 2014-12-26 21:44:08 | 显示全部楼层
回复【2楼】E-angel:
---------------------------------
你好,在下刚接触PWM ,有个很小的问题,PWM 的有效电平的意思是什么意思?PWM 在高电平有效的情况下,那他的无效电平就是低电平吗?
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-12-16
在线时间
0 小时
发表于 2014-12-31 10:45:29 | 显示全部楼层
谢谢楼主,我刚学到这里,看了很有收获
回复 支持 反对

使用道具 举报

19

主题

248

帖子

2

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2012-2-8
在线时间
19 小时
发表于 2015-1-19 17:17:09 | 显示全部楼层
如果,画个图就更好了,字那么多,看着都不好想象
回复 支持 反对

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-1-19 20:27:42 | 显示全部楼层
加深了对PWM的理解!谢谢楼主分享!
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2015-2-26
在线时间
26 小时
发表于 2015-2-26 15:06:22 | 显示全部楼层
回复【18楼】electric405:
---------------------------------
实现了?
回复 支持 反对

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-3-4 12:12:23 | 显示全部楼层
110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为
无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否
则为有效电平(OC1REF=1)。    
请问楼主在向上计数和向下计数时都是TIMx_CNT<TIMx_CCR1为有效电平,两者的差别是不是就在TIMx_CNT=TIMx_CCR1时不一样?
Good good study , day day up...
回复 支持 反对

使用道具 举报

14

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-3-24
在线时间
20 小时
发表于 2015-4-25 14:45:41 | 显示全部楼层
回复【2楼】E-angel:
---------------------------------
CC1P是在TIMx_CCMR1寄存器上吗?我怎么没找到啊
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2015-3-25
在线时间
0 小时
发表于 2015-5-3 12:54:23 | 显示全部楼层
回复【2楼】E-angel:
---------------------------------
你这句话解释的有问题吧,  “CCR2中的预装载值何时被传送到当前的CNT寄存器中,这里我们选择的是当更新事件到来的时候才装载,追踪寄存器的设置可知 ”    CCR2本身也有自己的影子寄存器  怎么会把预装载值传入CNT中呢,CCRx 和CNT只是作比较不存在谁传入到谁中,CNT是按输入源的频率来计数的, 图50 好好看一下,如有什么异议可以接着讨论
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-8-12
在线时间
0 小时
发表于 2015-9-16 18:11:29 | 显示全部楼层
谢谢,明白了
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-7-26
在线时间
9 小时
发表于 2015-9-22 20:46:13 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-5-21
在线时间
8 小时
发表于 2015-12-28 09:55:25 | 显示全部楼层
electric405 发表于 2013-10-22 22:03
发一个自己写的SPWM
//主函数
#include&quot;delay.h&quot;
#include&quot;sys.h&quot;
#include&quot;math.h&quot;
u16&nbsp; ...

你好,大哥,麻烦您注解下这段代码可以吗?我菜鸟看的不懂!谢谢!
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2015-6-23
在线时间
112 小时
发表于 2015-12-29 16:12:18 | 显示全部楼层
这样的解释,让我深刻理解了。
回复 支持 反对

使用道具 举报

14

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2015-9-27
在线时间
27 小时
发表于 2016-3-3 21:16:25 | 显示全部楼层
这就是个名字 发表于 2015-5-3 12:54
回复【2楼】E-angel:
---------------------------------
你这句话解释的有问题吧,&nbsp;&nbsp;“CCR2中的 ...

你好,CCR2的值只是用来给CNT比较用的是吧。如果选择更新事件到来的时候才装载,也就是这个函数TIM_OC2PolarityConfig(TIM3, TIM_OCPreload_Enable);,那就是先把预装载值存在CCR2的影子寄存器里,然后等到更新事件的到来在将该预装载值写到CCR2中。
若果不使能上面的函数,就是直接把值写到CCR2中吧。
我刚刚学习PWM,不知道说的对不对。请指教。谢谢
回复 支持 反对

使用道具 举报

14

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2015-9-27
在线时间
27 小时
发表于 2016-3-3 21:16:43 | 显示全部楼层
楼主棒棒哒
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2015-12-28
在线时间
9 小时
发表于 2016-3-5 10:55:42 | 显示全部楼层
110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为
无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否
则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为
有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电
平。
也就是说模式1和2默认设置的是通道1吗
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2015-12-28
在线时间
9 小时
发表于 2016-3-5 11:10:22 | 显示全部楼层
我改了一个PWM1模式,输出是相反的啊。尼玛,坑了我一个早上
回复 支持 反对

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-7 20:28:53 | 显示全部楼层
本帖最后由 xkwy 于 2016-3-7 20:30 编辑
Just Beat It 发表于 2015-3-4 12:12
110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为
无效电平;在 ...


对于上升计数,Update刚刚发生时,CNT<CCRx
对于下降计数,Update刚刚发生时,CNT>CCRx
坚决不用寄存器,拒绝重复造轮子。
回复 支持 反对

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-7 20:42:04 | 显示全部楼层
muyeshizi 发表于 2015-4-25 14:45
回复【2楼】E-angel:
---------------------------------
CC1P是在TIMx_CCMR1寄存器上吗?我怎么没找到啊

楼主说的是TIM->CCER,
坚决不用寄存器,拒绝重复造轮子。
回复 支持 反对

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-7 20:49:20 | 显示全部楼层
puxing 发表于 2016-3-5 10:55
110:PWM模式1- 在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否
则为有效电平(OC ...

这个110b是对TIMx->CCMR1[OC1M]的解释,注意看上下文
坚决不用寄存器,拒绝重复造轮子。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 22:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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