伺服电机(servo motor )
伺服电机是指在伺服系统中控制机械元件运转的发动机,是一种补助马达间接变速装置。
伺服电机可以控制速度,位置精度非常准确,可以将电压信号转化为转矩和转速以驱动控制对象。
伺服电机转子转速受输入信号控制,并能快速反应,在自动控制系统中,用作执行元件,且具有机电时间常数小、线性度高、始动电压等特性,可把所收到的电信号转换成电动机轴上的角位移或角速度输出。分为直流和交流伺服电动机两大类,其主要特点是,当信号电压为零时无自转现象,转速随着转矩的增加而匀速下降。
舵机
舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前,在高档遥控玩具,如飞机、潜艇模型,遥控机器人中已经得到了普遍应用。
舵机主要是由外壳、电路板、驱动马达、减速器与位置检测元件所构成。其工作原理是由接收机发出讯号给舵机,经由电路板上的 IC驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回讯号,判断是否已经到达定位。
位置检测器其实就是可变电阻,当舵机转动时电阻值也会随之改变,藉由检测电阻值便可知转动的角度。
一般的伺服马达是将细铜线缠绕在三极转子上,当电流流经线圈时便会产生磁场,与转子外围的磁铁产生排斥作用,进而产生转动的作用力。依据物理学原理,物体的转动惯量与质量成正比,因此要转动质量愈大的物体,所需的作用力也愈大。舵机为求转速快、耗电小,于是将细铜线缠绕成极薄的中空圆柱体,形成一个重量极轻的无极中空转子,并将磁铁置於圆柱体内,这就是空心杯马达。
为了适合不同的工作环境,有防水及防尘设计的舵机;并且因应不同的负载需求,舵机的齿轮有塑胶及金属之区分,金属齿轮的舵机一般皆为大扭力及高速型,具有齿轮不会因负载过大而崩牙的优点。较高级的舵机会装置滚珠轴承,使得转动时能更轻快精准。
伺服电机与步进电机的性能比较
步进电机作为一种开环控制的系统,和现代数字控制技术有着本质的联系。在目前国内的数字控制系统中,步进电机的应用十分广泛。随着全数字式交流伺服系统的出现,交流伺服电机也越来越多地应用于数字控制系统中。为了适应数字控制的发展趋势,运动控制系统中大多采用步进电机或全数字式交流伺服电机作为执行电动机。虽然两者在控制方式上相似(脉冲串和方向信号),但在使用性能和应用场合上存在着较大的差异。
现就二者的使用性能进行如下比较:
- 控制精度不同
两相混合式步进电机步距角一般为 1.8°、0.9°,五相混合式步进电机步距角一般为0.72 °、0.36°。也有一些高性能的步进电机通过细分后步距角更小。如三洋公司(SANYO DENKI)生产的二相混合式步进电机其步距角可通过拨码开关设置为1.8°、0.9°、0.72°、0.36°、0.18°、0.09°、0.072°、0.036°,兼容了两相和五相混合式步进电机的步距角。
交流伺服电机的控制精度由电机轴后端的旋转编码器保证。以三洋全数字式交流伺服电机为例,对于带标准2000线编码器的电机而言,由于驱动器内部采用了四倍频技术,其脉冲当量为360°/8000=0.045°。对于带17位编码器的电机而言,驱动器每接收131072个脉冲电机转一圈,即其脉冲当量为360°/131072=0.0027466°,是步距角为1.8°的步进电机的脉冲当量的1/655。
- 低频特性不同
步进电机在低速时易出现低频振动现象。振动频率与负载情况和驱动器性能有关,一般认为振动频率为电机空载起跳频率的一半。这种由步进电机的工作原理所决定的低频振动现象对于机器的正常运转非常不利。当步进电机工作在低速时,一般应采用阻尼技术来克服低频振动现象,比如在电机上加阻尼器,或驱动器上采用细分技术等。
交流伺服电机运转非常平稳,即使在低速时也不会出现振动现象。交流伺服系统具有共振抑制功能,可涵盖机械的刚性不足,并且系统内部具有频率解析机能(FFT),可检测出机械的共振点,便于系统调整。
- 矩频特性不同
步进电机的输出力矩随转速升高而下降,且在较高转速时会急剧下降,所以其最高工作转速一般在300~600RPM。交流伺服电机为恒力矩输出,即在其额定转速(一般为2000RPM或3000RPM)以内,都能输出额定转矩,在额定转速以上为恒功率输出。
- 过载能力不同
步进电机一般不具有过载能力。交流伺服电机具有较强的过载能力。以三洋交流伺服系统为例,它具有速度过载和转矩过载能力。其最大转矩为额定转矩的二到三倍,可用于克服惯性负载在启动瞬间的惯性力矩。步进电机因为没有这种过载能力,在选型时为了克服这种惯性力矩,往往需要选取较大转矩的电机,而机器在正常工作期间又不需要那么大的转矩,便出现了力矩浪费的现象。
- 运行性能不同
步进电机的控制为开环控制,启动频率过高或负载过大易出现丢步或堵转的现象,停止时转速过高易出现过冲的现象,所以为保证其控制精度,应处理好升、降速问题。交流伺服驱动系统为闭环控制,驱动器可直接对电机编码器反馈信号进行采样,内部构成位置环和速度环,一般不会出现步进电机的丢步或过冲的现象,控制性能更为可靠。
- 速度响应性能不同
步进电机从静止加速到工作转速(一般为每分钟几百转)需要200~400毫秒。交流伺服系统的加速性能较好,以山洋400W交流伺服电机为例,从静止加速到其额定转速3000RPM仅需几毫秒,可用于要求快速启停的控制场合。
综上所述,交流伺服系统在许多性能方面都优于步进电机。但在一些要求不高的场合也经常用步进电机来做执行电动机。所以,在控制系统的设计过程中要综合考虑控制要求、成本等多方面的因素,选用适当的控制电机。
伺服电机优点【其他电机(如步进电机)相比】:
1、精度:实现了位置,速度和力矩的闭环控制;克服了步进电机失步的问题;
2、转速:高速性能好,一般额定转速能达到2000~3000转;
3、适应性:抗过载能力强,能承受三倍于额定转矩的负载,对有瞬间负载波动和要求快速起动的场合特别适用;
4、稳定:低速运行平稳,低速运行时不会产生类似于步进电机的步进运行现象。适用于有高速响应要求的场合;
5、及时性:电机加减速的动态相应时间短,一般在几十毫秒之内;
6、舒适性:发热和噪音明显降低。
简单点说就是:平常看到的那种普通的电机,断电后它还会因为自身的惯性再转一会儿,然后停下。而伺服电机和步进电机是说停就停,说走就走,反应极快。但步进电机存在失步现象。
舵机控制
- 舵机工作原理:
由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为20ms,宽度为1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC 判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。
适用于那些需要角度不断变化并可以保持的控制系统。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。一般舵机旋转的角度范围是0 度到180 度。
舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz)。
理论上脉宽分布应在1ms到2ms 之间,但是,事实上脉宽可由0.5ms 到2.5ms 之间,脉宽和舵机的转角0°~180°相对应。
由于舵机品牌不同,对于同一信号,不同舵机旋转的角度也会有所不同。
实例演示
了解了上面这些烦人的基础知识,下面我们进行一个通过Arduino控制舵机的实例。
本实验所需要的元器件很少:Arduino Pro MINI1、舵机1、跳线若干。
用Arduino 控制舵机的方法有两种:
- 第一种是通过Arduino具备PWM的数字I/O接口产生占空比不同的方波,模拟产生PWM 信号进行舵机定位.
- 第二种是直接利用Arduino 自带的Servo 函数进行舵机控制,这种控制方法的优点在于程序编写简便,缺点是只能控制2 路舵机。因为Arduino 自带函数只能利用D9、D10 接口。
Arduino 的驱动能力有限,所以当需要控制1 个以上的舵机时需要外接电源。
方法1代码示例:
/**
通过串口,让舵机转动到用户输入数字所对应的角度数的位置。
将角度打印显示到屏幕上。
将舵机信号线接在D3接口
*/
int servoPin = 3; //定义D3连接伺服舵机信号线3,5,6,9,10,11均可
int myAngle; //定义角度变量
int val;
void setup(){
pinMode(servoPin,OUTPUT);//设定舵机接口为输出接口
Serial.begin(9600);//连接到串行端口,波特率为9600
Serial.println("Please input Angle." );
}
void loop(){
val=Serial.read(); //读取串行端口的值
if(val>='0' && val<='9'){
val = val - '0'; //将特征量转化为数值变量,
myAngle = val*(180/9);//将数字转化为角度
Serial.print("moving servo to ");
Serial.print(val,DEC);
Serial.println();
analogWrite(servoPin,myAngle);
}
}
方法2代码示例:
#include <Servo.h>
/**
attach()
设定舵机的接口,只有9或10接口可利用。
write()
用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°。
writeMicroseconds()
用于设定舵机旋转角度的语句,直接用微秒作为参数。
read()
用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值。
attached()
判断舵机参数是否已发送到舵机所在接口。
detach()
使舵机与其接口分离,该接口(9或10)可继续被用作PWM接口。
*/
Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created
int pos = 0; // variable to store the servo position
void setup(){
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop(){
pos = 90;
myservo.write(pos); // 设定舵机转动的初始角度
delay(100);
for(pos; pos < 135; pos++){ // 设置转动角 1-180向右转,每一步转动1度
myservo.write(pos); //设定舵机转动的角度
delay(100);
}
delay(1000);
pos = 90;
myservo.write(pos);
delay(1000);
for(pos; pos>=45; pos--){
myservo.write(pos);
delay(100);
}
}
以上就是控制舵机的两种方法,各有优缺点大家根据自己的喜好和需要进行选择。不足之处还请大家批评指正。
感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。
感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。
感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。
禾灮,感谢有你。
未来,我们将一如既往,砥砺前行。
禾灮·小楊
2018.07.04