1.PWM:脉冲宽度调制,它是通过一系列脉冲宽度进行调制,等效出所需要的波形(包含形状以及幅值)。对模拟信号电平进行数字编码。也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比。例如方波的占空比就是50%.
占空比简单来说:一个周期内,高电平占据时长的百分比。
2.场景举例:手机信号灯,呼吸机警报灯。
3.代码例子:(控制PWM占空比,来控制sg90舵机的转动角度)
#include "reg52.h"
#include<intrins.h>
int cnt = 0; //cnt要定为全局变量
sbit sg90_con =P1^1; //定义sg90的管脚
int jiaodu; //定义一个舵机转动的角度
void Time0Init()
{
//1.配置定时器0工作模式位16位计时
TMOD = 0x01;
//2.给初值,定一个10ms出来
TL0 = 0x33; //设置定时初值
TH0 = 0xFE; //设置定时初值
//3.开始计时
TR0 = 1;
TF0 = 0;
//4.打开定时器中断
ET0 = 1;
//5.打开总中断EA
EA = 1;
}void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;//_nop_(); //这个地方报错,是因为缺少一个头文件:#include<intrins.h> 添加即可,不添加可以把_nop_();注释掉,用到再添加
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;_nop_();
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
Delay300ms();//让硬件稳定一下
Time0Init();//初始化定时器
jiaodu = 1;//初始化角度0度,0.5ms,高电平
cnt = 0;
sg90_con = 1;//一开始从高电平开始
//每个两秒,切换一下角度
while(1){
jiaodu = 3;//90度
cnt = 0;
Delay2000ms();
jiaodu = 1;//0度
cnt = 0;
Delay2000ms();
}
}//封装一个中断函数
void Time0Handler() interrupt 1
{
cnt++;//统计爆表次数,cnt等于1的时候,爆表了一次
//重新给初值
TL0 = 0x33;
TH0 = 0xFE;
sg90_con = 1;
//控制PWM波
if(cnt < jiaodu){ //cnt 决定舵机转动的角度
sg90_con = 1;
}else{
sg90_con = 0;
}
if(cnt == 40){//cnt爆表了40次,经过了20ms
cnt = 0;//当经过了20ms,重新让cnt从0开始,计算下一次的20ms.
}}
4.舵机图: