作者:Whappy(菜的扣脚)
脉冲宽度调制(Pulse Width Modulation,PWM)是一种通过调节信号的占空比来控制功率输出的技术。它主要通过改变脉冲信号的高电平持续时间相对于低电平的时间来调节功率传递给负载的量。PWM 技术可以实现以下功能:
1. 电机速度控制
- 直流电机调速:通过改变PWM信号的占空比,可以控制电机的输入电压,进而控制电机的转速。占空比越高,电机转速越快;占空比越低,转速越慢。
- 步进电机控制:PWM 也可以用于精确控制步进电机的速度和方向。
2. 灯光亮度调节
- LED亮度调节:通过改变PWM信号占空比,调节LED灯的平均电流,从而控制LED的亮度。占空比越高,亮度越高;占空比越低,亮度越低。
3. 音频信号产生
- 声音输出:PWM可以用来生成音频信号。例如,PWM可以用于音频合成,生成不同频率的方波信号,通过扬声器产生不同音调的声音。
- 音量控制:通过调节PWM信号的占空比,可以控制音频信号的强度,从而调节声音的音量。
4. 加热器功率控制
- 加热元件控制:通过调节加热器的PWM信号占空比,可以控制传递给加热器的能量,从而调节温度。
5. 开关电源的调节
- DC-DC 转换器:PWM广泛应用于开关模式电源(如DC-DC转换器),通过调节占空比来控制输出电压。
- 逆变器和整流器:在电源中,PWM用于逆变和整流,以实现高效的电能传输和转换。
6. 无线通信调制
- 数据传输调制:在某些无线通信系统中,PWM可以用于调制数据,例如红外通信中的信号编码。
7. 伺服系统控制
- 位置控制:在伺服电机控制中,PWM信号用于精确控制伺服电机的角度位置。PWM信号的脉冲宽度决定伺服电机的旋转角度。
8. 电池充电控制
- 充电控制器:PWM用于控制电池的充电过程,调节电流和电压,防止电池过度充电,并延长电池寿命。
9. 信号生成与调制
- 信号生成:通过调整PWM信号的占空比和频率,PWM可以用于产生不同频率和波形的信号,如方波、锯齿波等。
- 模拟信号生成:PWM可以通过低通滤波器生成模拟电压,用于数模转换。
10. 机器人控制
- 机器人运动控制:PWM常用于机器人的电机速度控制、舵机控制等,确保机器人运动的精准和稳定。
H桥驱动可以控制电机的正反转。电机是一个感性元件,带有电感效应,在用mos管和三级管驱动时,要加上一个耳机管保护电路。
现象:
51单片机!定时器实现PWM呼吸灯&直流电机调速
1.呼吸灯-延时实现(控制占空比)软件模拟PWM实现(通过控制一个周期内高电平所持续的时间:即高电平持续时间越久,亮度持续的就越久)
#include <REGX52.H>
#include "intrins.h"
#define LED P2
void Delay(unsigned int xms) //@11.0592MHz
{
while(xms--);
}
void main(void)
{
unsigned char Time,i;
while(1)
{
for(Time=0; Time<100; Time++)
{
for(i=0; i<20; i++)
{
LED = 0X00;
Delay(Time);
LED = 0XFF;
Delay(100-Time);
}
}
for(Time=100; Time>0; Time--)
{
for(i=0; i<20; i++)
{
LED = 0X00;
Delay(Time);
LED = 0XFF;
Delay(100-Time);
}
}
}
}
2.呼吸灯(定时器实现)(控制占空比):
#include <REGX52.H>
/****配置LED****/
sbit LED = P2^0;
bit Direct_flag = 0; //LED的呼吸方向的开关
/****函数声明****/
void T0init();
/****全局变量****/
unsigned int PWM_wanttime=0; //想要多长时间改变的占空比一次
unsigned int Breath_wanttime=0; //想要多长时间改变呼气或者吸气的值时间
unsigned int PWM_value = 0; //占空比的大小
void main()
{
T0init();
while(1)
{
}
}
/*********************************************************
* 函数说明 :1ms定时
* 入口参数 :void
* 返回值 :void
*********************************************************/
void T0init()
{
TMOD |= 0x01; //设置定时器为工作方式1
TH0=0XFC; //1ms定时,装入初值
TL0=0X66;
ET0 = 1; //开定时器的中断
TR0 = 1; //开定时器
EA = 1; //开总中断
}
void Time0(void) interrupt 1
{
TH0=0XFC; //1ms定时,装入初值
TL0=0X66;
PWM_wanttime++; //改变的占空比一次的标志
Breath_wanttime++; //呼气或者吸气的时间改变的标志
if(PWM_wanttime == PWM_value) //判断是否到了点亮LED的时候
LED = 0; //点亮LED
if(PWM_wanttime == 10) //当前周期结束
{
LED = 1; //熄灭LED
PWM_wanttime = 0; //重新计时,去改变占空比
}
if((Breath_wanttime == 200) && (Direct_flag == 0)) //200ms 改一次占空比,占空比每次增加10%
{
Breath_wanttime = 0;
PWM_value++; //改变占空比的值
if(PWM_value == 9) //占空比更改方向
Direct_flag = 1;
}
if((Breath_wanttime == 200) && (Direct_flag == 1)) //200ms 改一次占空比,占空比每次减少10%
{
Breath_wanttime = 0;
PWM_value--; //改变占空比的值
if(PWM_value == 1) //占空比更改方向
Direct_flag = 0;
}
}
3.直流电机(定时器实现)(控制占空比):(其余代码模块在主页其他实验通用-用16位重装值,初始值设置100us)
#include <REGX52.H>
#include "Nixie.h"
#include "Timer.h"
#include "Key.h"
#include "Delay.h"
sbit Motor = P1^0;
unsigned char Counter,Compare;
unsigned char KeyNum,Speed;
void main(void)
{
Timer0_Init();
Compare = 50;
while(1)
{
KeyNum = Key();
if(KeyNum == 1)
{
Speed++;
Speed %= 7;
if(Speed == 0) {Compare=0;}
if(Speed == 1) {Compare=40;}
if(Speed == 2) {Compare=50;}
if(Speed == 3) {Compare=60;}
if(Speed == 4) {Compare=70;}
if(Speed == 5) {Compare=80;}
if(Speed == 9) {Compare=90;}
if(Speed == 10 ) {Compare=100;}
}
Nixie(1,Speed);
}
}
void Timer0_Rountine(void) interrupt 1
{
static unsigned int T0Count ; //Timer0_Rountine(void) 函数结束之后T0Count保留其原来的值
TL0 = 0xA4; //设置定时初值
TH0 = 0xFF;
Counter++;
Counter %= 100;
if(Counter < Compare)
{
Motor = 1;
}
else
{
Motor = 0;
}
}
本实验到此!就告一段路了,因此,我来进行总结一下,PWM说白了,就是控制占空比的大小来控制高电平持续的时间,简单的说也就是控制PWM模拟我们的模拟电信号的变化!在这里可通过延时函数或定时器来实验PWM的调制,就是改变占空比。
原理很简单!但是PWM有一个算法很好用!自己查(控制算法)
PWM原理 PWM频率与占空比详解-CSDN博客(可参考PWM)