PWM脉宽调制
PWM(Pluse Width Modulation)简称脉宽调制,是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。
PWM频率:指在1s钟内,信号从高电平到低电平再回到高电平的次数,单位Hz
PWM周期:T = 1/f
占空比:指一个脉冲周期内,高电平的时间与整个周期时间的比例,单位%
例如可以通过改变占空比来实现对灯光强度的控制。
代码(通过按键改变LED灯的亮度)
key.c
#include <sys.h>
uchar stat = 0;
void KeyScans()
{
if(s4 == 0)
{
Delay(10);
if(s4 == 0)
{
switch(stat)
{
case 0: Work_Led(0x00); TR0 = 1; pwm_duty = 10; stat = 1; break;
case 1: pwm_duty = 20; stat = 2; break;
case 2: pwm_duty = 30; stat = 3; break;
case 3: pwm_duty = 40; stat = 4; break;
case 4: pwm_duty = 50; stat = 5; break;
case 5: pwm_duty = 60; stat = 6; break;
case 6: pwm_duty = 70; stat = 7; break;
case 7: pwm_duty = 80; stat = 8; break;
case 8: pwm_duty = 90; stat = 9; break;
case 9: pwm_duty = 100; stat = 10; break;
case 10: Work_Led(0xff); TR0 = 0; stat = 0; break;
}
}
while(s4 == 0);
}
}
main.c
//PWM脉宽信号的频率为100HZ
#include <sys.h>
void InitTimer0();
uchar count = 0,pwm_duty;//占空比
void main()
{
Init_System();
InitTimer0();
Work_Led(0xff);
while(1)
{
KeyScans();
}
}
void InitTimer0()
{
TMOD = 0X01;
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
ET0 = 1;
EA = 1;
}
void ServiceTimer0() interrupt 1
{
TH0 = (65535 - 100) / 256;
TL0 = (65535 - 100) % 256;
count++;
if(count <= pwm_duty)
{
Work_Led(0x00);
}
if(count < 100 && count > pwm_duty)
{
Work_Led(0xff);
}
if(count == 100)
{
Work_Led(0x00);
count = 0;
}
}
sys.c
#include <sys.h>
void Select_74HC138(uchar channel)
{
switch(channel)
{
case 0: P2 = P2 | 0X1F; break;
case 4: P2 = (P2 | 0X1F) & 0X80; break;
case 5: P2 = (P2 | 0X1F) & 0XA0; break;
case 6: P2 = (P2 | 0X1F) & 0XC0; break;
case 7: P2 = (P2 | 0X1F) & 0XE0; break;
}
}
void Init_System()
{
Select_74HC138(4);
P0 = 0XFF;
Select_74HC138(5);
P0 = 0X00;
Select_74HC138(6);
P0 = 0XFF;
Select_74HC138(0);
}
void Delay(uint ms)
{
uint i;
for(ms; ms > 0; ms--)
for(i = 921; i > 0; i--);
}
void Work_Led(uchar dat)
{
Select_74HC138(4);
P0 = dat;
Select_74HC138(0);
}
sys.h
#ifndef _SYS_H_
#define _SYS_H_
#include <STC15F2K60S2.H>
#include <intrins.h>
sbit s4 = P3^3;
#define uchar unsigned char
#define uint unsigned int
extern unsigned char pwm_duty;
//sys.c
void Select_74HC138(unsigned char channel);
void Init_System();
void Delay(unsigned int ms);
void Work_Led(unsigned char dat);
//key.c
void KeyScans();
#endif