舵机的简单介绍

文章目录

      • 舵机组成
      • 舵机扭力介绍
      • 控制流程
      • 位置与脉冲控制关系
      • 舵机的追随特性
      • 驱动芯片的内部电路
      • 51单片机控制代码
      • Arduino控制代码

舵机组成

结构接线图
舵机的简单介绍_第1张图片
拆卸图
舵机的简单介绍_第2张图片

框架图

舵机的简单介绍_第3张图片

舵机扭力介绍

舵机扭矩的单位是KG*CM,这是一个扭矩的单位,可以理解为在舵盘上距离舵机轴中心水平距离1CM处,舵机能够带动的物体重量。
舵机的简单介绍_第4张图片

控制流程

Created with Raphaël 2.2.0 开始 控制信号 控制电路板 电机转动使电位计转动 电位计反馈 结束 yes no

位置与脉冲控制关系

舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;

 

如下图可形象地表示脉冲与角度关系

 

舵机的简单介绍_第5张图片


舵机的追随特性

假设现在舵机稳定在A点,这时候控制电路发出一个PWM信号,舵机全速由A点转向B点,在这个过程中需要一段时间,舵机才能运动到B点。
舵机的简单介绍_第6张图片

保持时间为Tw
当Tw≥△T时,舵机能够到达目标,并有剩余时间;
当Tw≤△T时,舵机不能到达目标;

理论上:当Tw=△T时,系统最连贯,而且舵机运动的最快。

实际过程中w不尽相同,连贯运动时的极限△T比较难以计算出来。

假如我们的舵机1DIV =8us,当PWM信号以最小变化量即(1DIV=8us)依次变化时,舵机的分辨率最高,但是速度会减慢。

实际过程中由于以下两个因素:
1、1个机器人身上有多个舵机,负载各不相同,所以角速度w不同;
2、某个舵机在不同时刻的外界环境负载也不同,所以w不同;
所以连贯运动时的极限△T难以计算出来,目前采取的方法是经验选取w值。

驱动芯片的内部电路

舵机的简单介绍_第7张图片

这里只找到BA668A芯片的datasheet
舵机的简单介绍_第8张图片

51单片机控制代码

#include 
unsigned char count;			//0.5ms次数标识
sbit pwm=P1^0;				//信号输出
sbit jia=P1^1;				//角度增加按键
sbit jan=P1^2;				//角度减小按键
char jd;					//角度标识
void delay(unsigned int i)
{
	unsigned int j,k;
	for(j=i;j>0;j--)
		for(k=125;k>0;k--);
}
void Time0_init()			//定时器初始化
{
	TMOD=0x01;
	IE=0x82;
	TH0=0xff;
	TL0=0x19;				//12晶振,0.25ms
	TR0=1;				   //定时器开始
}
void Time0_int() interrupt 1			//中断程序
{
	TH0=0xff;
	TL0=0x19;
	if(count<jd) //输出count个高电平
		pwm=1;
	else
	pwm=0;    //其余输出低电平
	count++;
	count=count%40;  //时钟保持40个count 即20ms
}
void keyscan()				//按键扫描
{
	if(jia==0)				//角度增加键是否按下
	{
		delay(50);			//按下延时,消抖
		if(jia==0)
		{
			jd++;			//角度标识加1
			count=0;		//按键按下,则20ms周期重新开始
			if(jd==50)
				jd=9;			 //已经是180°则保持
				while(jia==0);	 //等待按键放开
		}
	}
	if(jan==0)					 //角度减小键是否按下
	{
		delay(10);
		if(jd==0);
		{
			jd--;				 //角度标识减1
			count=0;
			if(jd==0)
				jd=1;
			while(jan==0);
		}
	}
}
 
void main()
{
	jd=1;
	count=0;
	Time0_init();
	while(1)
	{
		keyscan();
//		display();
	}
}

Arduino控制代码

舵机的简单介绍_第9张图片
使用官方自带库

数字口控制

#include 
 
#define PIN_SERVO 9
Servo myservo;
 
void setup()
{
  myservo.attach(PIN_SERVO);
}
 
void loop()
{
  myservo.write(0);
  delay(1000);
  myservo.write(80);
  delay(1000);
  myservo.write(160);
  delay(1000);
  myservo.write(80);
  delay(1000);
  myservo.write(0);
  delay(1000);
}

模拟输入控制:

#include 
Servo myservo;  // create servo object to control a servo
int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

相关参考链接:https://wenku.baidu.com/view/11b2e7d6ec3a87c24128c416.html

你可能感兴趣的:(Arduino,基础知识)