舵机控制激光头(51单片机)

介绍

什么是舵机

舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。

原理

  1. 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为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<reg52.h>
#include<Delay.h>//自己编写的延时函数放在这里,你们只需要自己写个延时函数就行了
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<=g)
 {
  DJ_PWM=1;
 }
 else
 {
  DJ_PWM=0;
 }
 t++;
 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);
  }
}

结尾

如果在后续想学习很多项目实例,比如蓝牙控制舵机。遥控激光赛车,都可以关注我的 项目实战 栏目。欢迎大家交流。

猜你喜欢

转载自blog.csdn.net/qq_44629109/article/details/105785187
今日推荐