OpenEdv-开源电子网

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

原子哥求助下第14章PWM输出的问题

[复制链接]

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
发表于 2013-12-21 00:14:29 | 显示全部楼层 |阅读模式
 //初始化TIM3 Channel2 PWM模式 
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
 TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
=====================================================
u16 led0pwmval=0;
   u8 dir=1;
TIM3_PWM_Init(899,0);  //不分频,PWM频率=72000/900=8Khz
   while(1)
   {
       delay_ms(10);   
       if(dir)
      led0pwmval++;
       else
       led0pwmval--;
       if(led0pwmval>300)
        dir=0;
       if(led0pwmval==0)
        dir=1;                      
       TIM_SetCompare2(TIM3,led0pwmval);       
   }    
    这段程序运行到板子上后,最开始的时候小灯是从暗逐渐变亮的。这里设置的是TIM_OCPolarity_High,那我设置成TIM_OCPolarity_Low,按我的理解,灯最开始应是从亮到灭吧,但是为什么到板子上,灯一直亮呢?PWM不起作用了。
    另外
    参考手册292页写着:CCx配置为输出时,
    0:OCx高电平有效;
    1:OCx低电平有效;
    手册289页写着:在PWM模式2,在向上计数时,一旦TIMx_CNT<TIMx_CCRx 时通道x为无效电平,否则为有效电平。
    我对此的理解是:我们设置为High时,OCx高电平有效,,PWM模式2,向上计数,当CNT<CCRx的时候,输出的无效电平就是低电平吧?当CNT>CCRx时,输出有效电平为高电平?
    那么主程序中while(1)循环里,刚开始占空比是从100%逐渐减小吧,所以灯是逐渐变灭的。
    不知道上面我的理解对不对?如果对的话,那么我们设置为Low的时候,应该刚开始的时候占空比应该为0%呀,应该是灯逐渐变暗呐!为什么灯是一直亮着的呢?
    求原子哥给解答下,新手,51基础不太好,嘿嘿
    
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2013-12-21 20:32:20 | 显示全部楼层
楼主是不是理解反了?PWM输出的频率由ARR和PSC决定,而占空比取决于CCRy(y为通道1~4):设置为极性高且PWM模式1的时候,当CCRy>CNT时,输出高电平;当CCRy<CNT时输出低电平,如果是PWM2模式则极性相反!原子哥的例程里设置PWM2模式,所以主函数里开始逐渐增加CCRy的值,当大于计数值就输出低电平了,否则为高电平(PWM控制LED逐渐变亮);然后到300又逐渐减小CCRy的值,开始低电平,当小于CNT时转为输出高电平(PWM控制LED逐渐变暗)。这也是为什么程序一开始先是逐渐变亮,然后又逐渐变暗的原因。>
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
 楼主| 发表于 2013-12-23 00:26:05 | 显示全部楼层
回复【3楼】hechao3225:
---------------------------------
对呀,我就是这么理解的,上面那句话:那么主程序中while(1)循环里,刚开始占空比是从100%逐渐减小吧,所以灯是逐渐变灭的
这句话我写错了,是灯逐渐变亮的。
但是我的疑问是,我把=TIM_OCPolarity_High改设置成TIM_OCPolarity_Low。那预计现象应该是灯开始的时候是逐渐变灭的,然后再逐渐变亮吧?
但是实际现象确实等一直在亮,没有亮度变化.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-12-23 12:01:55 | 显示全部楼层
回复【4楼】beifengabc:
---------------------------------
你仿真一下,看看PWM波形.
LED是低电平亮,低电平越多,就越亮.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2013-12-23 12:20:32 | 显示全部楼层
回复【4楼】beifengabc:
---------------------------------
额。我试了,发现极性和PWM模式匹配才行。PWM2模式极性设高才能PWM输出,PWM1模式极性设低才有PWM输出!不知道为什么,这个要原子哥解答啊。。
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
 楼主| 发表于 2013-12-23 21:38:54 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
恩恩,我明白。原子哥能给说下,为什么设置成Low,模式2的PWM就不起作用了?我观察到灯是一直保持一个亮度的
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-12-23 22:54:10 | 显示全部楼层
回复【7楼】beifengabc:
---------------------------------
我没用库函数,所以不知Low和你的设置的具体关系.
这个分析,无非2种情况:
1,有PWM输出,但是低电平时间远大于高电平,你看上去灯就是一直亮的,微小的变化,人眼看不出来.
2,没PWM输出,一直输出低电平.

至于到底是什么情况,你可以:
1,软件仿真 看波形.
2,用示波器测试下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2013-8-22
在线时间
1 小时
发表于 2013-12-24 09:27:29 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
谢谢原子哥,我昨天也搞不懂这个PWM输出的波形,为什么不是不停的闪烁。就因为高低电平的占空比不同来控制灯的亮度,是因为频率太快了吧。
爱我所爱!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-4-11
在线时间
8 小时
发表于 2020-4-17 18:56:36 | 显示全部楼层
High是不反相;Low是反相;设置Low时为什么灯是一直亮的,那是因为占空比小,导致低电平的时间过长,所以灯一直亮,可以改一下代码把把输出的脉冲周期扫描截去一段低电平,再仿真就行了

下面把while循环里面的代码改一改,初值也改改
        u16 led0pwmval=500;
          while(1)
        {
                delay_ms(10);         
                if(dir)led0pwmval++;
                else led0pwmval--;         
                if(led0pwmval>890)dir=0;
                if(led0pwmval==500)dir=1;                                                    
                TIM_SetCompare1(TIM1,led0pwmval);          
        }
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 10:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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