最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

机器人舵机说明

来源:动视网 责编:小OO 时间:2025-09-24 12:35:59
文档

机器人舵机说明

机器人舵机说明一、舵机简介舵机,顾名思义,大海航行靠舵手,舵机早期是应用在航模中控制方向的,在航空模型中,飞行器的飞行姿态是通过调整发动机和各个控制多面来实现的,后来有人发现这种机器的体积小、重量轻、扭矩大、精度高,由于具备了这样的优点,很适合应用在机器人身上作为机器人的驱动。二、舵机的分类按照舵机的转动角度分有180度舵机和360度舵机。180度舵机只能在0度到180度之间运动,超过这个范围,舵机就会出现超量程的故障,轻则齿轮打坏,重则烧坏舵机电路或者舵机里面的电机。360度舵机转动的方式和
推荐度:
导读机器人舵机说明一、舵机简介舵机,顾名思义,大海航行靠舵手,舵机早期是应用在航模中控制方向的,在航空模型中,飞行器的飞行姿态是通过调整发动机和各个控制多面来实现的,后来有人发现这种机器的体积小、重量轻、扭矩大、精度高,由于具备了这样的优点,很适合应用在机器人身上作为机器人的驱动。二、舵机的分类按照舵机的转动角度分有180度舵机和360度舵机。180度舵机只能在0度到180度之间运动,超过这个范围,舵机就会出现超量程的故障,轻则齿轮打坏,重则烧坏舵机电路或者舵机里面的电机。360度舵机转动的方式和
机器人舵机说明

一、舵机简介

舵机,顾名思义,大海航行靠舵手,舵机早期是应用在航模中控制方向的,在航空模型中,飞行器的飞行姿态是通过调整发动机和各个控制多面来实现的,后来有人发现这种机器的体积小、重量轻、扭矩大、精度高,由于具备了这样的优点,很适合应用在机器人身上作为机器人的驱动。

二、舵机的分类

按照舵机的转动角度分有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

    在程序中我们为舵机赋予不同的数值,舵机便能转动到对应的角度。

图3 舵机转动角度示意图 

4.2 舵机工作原理

1、舵机PWM信号定义

PWM信号为脉宽调制信号,其特点在于他的上升沿与下降沿之间的时间宽度。具体的时间宽窄协议参考下列讲述。我们目前使用的舵机主要依赖于模型行业的标准协议,随着机器人行业的渐渐,有些厂商已经推出全新的舵机协议,这些舵机只能应用于机器人行业,已经不能够应用于传统的模型上面了。

目前,HG14-M舵机可能是这个过渡时期的产物,它采用传统的PWM协议,优缺点一目了然。优点是已经产业化,成本较低,旋转角度大(目前所生产的都可达到185度);缺点是控制比较复杂,毕竟采用PWM格式。

但是它是一款数字型的舵机,其对PWM信号的要求较低:

(1)不用随时接收指令,减少CPU的疲劳程度;

(2)可以位置自锁、位置跟踪,这方面超越了普通的步进电机;

图4

其PWM格式注意的几个要点:

(1)高电平最少为0.5mS,为0.5-2.5mS之间;(对应舵机旋转0-180度)

(2)HG14-M数字舵机下降沿时间没要求,目前采用0.5Ms就行;也就是说PWM波形可以是一个周期1mS的标准方波。

2、PWM信号控制精度制定

上面已经提到了八位单片机,我们的舵机需要的是方波信号。单片机的精度直接影响了舵机的控制精度,这里就详细的说明一下。

我们采用的是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,关系入公式:

实际寄存器内的数值为:(#01H)01 ———(#0FAH)250。

共185度,分为250个位置,每个位置叫1DIV。则:

PWM高电平函数: 0.5mS + N×DIV

                 0uS ≤ N×DIV ≤ 2mS

                 0.5mS ≤ 0.5Ms+N×DIV ≤ 2.5mS

根据这些知识,我们就可以开始编程,并做一些初步的实验了,学会舵机控制是研究机器人的一个比较技术手段,需要完全掌握。

4.3 单舵机的控制程序

    我们已经知道了舵机的工作与控制原理,我们现在可以通过一个简单的程序来控制单个舵机的运转。如果您手头上有控制板和舵机,而且已经熟悉了KEIL软件和STC烧录软件,马上就可以试试了,如果您还不满足这些条件的话,也没什么关系,先来分析一下这段程序。

延时程序:用于产生所需的PWM信号

;; ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

; void delay_8us( )

                  RSEG  ?PR?delay_8us?Robot

delay_8us:                                        ;延时8US子程序    24周期

                  MOV     R1,#3

LP2_8us:          MOV     R2,#3

LP1_8us:          DJNZ    R2,LP1_8us

                  DJNZ    R1,LP2_8us

                  RET

; void delay_500us( )

                  RSEG  ?PR?delay_500us?Robot

delay_500us:                                    ;延时500US子程序  1500周期

                  MOV     R1,#32

LP2_500us:        MOV     R2,#45

LP1_500us:        DJNZ    R2,LP1_500us

                  DJNZ    R1,LP2_500us

                  RET

;; ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈; void delay_500ms( )

                  RSEG  ?PR?delay_500ms?Robot

delay_500ms:                                ;延时500MS子程序  1500000周期

                  MOV     R0,#242

LP3_500ms:        MOV     R1,#242

LP2_500ms:        MOV     R2,#24

LP1_500ms:        DJNZ    R2,LP1_500ms

                  DJNZ    R1,LP2_500ms

                  DJNZ    R0,LP3_500ms

                  RET

;; ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

                  END

单舵机PWM信号产生函数:

void PWM(uchar foot,uchar speed)

{    

    uchar i,j;

for(i=0;i    {

        P1|=0x01;             //将P1.0口拉高

        delay_500us();

        for(j=0;j        {

            delay_8us();

        }

        P1&=0xfe;                 //将P1.0口拉低

        for(j=0;j        {

            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

数组名      下标

01234567
position453015608098135155
kouchu(16进制)

0xfe0xfb0xfd0xf70xef0xbf0xdf0x7f

这八个舵机对应的理想波形如下:

图7 舵机控制理想输出波形-1

    我们将这八个舵机对应的数组position[8]各个元素从大到小排序,同时将数组kouchu[8]的各个元素也进行相应的调换,这样做的原因是不使单片机各引脚对舵机的对应控制关系不打乱,以前是怎么一一对应的,现在还是那样的对应,排序之后的列表如下:

表2 舵机程序控制数据对照表-2

数组名                下标

01234567
position155135988060453015
kouchu0x7f

0xbf0xdf0xef0xf70xfe0xfd0xfb
下图是排序后所对应的PWM理想波形:

图8 舵机控制理想输出波形-2

    通过对这一系列波形的观察,我们可以这样实现它,先将单片机上控制舵机的八路引脚电平同时间拉高,经过延时500+15*8(us)后,将position[7]对应的舵机信号输出引脚拉低,再经过(30-15)*8us 后拉低position[6]对应的舵机信号输出引脚,这样就依次求差延时,逐个拉低,知道所有的舵机都到达自己所要到达的位置。这样的话,我们在对position[8]数组排序之后还要进行一个求差处理。

uchar position[24];//uchar 既无符号字符型

uchar kouchu[8];

uchar paixu_ncha[8];

    上面说的是8个舵机并行控制的原理,但在实际应用中,由于有些机器人身上的舵机数目远不止8个,所以 写程序时还设置了一个paixu_ncha[8]数组,用来提供排序空间。具体做法如下:

第一步:定义数组 

第二部:给各个数组赋值

为了方便起见,这里的position[24]的值是一组假设值。

表3 position[24]数据对照表

下标01234567
元素值1201001453521019512755
下标89101112131415
元素值1243679316723515587
下标1617181920212223
元素值62154922014617621237
表4 kouchu[8]数据对照表

下标01234567
元素值0xfe0xfd0xfb0xf70xef0xdf0xbf0x7f

表5 paixu_ncha[8]数据对照表-1

下标01234567
元素值00000000
第三步:将position[24]中的数组前八个元素对应赋给paixu_ncha[8]数组。

赋值后paixu_ncha[8]各元素对应的值如下:

表6 paixu_ncha[8]数据对照表-2

下标01234567
元素值1201001453521019512755
第四步:将paixu_ncha[8]数组各元素从大到小排序

kouchu[8]数组元素也做相应的调整。

排序后得到的结果列表如下:

表7 paixu_ncha[8]数据对照表-3

数组名              下标

01234567
paixu_ncha

2101951451271201005535
kouchu0xef0xdf0xfb0xbf0xfe0xfd0x7f

0xf7

第五步:将paixu_ncha[8]数组作差处理

相邻元素作差结果存入前面的元素中,最后一个元素保留原值不变。

处理后的结果如下:

表8 paixu_ncha[8]数据对照表-4

下标01234567
元素值155018720452035
P1=0xff;                     //使口P1全部拉高

delay_500us();                    //调用延时500us函数

for(i=0;i<8;i++)               //延时输出到口P1(八路)

{

for(j=0;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、为了简化代码的书写过程,我们将“unsigned char”以及“unsigned int”简化定义为“uchar”和“uint”。

图9 “pwm.h”头文件位置

// ━━━━━━━━━━━━━━━━━━

// 宏定义(Acer definition)

// ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

#define uchar unsigned char

#define uint unsigned int

2、下面所用于声明的延时函数源于“SCT12C5410AD(12MHZ).asm”文件中定义,在此处声明以便于程序对于延时函数的调用。这里我们提供了“8us”、“500us”、“500ms”三种延时时长,若想获得更长的延时时间,只需通过循环函数增加延时次数以实现其效果。

// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// 函数声明(Function declaration)

// ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

extern void delay_8us();            //把delay_8us()声明为外部函数

extern void delay_500us();          //把delay_500us()声明为外部函数

extern void delay_500ms();          //把delay_500ms()声明为外部函数

    3、定义舵机控制部分代码所需要提供的数组。

// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

// 全局变量定义(Global variables defined)

// ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

uchar kouchu[8];            //用于提供信号输出引脚(低电平)

uchar paixu_ncha[8]=0;        //提供N差排序空间

uchar position[24]=0;        //用于记录24个舵机的位置(根据机器人实际需求选用)

4、数组对应端口说明(此部分为注释代码):

端口号 舵机编号  汇编存储器

左大腿: position[0] ━>> P1.0    0舵机     40H

左膝盖: position[1] ━>> P1.1    1舵机     41H

左脚踝: position[2] ━>> P1.2    2舵机     42H

右大腿: position[3] ━>> P1.3    3舵机     43H

右膝盖: position[4] ━>> P1.4    4舵机     44H

右脚踝: position[5] ━>> P1.5    5舵机     45H

左肩膀: position[6] ━>> P1.6    6舵机     46H

右肩膀: position[7] ━>> P1.7    7舵机     47H

左胯 : position[8] ━>> P2.0    8舵机     48H

左脚 : position[9] ━>> P2.1    9舵机     49H

右胯 : position[10]━>> P2.2   10舵机     4AH

右脚 : position[11]━>> P2.3   11舵机     4BH

左上臂: position[12]━>> P2.4   12舵机     4CH

左手 : position[13]━>> P2.5   13舵机     4DH

右上臂: position[14]━>> P2.6   14舵机     4EH

右手 : position[15]━>> P2.7   15舵机     4FH

5、根据动作需求控制舵机的运动。

// ──────────────────────────────────────

// 函数原型:void PWM_16()

// 函数名称:16路舵机输出子程序(16 Subroutine output Servos )

// 功    能:对临近数值做差,求出相对差值,用于延时。控制端口P1、P2

// 入口参数:无

// 返 回 值:无

// ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

void PWM_16()

{

uchar i=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            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            delay_8us();            //提供N×DIV动作要求高电平时长

        P2=P2&kouchu[7-i]; //将对应此时长的输出通道端口电平拉低,输出低电平,舵机开始动作

    }

}

// ────────────────────────────────────────

// 函数原型:void sorting()

// 函数名称:排序子程序(Sorting Subroutine)

// 功    能:对所有通道口的数值进行排序。

// 参    数:

// 返 回 值:无

// ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

void sorting()

{

    uchar i=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

    //通过冒泡法排序,将舵机目的位置数值按从小到大的顺序排列起来

for(i=0;i<=6;i++)

        for(j=i+1;j<=7;j++)        

            if(paixu_ncha[i]            {                                       //交换数据

                x=paixu_ncha[j];

                paixu_ncha[j]=paixu_ncha[i];

                paixu_ncha[i]=x;

                

                x=kouchu[j];

                kouchu[j]=kouchu[i];

                kouchu[i]=x;

            }        

}

6、根据动作需要将各端口输出通道按舵机目的位置的数值大小进行排序

7、将排好序的数值进行N差计算,得出每相邻的两个数值间的差值,用于累计延时获// ───────────────────────────────────────

// 函数原型:void N_value()

// 函数名称:N差子程序(N poor Subroutine)

// 功    能:对临近数值做差,求出相对差值,用于延时。

// 参    数:

// 返 回 值:无

// ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

void N_value()

{

    uchar i;        //定义循环变量

for(i=0;i<=6;i++)

        paixu_ncha[i]=paixu_ncha[i]-paixu_ncha[i+1];        // N差计算

}

得N×DIV动作要求高电平时长。

// ───────────────────────────────────────

// 函数原型:sao_wei(uchar saowei)

// 函数名称:扫尾子程序

// 功    能:控制舵机转动的速度和加速度

// 影    响:

// 入口参数:saowei,表示扫尾系数

// 返 回 值:无

// ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈

void sao_wei(uchar saowei)

{

    uchar i;                     //定义循环变量

for(i=0;i        delay_500us();            //调用延时500us函数

}

8、为舵机每一次动作提供间隔延时,用来控制其整体的动作速度

文档

机器人舵机说明

机器人舵机说明一、舵机简介舵机,顾名思义,大海航行靠舵手,舵机早期是应用在航模中控制方向的,在航空模型中,飞行器的飞行姿态是通过调整发动机和各个控制多面来实现的,后来有人发现这种机器的体积小、重量轻、扭矩大、精度高,由于具备了这样的优点,很适合应用在机器人身上作为机器人的驱动。二、舵机的分类按照舵机的转动角度分有180度舵机和360度舵机。180度舵机只能在0度到180度之间运动,超过这个范围,舵机就会出现超量程的故障,轻则齿轮打坏,重则烧坏舵机电路或者舵机里面的电机。360度舵机转动的方式和
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top