伺服电机在电子和嵌入式系统中非常有用。您身边随处可见伺服电机的应用,它们用于玩具、机器人、电脑CD托盘、汽车、飞机等。之所以应用范围如此广泛,是因为伺服电机非常可靠和精确。我们可以将其旋转到任何特定角度。它们的范围很广,从高扭矩电机到低扭矩电机。在本教程中,我们将将伺服电机连接到 8051 微控制器 (AT89S52)。
首先我们需要了解伺服电机的工作原理。伺服电机以PWM(脉冲宽度调制)原理工作,这意味着其旋转角度由施加到其控制引脚的脉冲持续时间控制。伺服电机基本上由直流电机组成,由可变电阻器(电位器)和一些齿轮控制。直流电机的高速力通过齿轮转换为扭矩。我们知道功=力X距离,在直流电机中,力较小,距离(速度)较高,而在伺服中,力较高,距离较小。电位器连接到舵机输出轴,计算角度并在所需角度停止直流电机。了解更多请关注微信公众号:计算机程序吧。
伺服电机可以从 0 到 180 度旋转,但最高可达 210 度,具体取决于制造商。这种旋转程度可以通过施加持续时间在 1ms 到 2ms 之间的逻辑电平 1 脉冲来控制。 1 ms 脉冲可以将舵机旋转到 0 度,1.5 ms 可以将舵机旋转到 90 度,2 ms 脉冲可以将舵机旋转到 180 度。 1 到 2 ms 的持续时间可以将伺服电机旋转到 0 到 180 度之间的任意角度。
伺服电机有三根线,红色为Vcc(电源),棕色为地线,橙色为控制线。控制线可以连接到8051,我们已将其连接到8051的引脚2.1。现在我们必须将该引脚保持为逻辑1 1ms以使其旋转0度,1.5ms旋转90度,2ms旋转180度。我们使用8051片上定时器来创建延迟。我们通过函数“servo_delay”创建了 50us 的延迟,并使用“for”循环创建了 50us 倍数的延迟。
我们使用定时器 0 并处于模式 1,因此我们将 01H 放入 TMOD 寄存器中。模式1为16位定时器模式,TH0包含16位定时器的高字节,TL0包含16位定时器的低字节。我们把FFD2放在16位定时器寄存器中,FF放在TH0中,D2放在TL0中。设置 FFD2 将产生约 10 分钟的延迟。 11.0592MHz 晶振为 50 us。 TR0和TF0是TCON寄存器的位,TR引脚用于在置位时启动定时器,在复位(0)时停止定时器。 TF 为溢出标志,溢出时由硬件置位,需要软件复位。基本上TF告诉定时器的完成,并在16个定时器从FFFFH转变到0000H时由硬件设置。您可以阅读“8051 定时器”来了解定时器寄存器中值的计算,以创建 50 us 延迟。
现在,当从 CRO 测量时,servo_delay 函数的 13 个循环将产生 1ms 的延迟,因此我们从 1ms(13 个循环)开始,到 2ms(26 个循环)将舵机从 0 度旋转到 180 度。但是我们已经从1ms开始慢慢增加延迟,我们将1ms到2ms的窗口分为7个部分,如1.14ms、1.28ms、1.42ms等,因此舵机将以大约3倍的速度旋转。 26 度(180/7)。 180度后会自动回到0度。
// C program for interfacing servo motor with 8051 microcontroller
#include<reg51.h>
sbit output=P2^0;
void msdelay(unsigned int time) // Function for creating delay in milliseconds.
{
unsigned i,j ;
for(i=0;i<time;i++)
for(j=0;j<1275;j++);
}
void servo_delay(int times) // Creating Delay in multilple of 50us using 8051 Timers
{
int m;
for(m=0;m<times;m++)
{
TH0=0xFF;
TL0=0xD2;
TR0=1;
while(TF0==0);
TF0=0;
TR0=0;
}
}
void main()
{
int n;
TMOD=0x01; // Selecting Timer 0, Mode 1
output=0;
while(1)
{
for(n=13;n<28;n=n+2)
{
output=1;
servo_delay(n);
output=0;
servo_delay(260);
msdelay(200);
}
}
}
文章评论