- 介绍
- 什么是舵机
- 原理
- 转动方法
- 实现方法
- 编程实例
- 定义变量类型,管脚
- 定时器初始化
- 定时器中断函数
- 主函数
- 结尾
舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。
原理- 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
2.连线
橙色—————————–信号线
红色—————————–VCC
棕色—————————–GND 3. 占空比 占空比 = t / T; 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。想要控制舵机,那么我们就需要一个周期T = 20ms。高电平小t等于0.5ms-2.5ms之间的这样一个方波。
以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度; 1.0ms------------45度; 1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度; 这只是一种参考数值,具体的参数,请参见舵机的技术参数。 我们在开发过程中,会发现因为舵机的型号不同,舵机的优劣不同,加上你的单片机晶振时钟的缘故,导致相应时间的角度实际情况会有一定的偏差。
实现方法C51单片机PWM来调节控制它,对于T = 20ms 。我们可以使用定时器来计数。每次0.1ms。如果计数达到200则说明一个周期到了。这是我们常用的定时器方法。 以我们常用的12MHz和11.0592MHz晶振为例: (方式1) 11.0592MHz晶振——0.1ms THx = 0xff,TLx = 0xa3
12.0000MHz晶振——0.1ms THx = 0xff,TLx = 0x9c
编程实例 定义变量类型,管脚#include
#include//自己编写的延时函数放在这里,你们只需要自己写个延时函数就行了
sbit DJ_PWM=P0^0;
sbit JG=P0^7;//低电平发光
typedef unsigned char u8;
typedef unsigned int u16;
u8 t=0,g=5;
定时器初始化
void dingshi_Init()
{
TMOD &= 0x00; //置零
TMOD |= 0x01; //TMOD=0x01;定时器0方式1
TH0 = 0xff; //赋初值0.1ms
TL0 = 0x9c; //晶振12M
ET0 = 1; //定时计数器0溢出中断允许控制位置1
TR0 = 1; //打开定时计数器0
EA=1; //总中断允许
}
定时器中断函数
void Time_Init() interrupt 1
{
TR0=0;//关闭定时器中断
//因为是定时器方式1,所以需要在这里初值重装
TH0 = 0xff; //赋初值0.1ms
TL0 = 0x9c; //晶振12M
if(t=200)//T=20MS清零
{
t=0;
}
TR0=1;//开启定时器中断
}
主函数
void main()
{
dingshi_Init();
while(1)
{
JG=0;
g=3;//因为我的0度大致在这里,你们可以自己测试
t=0;
delay(2000);
g=11;//90度
t=0;
delay(2000);
g=20;//180
t=0;
delay(2000);
}
}
结尾
如果在后续想学习很多项目实例,比如蓝牙控制舵机。遥控激光赛车,都可以关注我的 项目实战 栏目。欢迎大家交流。