对PWM简单理解(佛科院——深夜学习)

本文介绍了PWM(脉冲宽度调制)的基本概念及其工作原理,并通过控制LED灯亮度和实现呼吸灯效果两个实例详细阐述了如何利用PWM技术进行模拟信号控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、什么是PWM?

二、PWM理解:

1.占空比的理解:在一个脉冲周期内高电平所占的比例

2.为什么通过改变输出方波的占空比就能直接对模拟电路进行控制?

3.通过控制LED灯实例来理解:(使用STC89C52)


一、什么是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)
	{
		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值