外观:
接线方法:
- 棕色----------------GND
- 红色----------------VCC
- 橙色----------------信号线
原理:
舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。
怎么样才能让舵机动起来呢? 既然舵机是靠脉冲驱动的,那我们给舵机一定的脉冲就能够让它动起来。 有一个时间周期(20ms),如果高电平占1ms,低电平占19ms,那么占空比就是5%,这里有舵机旋转所需的占比(以180°舵机为例):
0.5ms | 0度 |
1ms | 45度 |
1.5ms | 90度 |
2ms | 135度 |
2.5ms | 180度 |
由次可以知道,高电平占空比越大,舵机旋转角度越大,记住舵机有最大角度限制,占空比最大不能大过可旋转角度所需占空比,不然舵机转不过去,卡在那里,对舵机的寿命也有一定影响。
软件设计:
我们知道想让舵机转动,必须给舵机一个脉冲,脉冲说白了就是高低电平,高低电平的占比不同,转的角度也就不同。
这里使用51的定时器,每过0.1ms计时一次,20ms为一个周期,同时定义一个变量,一个常量,将二者进行比较即可。
程序:
//实际上想让舵机转到指定角度,是需要自己实验的,每个舵机都不一样,原理是参考的。
#include <reg52.h>
sbit SEV_PWM = P1^7; //设定PWM输出的I/O端口,有个引脚输出
unsigned char count = 0; //比较值
unsigned char SEV_conut=9; //pwm控制值
/*延时程序*/
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
/*定时器T0初始化*/
void Com_Init()
{
TMOD |= 0x01; //定时器T0设置成方式1
TH0 = 0xff; //定时常数 0.1ms 晶振为11.0592MHz
TL0 = 0xa4;
ET0 = 1; //中断标志
TR0 = 1; //定时器开关
EA=1; //总开关
}
/*T0中断初始化*/
void Time0_Init() interrupt 1
{
TR0 = 0; //定时器开关
TH0 = 0xff; //重装时间常数 0.1ms
TL0 = 0xa4;
count++; //比较值,很关键
if(count <= SEV_conut) //5==0° 10==90°
{
SEV_PWM = 1; //高电平
}
else
{
SEV_PWM = 0; //低电平
}
if (count >= 200) //T = 20ms清零 20ms为周期,重新开始
{
count = 0;
}
TR0 = 1; //开启T0
}
void main()
{
Com_Init(); //中断初始化,打开定时器
while(1)
{
SEV_conut=9;
count=0; //重新赋值,重新比较
Delay(50000); //延时是为了留一些时间给舵机反映。
SEV_conut=2;
count=0;
Delay(50000);
SEV_conut=17;
count=0;
Delay(50000);
}
}
总结:
控制舵机其实就是控制输出PWM,而PWM的输出就需要配置51单片机的定时器,总的来说还是要对51单片机的定时器熟悉。