一、技术概念 PWM,中文名称为“脉冲宽度调制”,该技术是用于在数字电路对模拟电路的控制。在数字电路中,只存在0和1信号,即“电压为0V”和“电压为5V”,而在模拟电路中,不同的电压值会对器件的工作状态会有不同的效果。例如:一颗LED的工作电压为1.7V-3.6V不等,不同的电压值,影响着LED的亮度。那么如何通过数字电路的“0”、“1”来控制LED两端出现不同的电压? 二、技术原理 在日常时候中,我们用的生活电压为220V,这个是用直流电压表测试的。如果用交流电压,那么示数会在±340V之间振荡。因为220V是其有效值,±340V是其峰峰值。如果单片机的I/O口也会输出一个从“5V”到“0V”的振荡信号,会不会也在I/O口存在一个“0”到“5V”之间的有效值。 既然是一个振荡的信号,那么就要考虑两个指标:“周期/频率”、“高电平的持续时间/低电平的持续时间”。 频率一定大,既周期时间要短,因为LED有余晖作用,在短时间内电压为0时,灯光并不会立刻消失。我们假设频率为100Hz,也就是说1S之内有100个波形(1个高电平和1个低电平为一个波形)。T=0.01s 先设置高电平持续时间为0.005s,占周期的50%=(0.005/0.01)×100%,而这个50%被称为PWM的占空比。 那么我们可以根据这些数据通过公式来推出其等效的直流电压(直流电压表的示数),是计算其有效值还是其平均值? 是有效值,因为交流电的有效值在相同时间内消耗的能量是一样的,公式推导如下: ※U是有效值,u(t)是交流电的对t的函数,T为周期 平均值:仅仅是电压在时间上的平均值,是不能等效成元件两端的电压。
通过公式计算出占空比50%时,其有效值为U=2.5*1.414=3.54V
不同的占空比,对应着不同的有效值:
三,流程图 从原理可以得知一个51系列的单片机通过控制I/O口的输出信号的占空比就可以控制LED的亮度。 那么我们设定4种占空比(10%、30%、50%、90%)的情况,并且通过摁键可以互相改变。 信号的周期可以通过单片机的定时器来控制,一个周期为0.01s=10ms,当定时器工作在方式1,单片机晶振为12MHz时,一次定时器中断最大时间为65.536ms。我们设定一次定时器中断时间为100μs,这样一个波形的周期需要经过100次的定时器中断,设置一个变量count,用来判断是否到达100,从而重新开始一个周期。 可以先设置I/O口的初始为高电平,定义一个标志变量FLAG,FLAG的作用是用来和count做比较从而单片机判断是否达到了占空比的要求,例如,占空比设定为50%,当count=50的时候,将高电平变为低电平,就会出现占空比为50%的波形。 四、单片机代码
- #include "reg52.h"
- sbit L=P2^0;
- sbit K=P3^0;
- unsigned int count=0,FLAG=0,stat;
- void DELAY(int t)
- {
- while(t--);
- }
- void init_T0(void)
- {
- EA=1;
- ET0=1;
- IP=0x02;
- TMOD=0x01;
- TL0=(65535-100)%256;
- TH0=(65535-100)/256;
- TR0=1;
- }
- void scan_key(void)
- {
- if(K==0)
- {
- DELAY(10);
- if(K==0)
- {
- switch(stat)
- {
- case 0:
- TR0 = 1;
- L = 0;
- FLAG = 10;
- stat = 1;
- break;
- case 1:
- FLAG = 50;
- stat = 2;
- break;
- case 2:
- FLAG = 90;
- stat = 3;
- break;
- case 3:
- L= 1;
- TR0 = 0;
- stat = 0;
- break;
- }
- while (K==0);
- }
- }
- }
- void main()
- {
- init_T0();
- L=1;
- while(1)
- {
- scan_key();
- }
- }
- void timer0() interrupt 1
- {
- TL0=(65535-100)%256;
- TH0=(65535-100)/256;
-
- if(count==FLAG)
- {
- L=1;
- }
- count++;
- if(count==100)
- { count=0;
- if(FLAG==0)
- L=1;
- else
- L=0;
- }
- }
复制代码
|