51单片机-舵机
SG90舵机介绍
舵机简介
舵机是一种位置(角度)伺服的驱动器,适用那些需要角度不断变化并可以保持的控制系统。舵机只是一种通俗的叫法,其实质是一个伺服马达。舵机主要分为 模拟舵机和数字舵机:
-
模拟舵机:
需要不断的发送目的地PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要不断的发送90度的PWM信号直到到达指定位置才能停止。 -
数字舵机:
只需给一个目的地PWM信号,即可旋转到指定位置。例如:我现在让它旋转90度,我只需要发送一次90度的PWM信号,它就可以旋转到90度。

一个舵机有三条线:VCC(红线),GND(棕色线),PWM信号线(橙色线)
如何转动?
- 我们需要使用单片机
产生周期为20ms,高电平 t 等于0.5ms~2.5ms之间的这样一个方波。可以使用定时器+中断产生这样的方波。波形如下所示:
-
高电平在一个周期(20ms)的持续时间对应的舵机角度,如图:
-
简单讲一下编程思想,我所使用的是方法是
定时器+中断,定时器每 0.5ms 中断一次,需要中断40次才能达到20ms。我们此时需要一个全局变量来记录中断的次数,当中断达到40次时,全局变量重新清零。当中断次数小于a时,信号线输出高电平,否则输出零。此时a的值对应关系如下:
1--0度,2--45度,3--90度,4--135度,5--180度其实就是产生PWM,通过控制PWM占空比来控制舵机旋转角度。
main.c
/*********************************************************************************
* 【函数功能】: 舵机使用
接线:红色->VCC
棕色->GND
橙色->P3^5
**********************************************************************************/
# include <reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit PWM=P3^5;//设定PWM输出的I/O口端口
u8 count=0;
u8 timer1;
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
{
for(j=110;j>0;j--);
}
}
//定时器T0初始化
void Timer0_Init()
{
TMOD &=0x00;
TMOD |=0x01;//定时器T0设置成方式1
TH0=0xFF;//定时器常数 0.1ms 晶振11.0952
TL0=0xA4;
ET0=1;
TR0=1;
EA=1;
}
//T0中断初始化
void Time0_Init() interrupt 1
{
TR0=0;
TH0=0xFF;
TL0=0xA4;
if(count<=timer1)
{
PWM=1;
}
else
{
PWM=0;
}
count++;
if(count>=200)//T=20ms清零
{
count=0;
}
TR0=1;//开启T0
}
void main()
{
Timer0_Init();
while(1)
{
timer1=6;//舵机0度位置
count=0;//让定时器重新计数
delay_ms(1000);
timer1=19;//不知道为什么我的不能超过20不然会转圈
count=0;
delay_ms(1000);
delay_ms(1000);
}
}

