PWM即为“脉冲宽度调制”
脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中
使用定时器0做为PWM波的一个周期,然后改变一个周期的高电平和低电平时间,高低电平时间加起来就是一个周期,周期一旦固定好是恒定不变的,改变脉宽宽度(占空比)
GPIO初始化,单片机系统时钟为11.0592MHZ
#include <STC8G.h>
//系统时钟为11.0592MHZ
#define DOW P32
#define UP P33
#define PWM P54
//引脚初始化
void GPIO_Init(void)
{
P3M0 &= ~(1<<2);
P3M1 &= ~(1<<2);
P3M0 &= ~(1<<3);
P3M1 &= ~(1<<3);
P5M0 |= 1<<4;
P5M1 &= ~(1<<4);
}
定时器0初始化函数,定时器时间为10us中断一次,中断100次则1ms,即周期是1KHZ
//定时器0初始化
void Time0_Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x00; //配置定时器0为16位自动重装模式
// TH0 = 0xFC; //1ms
// TL0 = 0x66;
TH0 = 0xFF; //10us
TL0 = 0xF7;
TR0 = 1; //定时器0运行使能
ET0 = 1; //使能定时器0中断
EA = 1; //开启总中断
}
按键调节占空比需要定义一个变量,占空比上电默认为10%
//PWM占空比调整
unsigned char Dut=10;
按键调整占空比函数
//PWM占空比调节按键扫描函数
void Key_Scan(void)
{
static bit Keyup_Flag=1,Keydow_Flag=1;
if(UP != Keyup_Flag)
{
if(Keyup_Flag == 0)
{
Dut += 5; //按键按下每次增加5
if(Dut >= 100)
Dut = 100;
}
Keyup_Flag = UP;
}
if(DOW != Keydow_Flag)
{
if(Keydow_Flag == 0)
{
if(Dut != 10)
Dut -= 5; //按键按下每次减少5
}
Keydow_Flag = DOW;
}
}
已下是定时器0中断函数,即PWM输出
void main(void)
{
GPIO_Init(); //引脚配置初始化
Time0_Init(); //定时器0初始化
while(1)
{
Key_Scan();
}
}
//定时器0中断服务函数
void Time0_ISR(void) interrupt 1
{
static unsigned char PWM_CNT=0;
static bit PWM_Out=0; //此变量为在Debug中使用,在实际中是不需要的
PWM_CNT++;
if(PWM_CNT > Dut)
{
PWM = 0;
PWM_Out = 0;
}
else
{
PWM = 1;
PWM_Out = 1;
}
if(PWM_CNT >= 100)
PWM_CNT = 0;
}
keil仿真输出波形图
占空比:10%
占空比:50%
占空比:95%
压缩文件下载链接:https://download.csdn.net/download/qq_43265868/86339425?spm=1001.2014.3001.5501