1.什么是PWM

2.频率和占空比

3.怎么用单片机产生PWM波

4.PWM的应用

一:什么是PWM

脉宽调制技术,全称为脉冲宽度调制,英文名称为Pulse Width Modulation,简写为PWM,是一种利用微处理器来完成对模拟电路控制的一种技术,其具有操作简单、灵活性好、反应速度快等诸多特点,现已在通信、测量、功率变换、功率控制等多个方面都得到了广泛的应用

原理:

脉宽调制技术是通过对逆变电路开关的通断控制来实现对模拟电路的控制的。脉宽调制技术的输出波形是一系列大小相等的脉冲,用于替代所需要的波形,以正弦波为例,也就是使这一系列脉冲的等值电压为正弦波,并且输出脉冲尽量平滑且具有较少的低次谐波。根据不同的需求,可以对各脉冲的宽度进行相应的调整,以改变输出电压或输出频率等值,进而达到对模拟电路的控制

二:频率和占空比

  • 频率:物质在1秒内完成周期性变化的次数叫做频率
  • 单位:HZ
  • 单位换算:1kHz=1000Hz,1MHz=1000000Hz 1GHz=1000MHz
    周期:频率的倒数
  • 占空比:是指在一个脉冲循环内,通电时间相对于总时间所占的比例

python pwm模块 pwm modulator_c++

如图:一个周期内高电平所占的比就是占空比

三:单片机怎么产生PWM调制

对于51单片机而言,用定时器来产生pwm


思路如下:我们知道单片机的时钟脉冲,那怎么利用PWM呢,其实就是通过定时器来改变一个周期内高低电平的占空比来实现PWM的调制.例如我们把电平置为高电平持续1ms,然后然低电平持续3毫秒,这样就能产生一个周期为4毫秒的占空比为25%的PWM波了.单片机的晶振是11.092MHZ方便计算取12MHZ.那么他的时钟周期就是1/12us,机器周期就是1us. 那么如何用定时器怎么来产生.对于定时器0来说定时器是16位的寄存器,来一个脉冲加一,加到65535时就会溢出.所以定时器0从0开始计数到65535,一个微妙就记一次数.那么要溢出则需要65535us.


举个例子:
我们要产生一个100HZ的PWM且占空比25%,用定时器怎么完成.
首先100HZ的周期是10ms.也就是持续一个周期的时间是10ms,那么占空比25%就让高电平持续2.5个ms,低电平持续7.5个ms
我们让定时器0产生10ms需要计数10000,因为定时器每计数一次是1us,那么10000次就是10ms,我们把这10000分成100分,就相当与把一个脉冲周期分成100分而占空比25%即高电平占了25份,低电平就占了75份.
那么定时器就要每100us就要中断一下那么中断要装的初值就是TH0=(65535-100)/256,TL0=(65535-100)%256.然后在中断里面设置一个变量在这个变量在0到25期间是高电平否则是低电平就可以实现题目要求.

4:pwm的应用

通过按键改变小灯的亮度

呼吸灯

电机调速

这里先介绍以下第一个:

python pwm模块 pwm modulator_#define_02

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit L1=P0^0;
sbit S7=P3^0;
uchar aa=0;pwm=0;cont=0;
void delay(uint tt)
{
	while(tt--);
}
void HC_138()
{
	P2=(P2&0X1F)|0X80;
}
void scankey()
{
	if(S7==0)
	{
		delay(100);
		if(S7==0)
		{
			switch(cont)
			{
				case 0: L1=0; TR0=1;pwm=10; cont=1;break;
				case 1: pwm=50; cont=2;break;
				case 2: pwm=90; cont=3;break;
				case 3: L1=1;TR0=0;cont=0;break;
			}
		  while(S7==0);
		}
	}
}
void INIT_t0()
{
	TMOD=0X01;
	TH0=(65535-100)/256;
	TL0=(65535-100)%256;
	ET0=1;
	EA=1;		
}
void servicet0() interrupt 1
{
	TH0=(65535-100)/256;
	TL0=(65535-100)%256;
	aa++;
	if(aa==pwm)
	{
		L1=1;
	}
	else if(aa==100)
	{
		L1=0;
		aa=0;
	}

}
void init()
{
	P2=(P2&0X1F)|0Xa0;
	P0=0x00;
}
void main()
{
	init();
	HC_138();
	P0=0XFF;
	INIT_t0();
	while(1)
	{
	  scankey();
	}
}