目录
2.为什么通过改变输出方波的占空比就能直接对模拟电路进行控制?
一、什么是PWM?
PWM,是"Pluse Width Modulation"的简称,中文叫脉冲宽度调制,是一种微处理器通过数字输出直接(无需数模转换)对模拟电路进行控制的技术
二、PWM理解:
1.占空比的理解:在一个脉冲周期内高电平所占的比例
2.为什么通过改变输出方波的占空比就能直接对模拟电路进行控制?
我们知道单片机的IO口只能输出逻辑0和逻辑1,对应的电压就是0V和5V,按理来说我们只能对模拟电路输出0V和5V不能输出其他的电压,但在宏观上,我们可以把输出电压看成输出能量。在微观上,即在极小时间内改变输出5v所占时间,令单片机输出的能量与2.5V的能量相同,在宏观上,对应着输出电压就是2.5V。(该解释是从能量的角度看,如果要能准确的解释,需要经过极为复杂的数学计算与推导,不建议初学者了解)
3.通过控制LED灯实例来理解:(使用STC89C52)
(1)通过常识我们都知道,如果在灯两端施加的电压不同,那它的亮度也不同,这里我们规定脉冲周期为20ms,施加不同占空比的脉冲信号模拟不同的电压,可以自行写代码来实现施加不同占空比的脉冲信号控制灯的亮度
PWM控制灯亮度
以下是参考代码:
#include <reg52.h>
#include <intrins.h>
sbit PWM = P2^7; //设定PWM输出的I/O端口
sbit KEY1 = P2^0;
sbit KEY2 = P2^1;
sbit KEY3 = P2^2;
unsigned char count = 0;
unsigned char timer1 =0;
/*定时器T0初始化*/
void Timer0_Init()
{
unsigned char time;
TMOD = 0x02; //定时器T0设置成8位重装载
time = 92;
TH0 = 256-time; //定时常数 0.1ms 晶振为11.0592MHz
TL0 = TH0;
ET0 = 1;
TR0 = 1;
EA=1;
}
/*T0中断初始化*/
void Time0_Init() interrupt 1
{
if(count <= timer1 && count > 0)
{
PWM = 0;
}
else
{
PWM = 1;
}
count++;
if(count >= 200) //T = 20ms清零
{
count = 0;
}
}
void main()
{
Timer0_Init();
while(1)
{
if(!KEY1)
{
if(!KEY1)
{
timer1 =10;//占空比为5%
count=0;//让定时器重新计数
}
while(!KEY1);
}
if(!KEY2)
{
if(!KEY2)
{
timer1 =70;//占空比为35%
count=0;
}
while(!KEY2);
}
if(!KEY3)
{
if(!KEY3)
{
timer1 =200;//占空比为100%
count=0;
}
while(!KEY3);
}
}
}
(2)呼吸灯: 呼吸灯顾名思义,像呼吸一样,从亮度逐渐变强到亮度逐渐变弱
呼吸灯
输出的理想化波形:
以下是参考代码:
#include <reg52.h>
#include <intrins.h>
sbit PWM = P2^7; //设定PWM输出的I/O端口
unsigned char count = 0;
unsigned char timer1 =0;
char num = 5 ;
/*定时器T0初始化*/
void Timer0_Init()
{
unsigned char time;
TMOD = 0x02; //定时器T0设置成8位重装载
time = 92;
TH0 = 256-time; //定时常数 0.1ms 晶振为11.0592MHz
TL0 = TH0;
ET0 = 1;
TR0 = 1;
EA=1;
}
/*T0中断初始化*/
void Time0_Init() interrupt 1
{
if(count <= timer1 && count > 0)
{
PWM = 0;
}
else
{
PWM = 1;
}
count++;
if(count >= 200) //T = 20ms清零
{
count = 0;
timer1+=num;
if(timer1==200||timer1==0)
num=-num;
}
}
void main()
{
Timer0_Init();
while(1)
{
}
}