今天,开始我的第一篇博客,学51单片机已经有一段时间了,本篇主要介绍PWM的调试。 本节内容,主要利用舵机来实现PWM 的调试,帮助更多初学者来学
习。 舵机的使用,我作为初学者,学51的时候使用的舵机为SG90: 下面是图片:
这款舵机有三条引线,分别为:电源线,GND , 电位控制线;所以,我们只需要将它接在单片机上即可使用,在使用中,我们需要明白舵机的使用原理,舵机是通过控制线上的PWM信号来调整不同的位置。
PWM(paulse Width Modulation) ,即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调试,来等效地获得所需要的模拟参量,常应用于电机调速,开关电源等领域。 PWM的重要的参数:(Ts为完成一个过程的周期,Ton为开启高电平的时间) 频率 = 1/Ts 占空比 = Ton/Ts 精度 = 占空比变化步距 下面是我们常用舵机调试的占空比: 根据图表,我们可以知道,舵机的一个高低电平周期为20ms,在这期间,我们可以在这期间随意的调试占空比,让舵机转动到任意一个我们想要的角度,这里我只提供了图片上的几个角度,如果想尝试其他角度,可以自己尝试来调试一下;这里我尝试用延时来调试舵机的占空比,代码是完整的,如果大家觉得合适,可以直接拿来学习和使用;大家也可以尝试通过定时器来做PWM的调试原理基本上是一样的,用定时器调试也是用的最多的,也更加方便,当然,我这里也是一种简单的思路而已。通过这样的简单调试,我们可尝试呼吸灯,这是最直接的,毕竟不需要接外部设备。
在这里插入代码片
sbit ServoPin = P2^7;
void Delay1550us()
{
unsigned char i, j;
i = 3;
j = 196;
do
{
while (--j);
} while (--i);
}
void Delay18450us()
{
unsigned char i, j;
_nop_();
i = 34;
j = 16;
do
{
while (--j);
} while (--i);
}
void Delay600us()
{
unsigned char i, j;
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
void Delay19400us()
{
unsigned char i, j;
_nop_();
i = 35;
j = 197;
do
{
while (--j);
} while (--i);
}
void Delay17500us()
{
unsigned char i, j;
i = 32;
j = 93;
do
{
while (--j);
} while (--i);
}
void Delay2500us()
{
unsigned char i, j;
i = 5;
j = 120;
do
{
while (--j);
} while (--i);
}
void delays(unsigned int z)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void ServoFront()
{
char i;
for(i=0;i<10;i++)
{
ServoPin = 1;
Delay1550us();
ServoPin = 0;
Delay18450us();
}
delays(800);
}
void ServoLeft()
{
char i;
for(i=0;i<10;i++)
{
ServoPin = 1;
Delay2500us();
ServoPin = 0;
Delay17500us();
}
delays(800);
}
void ServoRight()
{
char i;
for(i=0;i<10;i++)
{
ServoPin = 1;
Delay600us();
ServoPin = 0;
Delay19400us();
}
delays(800);
}
void main()
{
ServoFront();
}
(希望这篇文章能给大家带来帮助吧!!! 同时大家可以提出自己的建议和意见,让我能发现自己的不足。
|