机器人舵机说明_第1页
机器人舵机说明_第2页
机器人舵机说明_第3页
机器人舵机说明_第4页
机器人舵机说明_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

机器人舵机说明一、舵机简介舵机,顾名思义,大海航行靠舵手,舵机早期是应用在航模中控制方向的,在航空模型中,飞行器的飞行姿态是通过调整发动机和各个控制多面来实现的,后来有人发现这种机器的体积小、重量轻、扭矩大、精度高,由于具备了这样的优点,很适合应用在机器人身上作为机器人的驱动。二、舵机的分类按照舵机的转动角度分有180度舵机和360度舵机。180度舵机只能在0度到180度之间运动,超过这个范围,舵机就会出现超量程的故障,轻那么齿轮打坏,重那么烧坏舵机电路或者舵机里面的电机。360度舵机转动的方式和普通的电机类似,可以连续的转动,不过我们可以控制它转动的方向和速度。按照舵机的信号处理分为模拟舵机和数字舵机,它们的区别在于,模拟舵机需要给它不停的发送PWM信号,才能让它保持在规定的位置或者让它按照某个速度转动,数字舵机那么只需要发送一次PWM信号就能保持在规定的某个位置。关于PWM信号在3.4节将会介绍。三、舵机的内部结构一般来说,我们用的舵机有以下几个局部组成:直流电动机、减速器〔减速齿轮组〕、位置反响电位计、控制电路板〔比拟器〕。舵机的输入线共有三根,红色在中间,为电源正极线,黑色线是电源负极〔地线〕线,黄色或者白色线为信号线。其中电源线为舵机提供6V到7V左右电压的电源。红、黑、白线舵机上盖红、黑、白线舵机上盖齿轮组直流电机固定螺丝舵机后盖位置反响电位计控制电路板〔比拟器〕图1舵机的内部结构四、舵机的工作原理及控制方法4.1舵机运动的对应关系在对机器人进行动作编程之前我们需要知道,机器人有许多个关节,每一个关节我们称为一个自由度。一般的机体,都有十几个自由度,这样才能够保证动作的灵活性。在机器人机体上,我们通常使用舵机作为每一个关节的连接局部。它可以完成每个关节的定位和运动。舵机的控制信号相对简单,控制精度高,反响速度快,而且比伺服电机省电。这些优点是非常突出的。在下面的论述中,会涉及到舵机相关的控制原理,读者应反复详细阅读。舵机的外观入以下图所示:图2舵机外观这里可以看到,舵机体积十分小巧。机器人使用它是非常适宜的。一般的舵机可以旋转185左右,我们这里留一些余量,算做180度。八位单片机的精度是256,我们也留一些余量,算作250。这样我们可以得到一个根本的对应关系:ΦΦ舵机转动角度舵机转动角度Φ:0-180度单片机数值N:0-250在程序中我们为舵机赋予不同的数值,舵机便能转动到对应的角度。注:在代码编写及调试过程中要时刻注意舵机的转动角度,在各关节不发生干预的情况下也要保证其输出角度不要超出预设范围:0-180度〔单片机对应取值:0-250〕。注:在代码编写及调试过程中要时刻注意舵机的转动角度,在各关节不发生干预的情况下也要保证其输出角度不要超出预设范围:0-180度〔单片机对应取值:0-250〕。图图3舵机转动角度示意图4.2舵机工作原理1、舵机PWM信号定义PWM信号为脉宽调制信号,其特点在于他的上升沿与下降沿之间的时间宽度。具体的时间宽窄协议参考以下讲述。我们目前使用的舵机主要依赖于模型行业的标准协议,随着机器人行业的渐渐独立,有些厂商已经推出全新的舵机协议,这些舵机只能应用于机器人行业,已经不能够应用于传统的模型上面了。目前,HG14-M舵机可能是这个过渡时期的产物,它采用传统的PWM协议,优缺点一目了然。优点是已经产业化,本钱较低,旋转角度大〔目前所生产的都可到达185度〕;缺点是控制比拟复杂,毕竟采用PWM格式。但是它是一款数字型的舵机,其对PWM信号的要求较低:不用随时接收指令,减少CPU的疲劳程度;可以位置自锁、位置跟踪,这方面超越了普通的步进电机;图4其PWM格式注意的几个要点:高电平最少为0.5mS,为0.5-2.5mS之间;〔对应舵机旋转0-180度〕HG14-M数字舵机下降沿时间没要求,目前采用0.5Ms就行;也就是说PWM波形可以是一个周期1mS的标准方波。2、PWM信号控制精度制定上面已经提到了八位单片机,我们的舵机需要的是方波信号。单片机的精度直接影响了舵机的控制精度,这里就详细的说明一下。我们采用的是8位STC我们采用的是8位STC12C5410ADCPU,其数据分辨率为256,那么经过舵机极限参数实验,得到应该将其划分为250份。那么0.5mS---2.5Ms的宽度为2mS=2000uS。2000uS÷250=8uS那么:PWM的控制精度为8us我们可以以8uS为单位递增控制舵机转动与定位。舵机可以转动185度,那么185度÷250=0.74度,那么:舵机的控制精度为0.74度图图5我们在这里做了一些名词上的定义。DIV是一个时间位置单位,一个DIV等于8us,关系入公式:1DIV=8uS250DIV=2mS1DIV=8uS250DIV=2mS实际存放器内的数值为:〔#01H〕01———〔#0FAH〕250。共185度,分为250个位置,每个位置叫1DIV。那么:185185÷250=0.74度/DIVPWM高电平函数:0.5mS+N×DIV0uS≤N×DIV≤2mS0.5mS≤0.5Ms+N×DIV≤2.5mS根据这些知识,我们就可以开始编程,并做一些初步的实验了,学会舵机控制是研究机器人的一个比拟技术手段,需要完全掌握。4.3单舵机的控制程序 我们已经知道了舵机的工作与控制原理,我们现在可以通过一个简单的程序来控制单个舵机的运转。如果您手头上有控制板和舵机,而且已经熟悉了KEIL软件和STC烧录软件,马上就可以试试了,如果您还不满足这些条件的话,也没什么关系,先来分析一下这段程序。延时程序:用于产生所需的PWM信号;;;;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈;voiddelay_8us()RSEG?PR?delay_8us?Robotdelay_8us: ;延时8US子程序24周期MOVR1,#3LP2_8us:MOVR2,#3LP1_8us:DJNZR2,LP1_8usDJNZR1,LP2_8usRET;voiddelay_500us()RSEG?PR?delay_500us?Robotdelay_500us: ;延时500US子程序1500周期MOVR1,#32LP2_500us:MOVR2,#45LP1_500us:DJNZR2,LP1_500usDJNZR1,LP2_500usRET;;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈;voiddelay_500ms()RSEG?PR?delay_500ms?Robotdelay_500ms:;延时500MS子程序1500000周期MOVR0,#242LP3_500ms:MOVR1,#242LP2_500ms:MOVR2,#24LP1_500ms:DJNZR2,LP1_500msDJNZR1,LP2_500msDJNZR0,LP3_500msRET;;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈END单舵机PWM信号产生函数:voidPWM(ucharfoot,ucharspeed)voidPWM(ucharfoot,ucharspeed){ uchari,j; for(i=0;i<foot;i++) { P1|=0x01;//将P1.0口拉高 delay_500us(); for(j=0;j<i;j++) //延时foot*8us { delay_8us(); } P1&=0xfe; //将P1.0口拉低 for(j=0;j<speed;j++)//延时speed*0.5ms { delay_500us(); }}} 上面函数的参数foot,是控制舵机转动的度数,ΔΦ=foot*0.72〔度〕,speed控制的是舵机转动的速度。4.4多路舵机并行控制方法 上一小节中比拟详细的讲解了单舵机是怎么控制的,但是在机器人运动过程中,必须让多个舵机同时协作的运动,要想实现这个目标,我们必须有个精致的并行控制算法。 假设我们现在要控制8个舵机联动,并且这八个舵机所要到达的位置各不相同,我们应该怎么做呢?首先我们用逆向思维思考一下,假设这八个舵机的PWM信号同时进入上升沿(既单片机上对应的八个输出引脚同时拉高),那么它们进入下降沿的时间顺序是怎样的呢?我们很容易知道舵机所要到达的位置与0度位置的夹角w越小〔既高电平宽度〕,它进入下降沿就越早,这一点不难理解。假设我们机器人身上有8个舵机,它们要到达的位置参数〔n的值〕分别是45,30,15,60,80,98,135,155,为了方便,我们将这些数存到一个取名为position的数组里,既position[8]={45,30,15,60,80,98,135,155}。 为了使这八个舵机和单片机上相应的管脚对应起来,我们又设置了一个数组kouchu[8],初始化为kouchu[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f},为了方便起见,下面列了一个表格。图6单片机引脚对应数组 表1舵机程序控制数据对照表-1数组名 下标01234567position453015608098135155kouchu(16进制)0xfe0xfb0xfd0xf70xef0xbf0xdf0x7f这八个舵机对应的理想波形如下:图7舵机控制理想输出波形-1 我们将这八个舵机对应的数组position[8]各个元素从大到小排序,同时将数组kouchu[8]的各个元素也进行相应的调换,这样做的原因是不使单片机各引脚对舵机的对应控制关系不打乱,以前是怎么一一对应的,现在还是那样的对应,排序之后的列表如下:表2舵机程序控制数据对照表-2数组名下标01234567position155135988060453015kouchu0x7f0xbf0xdf0xef0xf70xfe0xfd0xfb以下图是排序后所对应的PWM理想波形:图8舵机控制理想输出波形-2 通过对这一系列波形的观察,我们可以这样实现它,先将单片机上控制舵机的八路引脚电平同时间拉高,经过延时500+15*8〔us〕后,将position[7]对应的舵机信号输出引脚拉低,再经过〔30-15〕*8us后拉低position[6]对应的舵机信号输出引脚,这样就依次求差延时,逐个拉低,知道所有的舵机都到达自己所要到达的位置。这样的话,我们在对position[8]数组排序之后还要进行一个求差处理。ucharposition[24];//uchar既无符号字符型ucharkouchu[8];ucharpaixu_ncha[8];ucharposition[24];//uchar既无符号字符型ucharkouchu[8];ucharpaixu_ncha[8];第一步:定义数组第二部:给各个数组赋值为了方便起见,这里的position[24]的值是一组假设值。表3position[24]数据对照表下标01234567元素值1201001453521019512755下标89101112131415元素值1243679316723515587下标1617181920212223元素值62154922014617621237表4kouchu[8]数据对照表下标01234567元素值0xfe0xfd0xfb0xf70xef0xdf0xbf0x7f表5paixu_ncha[8]数据对照表-1下标01234567元素值00000000第三步:将position[24]中的数组前八个元素对应赋给paixu_ncha[8]数组。赋值后paixu_ncha[8]各元素对应的值如下:表6paixu_ncha[8]数据对照表-2下标01234567元素值1201001453521019512755第四步:将paixu_ncha[8]数组各元素从大到小排序kouchu[8]数组元素也做相应的调整。排序后得到的结果列表如下:表7paixu_ncha[8]数据对照表-3数组名下标01234567paixu_ncha2101951451271201005535kouchu0xef0xdf0xfb0xbf0xfe0xfd0x7f0xf7第五步:将paixu_ncha[8]数组作差处理相邻元素作差结果存入前面的元素中,最后一个元素保存原值不变。处理后的结果如下:表8paixu_ncha[8]数据对照表-4下标01234567元素值155018720452035P1=0xff;P1=0xff;//使口P1全部拉高delay_500us(); //调用延时500us函数for(i=0;i<8;i++)//延时输出到口P1〔八路〕{for(j=0;j<paixu_ncha[7-i];j++){delay_8us();}P1=P1&kouchu[7-i]; //拉低舵机对应口的电平。}第六步:PWM波形产生 这些都完成后,再将position[24]中的数组8—15号元素对应赋给paixu_ncha[8]数组,然后重复上面的三到六步,做完后,再做16—23号元素,方法一样。 这段程序中“P1=P1&kouchu[7-i];”语句的作用就是通过位与运算将当前需要拉低的引脚拉低电平。4.5实用范例下面所示代码对应机器人源代码中的“pwm.h”头文件〔如图1-5〕,此段代码用于生成控制机器人舵机的PWM脉冲。1、为了简化代码的书写过程,我们将“unsignedchar”以及“unsignedint”简化定义为“uchar”和“uint”。图9图9“pwm.h”头文件位置//━━━━━━━━━━━━━━━━━━//宏定义〔Acerdefinition〕//┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈#defineucharunsignedchar#defineuintunsignedint2、下面所用于声明的延时函数源于“SCT12C5410AD(12MHZ).asm”文件中定义,在此处声明以便于程序对于延时函数的调用。这里我们提供了“8us”、“500us”、“500ms”三种延时时长,假设想获得更长的延时时间,只需通过循环函数增加延时次数以实现其效果。//━━━━━━━━━━━//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━//函数声明〔Functiondeclaration〕//┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈externvoiddelay_8us();//把delay_8us()声明为外部函数externvoiddelay_500us();//把delay_500us()声明为外部函数externvoiddelay_500ms();//把delay_500ms()声明为外部函数//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━//全局变量定义〔Globalvariablesdefined〕//┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ucharkouchu[8]; //用于提供信号输出引脚〔低电平〕ucharpaixu_ncha[8]=0; //提供N差排序空间ucharposition[24]=0; //用于记录24个舵机的位置〔根据机器人实际需求选用〕端口号舵机编号汇编存储器端口号舵机编号汇编存储器左大腿:position[0]━>>P1.00舵机40H左膝盖:position[1]━>>P1.11舵机41H左脚踝:position[2]━>>P1.22舵机42H右大腿:position[3]━>>P1.33舵机43H右膝盖:position[4]━>>P1.44舵机44H右脚踝:position[5]━>>P1.55舵机45H左肩膀:position[6]━>>P1.66舵机46H右肩膀:position[7]━>>P1.77舵机47H左胯:position[8]━>>P2.08舵机48H左脚:position[9]━>>P2.19舵机49H右胯:position[10]━>>P2.210舵机4AH右脚:position[11]━>>P2.311舵机4BH左上臂:position[12]━>>P2.412舵机4CH左手:position[13]━>>P2.513舵机4DH右上臂:position[14]━>>P2.614舵机4EH右手:position[15]━>>P2.715舵机4FH5、根据动作需求控制舵机的运动。//──────────────────────────────────────//函数原型:voidPWM_16()//──────────────────────────────────────//函数原型:voidPWM_16()//函数名称:16路舵机输出子程序(16SubroutineoutputServos)//功能:对临近数值做差,求出相对差值,用于延时。控制端口P1、P2//入口参数:无//返回值:无//┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈voidPWM_16(){uchari=0,j=0; //定义循环变量//控制P1口舵机,编号:0~7 for(i=0;i<=7;i++)//根据舵机所需运动的位置情况给排序数组赋值 paixu_ncha[i]=position[i]; sorting();//调用排序函数将各输出通道按舵机目的位置的数值大小进行排序 N_value();//调用N差函数计算出临近通道相差的数值大小,用于延时 P1=0xff;//使口P1全部拉高,提供上升沿高电平 delay_500us();//调用延时500us函数,提供最少的0.5mS的高电平输出时间 for(i=0;i<8;i++)//延时输出到P1口〔8路〕 { for(j=0;j<paixu_ncha[7-i];j++)//将进行过差值计算的paixu_ncha[8]数组用于控制延时时长 delay_8us(); //提供N×DIV动作要求高电平时长 P1=P1&kouchu[7-i];//将对应此时长的输出通道端口电平拉低,输出低电平,舵机开始动作 }//控制P2口舵机,编号:8~15 for(i=0;i<8;i++) //根据舵机所需运动的位置情况给排序数组赋值 paixu_ncha[i]=position[i+8]; sorting();//调用排序函数将各输出通道按舵机目的位置的数值大小进行排序 N_value();//调用N差函数计算出临近通道相差的数值大小,用于延时 P2=0xff;//使口P2全部拉高,提供上升沿高电平 delay_500us();//调用延时500us函数,提供最少的0.5mS的高电平输出时间 for(i=0;i<8;i++)//延时输出到P2口〔8路〕 { for(j=0;j<paixu_ncha[7-i];j++)//将进行过差值计算的paixu_ncha[8]数组用于控制延时时长 delay_8us(); //提供N×DIV动作要求高电平时长 P2=P2&kouchu[7-i];//将对应此时长的输出通道端口电平拉低,输出低电平,舵机开始动作 }}//────────────────────────────────────────//函数原型:voidsorting()//函数名称:排序子程序(SortingSubroutine)//功能:对所有通道口的数值进行排序。//参数://返回值:无//┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈voidsorting(){ uchari=0,j=0,x=0; //定义循环变量//为选择的输出通道提供低电平 kouchu[0]=0xFE; //11111110 kouchu[1]=0xFD; //11111101 kouchu[2]=0xFB; //11111011 kouchu[3]=0xF7; //11110111 kouchu[4]=0xEF; //11101111 kouchu[5]=0xDF; //11011111 kouchu[6]=0xBF; //10111111 kouchu[7]=0x7F; //01111111 /

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论