打印

请大家讲讲PWM的实质

[复制链接]
3856|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gdmgb520|  楼主 | 2010-5-2 08:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gdmgb520 于 2010-6-5 13:22 编辑

如题,我最近用PWM实现了LED背光板的渐亮渐灭,我在百度上看了一些资料,但是感觉对PWM的实质还是不
太清楚。所以想请大家讲一讲PWM的实质。
首先,我先讲一下我对PWM的认识。
PWM就是用微处理器的数字输出来控制模拟电路。这样做的好处就在于可以用数字信号直接控制模拟器件而不
需要数模转换,同时也增强了信号的抗干扰性,并且能降低成本。
我现在已经通过采用在51的I/O口输出占空比逐渐变化的方波实现了背光板的渐亮渐暗。见贴:https://bbs.21ic.com/viewthread.php?tid=143932&highlight=%2Bgdmgb520

再看一下下面的这个图



用这个图片说明他的原理就很清晰,我的 定时器是0.1ms中断,然后每一百个中断占空比(ZKB1)发生一次改变,占空比从0变到99,再从99变到0.
那么我的调制频率应该是1s/(0.1ms*100)=100Hz,是这样吗?我的背光板灰度等级分为了100级对吗?


我之前虽然实现了想要的效果,但是没有具体搞清楚理论。后果很严重啊。呵呵。


望大家抽出宝贵的时间帮我讲一讲PWM的实质。

相关帖子

沙发
tyw| | 2010-5-2 09:32 | 只看该作者
本帖最后由 tyw 于 2010-5-2 09:42 编辑

1分钟打一记pp和1分钟打100记pp,哪种痛,哪种特勃瘤大鸭?
哈哈,这就是ppwme→简称PWM的实质!

去看书吧
〓◆ PWM脉宽调速相关资料 9册 198M ◆〓
〓◆ 单片机典型模块设计实例导航 106.8M 超清晰 书签版 ◆〓
〓◆ 电动机的单片机控制 269页 10.9M ◆〓

使用特权

评论回复
评分
参与人数 1威望 +5 收起 理由
谈的元 + 5
板凳
HWM| | 2010-5-2 09:37 | 只看该作者
本帖最后由 HWM 于 2010-5-2 10:07 编辑

PWM是利用饱和和截止这样的开关特性来实现“模拟”量的调制,如此可以尽量避免器件在这两极端状态外的停留时间,以减少由于器件的功耗而降低效率。但由于这样的调制方式内含丰富的谐波成分,因此若要将其转换成“光滑”的线性量输出,还必须加上适当的滤波环节。

由于PWM是利用“时间”来度量模拟量,因此可以避免采用其他物理量(如电压或电流)因器件的非线性误差而造成的失真。但由于PWM是一种牺牲时间换得空间的方法,所以在时间反映上会显得迟钝一些。

使用特权

评论回复
地板
maychang| | 2010-5-2 10:04 | 只看该作者
调制频率是0.5Hz。
0.1ms一次中断,每100次中断改变一次占空比,占空比从0到99又从99到0,共变化200次。
那么这样变化的周期是0.1ms*100*200=2000ms=2s,所以频率是0.5Hz。
灰度倒确实是分了100级。

使用特权

评论回复
5
爱上你的笑| | 2010-5-2 10:57 | 只看该作者
谢谢楼主分享。我终于知道了PWM。

使用特权

评论回复
6
宋业科| | 2010-5-2 12:20 | 只看该作者
调制频率是循环计数器的频率。再学习。

使用特权

评论回复
7
宋业科| | 2010-5-2 12:21 | 只看该作者
1s/(0.1ms*100)=100Hz是背光板的渐亮渐暗的频率。

使用特权

评论回复
8
gdmgb520|  楼主 | 2010-5-2 15:36 | 只看该作者
谢谢大家!
4# 6# 7#

我是这样理解调制频率的:
我认为调制频率等于输出脉冲波的周期的倒数。
那我输出的脉冲波的周期是多少呢?我认为为是0.1ms*100=10ms。因为输出一个占空比为10的脉冲需要10ms,输出任何一个脉冲都要10ms。所以调制频率应该是100Hz才对吧?

使用特权

评论回复
9
gdmgb520|  楼主 | 2010-5-2 16:14 | 只看该作者
本帖最后由 gdmgb520 于 2010-6-5 13:21 编辑

看这个图,调制频率是100Hz吧?


不知道为什么图片搞不大,大家点一下看连接的大图,我上传到论坛老说无效的图片文件。

使用特权

评论回复
10
fm007| | 2010-5-2 18:13 | 只看该作者
PWM频率是100Hz
不是调制频率~

使用特权

评论回复
11
gdmgb520|  楼主 | 2010-5-2 22:28 | 只看该作者
PWM频率是100Hz
不是调制频率~
fm007 发表于 2010-5-2 18:13


那请问PWM频率和调制频率是什么关系呢?

使用特权

评论回复
12
gdmgb520|  楼主 | 2010-5-4 15:09 | 只看该作者
做个总结吧。

我这几天又看了些PWM脉宽调制的资料,都是网上找的。其实PWM的资料很多,都是电力电子相关的。
下面讲讲我对PWM的认识:
-----------------------------------------------------------------------------------
PWM的实质:是用微处理器的数字I/O口输出宽度可调的脉冲波,来控制模拟电路,也就是说用数字量控制模拟电路,或者说把数字量转换为模拟量、把直流量转换为交流量(DC/AC,电力电子)。
PWM的理论基础:面积相等原理,即面积相等而形状不同的窄脉冲作用在有惯性的环节上,表现出来的作用是一样的(也就是输出是一样的)。
至于我上面的例子中的调制频率的问题我还是不清楚。暂时按楼上几位兄弟的说法理解。即,调制频率为循环计数器的频率1s/0.1ms=10KHz,输出PWM波的频率是100Hz。
------------------------------------------------------------------------------------------
如果哪位路过的前辈发现我上面的说法是错误的,千万要帮忙指出来。一则帮我了我,二则免得误导了其他新人。

最后,再次感谢大家!

使用特权

评论回复
13
maychang| | 2010-5-4 15:40 | 只看该作者
我的 定时器是0.1ms中断,然后每一百个中断占空比(ZKB1)发生一次改变,占空比从0变到99,再从99变到0.
注意你的调制波并非三角波,而是外廓(包络)近似三角波的阶梯波。三角波的频率与阶梯的频率并不相同,与PWM频率也不相同。
三角波的周期是2秒,阶梯的频率不是。

使用特权

评论回复
14
gdmgb520|  楼主 | 2010-5-4 21:33 | 只看该作者
maychang前辈,
我输出的脉冲列周期是0.1ms*100=10ms啊,频率就是100Hz才对吧。
能不能QQ,我很想搞明白这个问题,每天老是想在心中。
我看了你的资料,没有QQ啊。我QQ479231201能不能加我,我们QQ上说一下。

使用特权

评论回复
15
achao3300| | 2010-5-4 22:55 | 只看该作者
学习了

使用特权

评论回复
16
buqibushe| | 2010-5-10 08:54 | 只看该作者
控制亮灭的原理很简单:决定LED亮度是由电流的平均值决定的,PWM占空比越大,平均值越大,亮度越高,反之亦然
有很多TFT液晶模组的背光也是用PWM来控制的

使用特权

评论回复
17
gdmgb520|  楼主 | 2010-5-10 09:44 | 只看该作者
恩,是的。
也谢谢楼上!

使用特权

评论回复
18
qzhui121| | 2010-5-10 11:17 | 只看该作者
谢谢,不是很了解,路过学习的

使用特权

评论回复
19
六安瓜片| | 2010-6-2 12:53 | 只看该作者
lz有代码吗

使用特权

评论回复
20
gdmgb520|  楼主 | 2010-6-5 13:19 | 只看该作者
代码在这个帖子里有:https://bbs.21ic.com/viewthread.php?tid=143932&amp;highlight=%2Bgdmgb520 再贴一个 /***************************************************************************** 硬件说明: AT89S52,晶振11.0592MHz。P3.6为一个LED背光板,等于0时发光。 P0.0为一个按键,按下时为0。 *****************************************************************************/ /****************************************************************************** 程序思路说明: LED背光板的渐亮渐灭实际上就是LED的亮度等级由低到高(渐亮)再由高到低(渐灭)的过程,那么首先要通过PWM脉宽调制实现LED显示不同的亮度等级。(脉宽调制的基本原理可以参考http://hi.baidu.com/gdmgb520/blo ... 0d1a047bec2cb7.html)怎么实现不同的亮度等级呢?假设在某个长度的周期(一个适当的时间长度)内如果LED 的管脚一直输出0(我这里输出0时LED背光板点亮),那么很显然LED肯定是最亮的;相反如果一直输出1,那LED肯定是最暗的(也就是不亮)。如果在这个周期内管脚输出的是脉冲波(10101010……)那么LED的亮度就只有最亮时的一半,或者说如果前一半时间是高电平后一半时间是低电平,那LED的亮度也是最亮的一半,这是由于LED的余晖效应,但这个时间必须恰当,不然LED就不是亮而是闪烁。下面这段代码即可实现LED显示在某个亮度等级: void timer0(void) interrupt 1 using 2 { static uchar counter=0; //中断次数计数器变量 TH0=V_TH0; //恢复定时器初始值 TL0=V_TL0; counter++; if (counter<=(ZKB1)) //当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整 {LED3=0;} else {LED3=1;} if (counter==100) {counter=0;} } 那么现在我们就可以依次变换LED的亮度等级,从而实现LED的渐亮渐灭了。若上面的定时器中断是0.1ms触发一次、ZKB1=20,那么整个周期为0.1ms*100=10ms,LED3为低脉冲的时间长度为20*0.1ms=2ms,显示亮度为最亮的20%。如果我们把100个不同的亮度等级挨个显示一遍就出现了由暗到亮的渐亮过程或渐灭过程。那么我们就在每当counter==100的时候, ZKB1++就行了(由暗到亮)。上面的程序第24行{}内加入ZKB1++;,并在第25行加入 if (ZKB1==100) ZKB1=0; 语句即可。这样看到的效果是LED由暗变亮然后又有暗变亮。现在我们再加入由亮变暗。新增一个变量ZKB2,counter==100时ZKB2++,当ZKB2<=100 时ZKB1=ZKB2,实现有暗变亮;当100<ZKB2<=200时ZKB1=200-ZKB2,实现由亮变暗;当 <reg52.h #include ****************************************************************************** x |____________________ * |* | y 这样整个过程就是LED3渐亮—渐灭—熄灭,然后重复。 ZKB2从100到199时LED3渐灭(ZKB1从99回到0),当ZKB2从200到399时LED3熄灭(ZKB1="0)," X轴(时间),而ZKB1相当于Y轴(亮度)。ZKB2从0到99时LED3渐亮(ZKB1从0到99),当 2、ZKB2的值决定了现在应该选择哪个亮度等级(ZKB2的值为0—399),实际上ZKB2相当于 1、ZKB1决定了LED3应该显示多亮(ZKB1的值为0—99,即把亮度分为100个等级) 2010.4.30,对上面的这段话再做一次解释: 这里我还加了一个flag0变量,作用是当K0按下时使LED停止发光。 么渐亮耗时1s,渐灭耗时1s,熄灭保持2s,然后开始下一个周期。 200<ZKB2 #define uchar unsigned char #define V_TH0 0xff //定时器0初值,0.1ms中断 #define V_TL0 0xa3 sbit LED3=P1^1; ///背光片接口 sbit K0=P0^0; unsigned char ZKB1,ZKB2; bit flag0; /*-------------------------定时器初始化-----------------------------------*/ void init_sys(void) { TMOD=0x01; //定时器0工作在方式1 TH0=V_TH0; //定时周期为0.1ms TL0=V_TL0; TR0=1; ET0=1; EA=1; } /*-----------------------定时器0中断函数---------------------------------*/ void timer0(void) interrupt 1 using 2 { static uchar counter=0; //中断次数计数器变量 TH0=V_TH0; //恢复定时器初始值 TL0=V_TL0; if (flag0==1) { counter++; if (counter>=100) { counter=0; ZKB2++; if (ZKB2<=100) //占空比变化部分 { ZKB1=ZKB2;} else if (ZKB2<=200) { ZKB1=200-ZKB2;} else { ZKB1=0;} } if (counter<=(ZKB1)) //当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整 // LED3=0; P1=0x00; else // LED3=1; P1=0xff; if (ZKB2>399) ZKB2=1; } else { // LED3=1; P1=0xff; } } /*------------------------------主函数-------------------------------------*/ void main (void) { init_sys(); while(1) { // P0=0xff; // flag0=K0; flag0=1; } } /*************************************************************************** 小结:这里定时器的定时长度需要根据具体情况作出适当调节 ****************************************************************************/

PWMLED.rar (17.97 KB)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:了解新东西才知道自己的不足。 www.elecbench.com

67

主题

452

帖子

1

粉丝