金牌会员
 
- 积分
- 1073
- 金钱
- 1073
- 注册时间
- 2019-1-9
- 在线时间
- 101 小时
|
本帖最后由 杀死比亚dgq 于 2020-8-12 14:58 编辑
首贴
战舰----在用定时器输出PWM时,即试验9-PWM输出问题,大家都遇到这个问题,把PWM模式2改为模式1,为什么LED就处于长亮?
关于这个问题,论坛上也有很多解答的思路,可我觉得都是有些是在把现象给凑出来,可为什么这么改程序,也没有说清楚,
哪怕是这篇精华帖也没说清楚http://www.openedv.com/forum.php ... ght=PWM%C4%A3%CA%BD,也只是在翻译程序。
思考许久,终于得到能让自己信服的理由。以下仅为本人的看法,有不足之处,欢迎指正。
基础知识,我就不赘述了,简单说明以下,程序是完全基于原子哥的例程9调试的。即TIM3-通道2-输出PWM,定时器向上计数。解释一下我用的一些简写,
本文中PWM2,表示PWM模式2;PWM1,表示PWM模式1;PWM2(H),表示PWM模式2下的有效电平为高电平;同理:PWM1(L),表示PWM模式1的有效电平为低电平。
用图说话更为直观:
图一是工作与PWM模式2下,定时器向上计数,IO口输出的电平状态,即TIM3_CNT>TIM3_CCR2时,有效电平为高电平。开发板的LED是低电平点亮。程序开始运行后,led0pwmval(控制占空比)就从0--300--0这样一直变化,
即占空比一直发送变化,低电平的时间也随之发送变化。
图二是工作与PWM模式2下,定时器向上计数,有效电平为低电平。
这里假设一个LED亮度标准,在一个周期(899)内,当低电平的时间大于200,LED为高亮;当低电平的时间在200-100之间,LED处于中亮;当低电平的时间小于100时,LED处于低亮。
在PWM2(H)下,一个周期内,LED点亮的时间范围为t[0,300],因为led0pwmval发生变化。那么在一个周期(899)内,LED达到高亮的时间最多只有100个单位,处于中亮的时间最多
有100个单位,处于低亮的时间有100个单位。所以LED就有暗--亮---暗的变化。
在PWM2(L)下,一个周期内,LED点亮的时间范围为t[899-300,899]即,t[599,899],从而看出低电平最少的时间也是599,所以不管led0pwmval怎么变化,LED都处于高亮状态,
这也就是仅将PWM2改为PWM1后,LED处于长亮的原因。如果把led0pwmval的变化范围设的大一点呢,比如设为0到800,得低电平的时间在[99,899]之间变化,从中得以看出低电平
最少也占99,也没有让LED长时间处于低亮状态,当led0pwmval从0自加到599占用了周期很大一部分时间,这段时间,低电平的时间一直大于300,led0pwmval从599自加到800,低电平的时间也只能减到99。
所以在PWM2(L)下,即使调整占空比,也达不到在PWM2(H)的现象。
同理可以分析出PWM1(L)的时序图,与图一 一样,PWM1(H)的时序图与图二一样。所以在PWM2(H)和PWM1(L)这样的设置时,可以看到呼吸灯的效果。
|
|