OpenEdv-开源电子网

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

关于通用定时器的PWM比较输出的一点感悟~~

[复制链接]

7

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-4-20
在线时间
0 小时
发表于 2011-5-9 16:03:39 | 显示全部楼层 |阅读模式

在论坛发了好几个求问帖,一直受到原子大哥的帮助。。心生惭愧。总想什么时候自己能回报一下论坛。
只怪自己还是一个学生,能力大大滴有限。久久不能发个有用的帖子。
这两天一直在搞定时器的PWM比较输出,看了很多资料,把论坛里有关的帖子也看了一遍。
发现原子大哥已经在多个帖子讲解了PWM输出,辛苦啊。
下面是本人结合原子大哥的讲解和个人感悟得出的一些结论和实验代码,必然有许多不足之处(极有可能有错),还望原子大哥和各位大虾谅解,可以随意批评指正我(本人脸皮实测较厚)。

第一步:TIMx_CNT和TIMx_CCR1比较,来分配无效电平和有效电平的占空比
第二步:OC1REF就是存储无效电平和有效电平的占空比
第三步:CC1P决定有效电平是高电平or低电平,无论CC1P取什么,最终输出的均为有效电平
总结:我们所要做的
                           1.控制有效电平占空比
                           2.控制输出高or低

验证代码(修改于原子哥的代码)
#include <stm32f10x.h>
#include "sys.h"
#include "delay.h" 
#include "io.h"
#include "timer.h"
/*==================================================================================================*/
//验证CC1P的作用~
//观察LED的亮暗判断:高亮->微亮->高亮->微亮->灭->微亮->灭->微亮
//亦可仿真观察PA0的输出波形
//设置CC1P,O:高电平有效,1:低电平有效,控制输出OC1REF有效电平的极性    
int main(void)
{    
     Stm32_Clock_Init(9);   //系统时钟设置,外部高速时钟HSE,9倍频
     Delay_Init(72);        //延时初始化,设置在系统时钟下,必须始终初始化一致
     IO_Init();        //初始化IO接口
     Timer2_PWM1_Init(900,0); //不分频。PWM频率=72000/900=80Khz,周期=12.5us
      while(1)//死循环
      {         
          TIM2->CCER|=1<<1;       //低电平为有效电平
          LED0_PWM_VAL=0;        //OC1REF电平,一直有效电平         
          Delay_Ms(1000);           
          LED0_PWM_VAL=850;    //OC1REF电平,无效电平:0-850,有效电平:851-900 
          Delay_Ms(1000);  
          LED0_PWM_VAL=0;   
          Delay_Ms(1000);  
          LED0_PWM_VAL=850;    
          Delay_Ms(1000);
  
          TIM2->CCER&=~(1<<1);    //高电平为有效电平  
          LED0_PWM_VAL=0;           //OC1REF电平,一直有效电平            
          Delay_Ms(1000);           
          LED0_PWM_VAL=50;         //OC1REF电平,无效电平:0-50,有效电平:51-900    
          Delay_Ms(1000);  
          LED0_PWM_VAL=0;   
          Delay_Ms(1000);  
          LED0_PWM_VAL=50;    
          Delay_Ms(1000);  
     }
}
原子大哥的详细讲解:
http://http://www.openedv.com/posts/list/140.htm
另一个比较有帮助的帖子:
http://http://www.openedv.com/posts/list/374.htm

人生苦短,及时行乐!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-5-9 16:16:55 | 显示全部楼层
回复【楼主位】RR子海:
-------------------------------
总结的不错。加油!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2011-5-2
在线时间
0 小时
发表于 2011-5-9 19:47:27 | 显示全部楼层
总结的很好 
很有帮助! 
回复 支持 反对

使用道具 举报

7

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-4-20
在线时间
0 小时
 楼主| 发表于 2011-5-10 13:10:36 | 显示全部楼层
回复【2楼】正点原子:
-------------------------------
fighting~~~
人生苦短,及时行乐!!
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2011-7-13
在线时间
0 小时
发表于 2011-8-3 16:18:10 | 显示全部楼层
回复【楼主位】RR子海:
为什么有效跟无效电平总是在0到900中定,不可以超过900?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-8-3 16:42:10 | 显示全部楼层
可以啊.你自己试验一下,超过900会发生什么现象?
如果看了现象,你也会让他不超过900 的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-4-28
在线时间
0 小时
发表于 2012-5-31 13:40:34 | 显示全部楼层
回复【楼主位】RR子海:
---------------------------------
  Timer2_PWM1_Init(900,0); //不分频。PWM频率=72000/900=80Khz,周期=12.5us;;;如果分频怎么办啊  比如把“0”改为“1”,是不是频率就变成了40khz吗? 还有占空比的问题,比如有效电平为周期的三分之一,CRR寄存器是设置为900/3=300,还是900*2/3,,楼主求指教,我目前也是一位学生
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-8-20
在线时间
1 小时
发表于 2012-9-12 20:04:03 | 显示全部楼层
请问原子哥,无效电平有什么意义啊?对于楼主ccr=50时怎么也是微亮,这种亮度跟ccr=850时有何区别啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-12 21:07:37 | 显示全部楼层
回复【8楼】茶亦爽:
---------------------------------
如果你说1是有效电平,那么无效电平就是0.
如果说0是有效电平,则无效电平就是1
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-8-20
在线时间
1 小时
发表于 2012-9-13 10:25:15 | 显示全部楼层
回复【9楼】正点原子:
回复【8楼】茶亦爽: 
--------------------------------- 
如果你说1是有效电平,那么无效电平就是0. 
如果说0是有效电平,则无效电平就是1
---------------------------------
呵呵 ,通过软件仿真,我也是这样理解的,这样也就解释了极性相反的ccr=50和ccr=850时的微亮应该基本一致!谢谢!
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2012-11-16
在线时间
3 小时
发表于 2012-11-30 00:19:20 | 显示全部楼层
学习贴,MARK先。谢谢分享!
回复 支持 反对

使用道具 举报

0

主题

21

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-2-18
在线时间
0 小时
发表于 2013-2-28 16:45:31 | 显示全部楼层
为什么我在仿真的时候能看到看到占空比的变化,而下载到板子上面LED灯就看不到它的:亮->微亮->灭->微亮的变化呢?



回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-28 17:28:08 | 显示全部楼层
因为你的眼睛,没那么快啊。
用示波器看吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

21

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-2-18
在线时间
0 小时
发表于 2013-3-1 08:16:44 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
用示波器也能看到占空比的的变化。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-1 09:53:51 | 显示全部楼层
说明程序无问题.
 要嘛你的占空比变化范围太小了,不够引起眼睛的反应.要嘛你的PWM频率太高了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

21

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-2-18
在线时间
0 小时
发表于 2013-3-8 09:39:11 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
如果我想调低PWM的频率怎么调啊。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-8 09:51:24 | 显示全部楼层
回复【16楼】mazairan:
---------------------------------
加大分频系数,降低主频,或者提高ARR值,都可以达到要求。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

21

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-2-18
在线时间
0 小时
发表于 2013-3-16 14:45:03 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
int main(void) 
{    
u16 led4pwmval=0; 
u8 dir=1;  
Stm32_Clock_Init(9); // 系统时钟设置 
delay_init(72);      //延时初始化 
uart_init(72,9600);  //串口初始化  
LED_Init();      //初始化与 LED 连接的硬件接口 
PWM_Init(900,512);  // 512分频。PWM 频率=72000/900=8Khz 
    while(1) 

delay_ms(10);      
if(dir)led4pwmval++; 
else led4pwmval--; 
 
if(led4pwmval>300)dir=0; 
if(led4pwmval==0)dir=1;             
LED4_PWM_VAL=led4pwmval;     
}   
}

512分频可以了,都能看到了,谢谢原子老大。
回复 支持 反对

使用道具 举报

19

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2011-3-23
在线时间
5 小时
发表于 2013-3-29 15:34:25 | 显示全部楼层
奇怪啊,怎么大不开了啊!!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-22 06:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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