一、自由度
1.
机器人自由度分配
手臂----3×2 = 6
腿部----5×2 = 10
头部----1×1 = 1
总计自由度 = 17
手臂舵机----金属齿轮
腿部舵机----金属齿轮
头部舵机----塑料齿轮
图 为 HGR-3 人
形机器人除去胸
部件的示意图
图 中 机 器 人 的
17 个自由度,已
经 用 矢 量 法 标
出。
2. 机器人自由度编号
一般的,我们进行双足机器人研究时总是先从双腿入手,所以将腿部关节自
由度定为 1—10。
汉库公司机器人出厂自由度设置如下:
Z8
17
Z7
注意:机械系统中的自由度
编号与电子系统中的编号统
一,并能够与机器人操作软
件相对应。
P7
P8
P3
P 3
Z4
Z5
Z6
P4
P 4
P5
P 5
P6
P 6
P1
Z1
1PEEDE
Z2
Z3
P2
EE
一.舵机 PWM 信号介绍
1.PWM 信号的定义
PWM 信号为脉宽调制信号,其特点在于他的上升沿与下降沿之间的时间宽度。具体的时
间宽窄协议参考下列讲述。我们目前使用的舵机主要依赖于模型行业的标准协议,随着机器
人行业的渐渐独立,有些厂商已经推出全新的舵机协议,这些舵机只能应用于机器人行业,
已经不能够应用于传统的模型上面了。
目前,北京汉库的 HG14-M 舵机可能是这个过渡时期的产物,它采用传统的 PWM 协议,
优缺点一目了然。优点是已经产业化,成本低,旋转角度大(目前所生产的都可达到 185
度);缺点是控制比较复杂,毕竟采用 PWM 格式。
但是它是一款数字型的舵机,其对 PWM 信号的要求较低:
(1) 不用随时接收指令,减少 CPU 的疲劳程度;
(2) 可以位置自锁、位置跟踪,这方面超越了普通的步进电机;
图 1-1
其 PWM 格式注意的几个要点:
(1) 上升沿最少为 0.5mS,为 0.5mS---2.5mS 之间;
(2) HG14-M 数字舵机下降沿时间没要求,目前采用 0.5Ms 就行;也就是说 PWM 波形
可以是一个周期 1mS 的标准方波;
(3) HG0680 为塑料齿轮模拟舵机,其要求连续供给 PWM 信号;它也可以输入一个周
期为 1mS 的标准方波,这时表现出来的跟随性能很好、很紧密。
2.PWM 信号控制精度制定
我 们 采 用 的 是 8 位
AT89C52CPU,其数据分辨率为
256,那么经过舵机极限参数实
验,得到应该将其划分为 250 份。
那么 0.5mS---2.5Ms 的宽度
为 2mS = 2000uS。
2000uS÷250=8uS
则:PWM 的控制精度为 8us
我们可以以 8uS 为单位递增
控制舵机转动与定位。
舵机可以转动 185 度,那么
185 度÷250=0.74 度,
则:舵机的控制精度为 0.74 度
1 DIV = 8uS ; 250DIV=2mS
时基寄存器内的数值为:(#01H)01 ----(#0FAH)250。
共 185 度,分为 250 个位置,每个位置叫 1DIV。
则:185÷250 = 0.74 度 / DIV
PWM 上升沿函数: 0.5mS + N×DIV
0uS ≤ N×DIV ≤ 2mS
0.5mS ≤ 0.5Ms+N×DIV ≤ 2.5mS
三.单舵机拖动及调速算法
1.舵机为随动机构
图 1-2
(1)当其未转到目标位置时,将全速向目标位置转动。
(2)当其到达目标位置时,将自动保持该位置。
所以对于数字舵机而言,PWM 信号提供的是目标位置,跟踪运动要靠舵机本身。
(3)像 HG0680 这样的模拟舵机需要时刻供给 PWM 信号,舵机自己不能锁定目标位置。
所以我们的控制系统是一个目标规划系统。
(1)舵机的位置控制方法
舵机的转角达到 185 度,由于采用 8 为 CPU 控制,所以控制精度最大为 256 份。目前
经过实际测试和规划,分了 250 份。具体划分参见《250 份划分原理》。
将 0—185 分为 250 份,每份 0.74 度。
控制所需的 PWM 宽度为 0.5ms—2.5ms,宽度 2ms。
2ms÷250=8us;
所以得出:PWM 信号 = 1 度/8us;
0.5ms-2.5ms
0.5ms-30ms
舵机角度= 0.74×N
PWM = 0.5 + N×DIV;(DIV=8us)
角度
N
PWM
0
0
0.5ms
45
62
1ms
90
125
1.5ms
135
187
2ms
180
250
2.5ms
(2)HG14-M 舵机的运动协议
舵机的转动方向为:
逆时针为正转
Φ
Φ对应 N 值
N=#00H,Φ=0 度
N=#F5H,Φ=180 度
1 ≤ N ≤ 245
运动时可以外接较大的转动负载,舵机输出扭矩较大,而且抗抖动性很好,电位器的线
性度较高,达到极限位置时也不会偏离目标。
四.8 舵机联动单周期 PWM 指令算法
1.控制要求
要求同时发给 8 个舵机位置目标值,该指令的执行周期尽量短,目的有 2 个:
其一,是为了将来扩充至 24 舵机;其二,目标越快,舵机的转动速度越快;
我们以 8 路为 1 组或称 1 个单位,连续发出目标位置,形成连续的目标规划曲线,电机
在跟随过程中自然形成了位置与速度的双指标曲线,实现 8 路舵机联动。
2.注意事项
从 24 个端口,P0.0、P1.0 到 P2.0,单 DIV 循环的最小时间只有 8us,所以串行运算是
不行的,那么就采用并行运算。
目前采用的并行算法是 P0.0—P0.7 为一个基本单位,8 位一并。
实际案例:P1 口的 8 个位置个不相同;
端口
N 寄存器
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
position[0]
position[1]
position[2]
position[3]
position[4]
position[5]
position[6]
position[7]
目标位置(度) N 数值(整数) PWM 宽度(ms)
0
0.74
45
50
60
90
135
180
0
1
62.5
67.6
81.1
125
187.5
250
0.500
0.508
1.000
1.041
1.148
1.500
2.000
2.500
注意:N 为整数,依照上表看出,由于整数原因,定位不能实现的有 45 度、60 度等。
时间 T
T 为一个周期,分为 2 部分
1. PWM 宽
2. 延时等待
Tw
PWM
3.8 路 PWM 信号发生算法解析
我们预计将整个周期控制在 3.5-5ms 内;
由上图得知:P1 口的 8 个端在不同时间产生下降沿。
那么由上例如:我们的 P1.5 口,他的 N 为 125
那么就需要它在 125 个 DIV 后产生下降沿,时间为(125*8us=1000us)。
我们在其中发现 2 个关键参数:①时间参数 N=125
逻辑参数的定义:如下,采用&指令,操作 P1 口。
②逻辑参数 P1.5=#0DFH
P1.7
1
P1.6
1
P1.5
1
P1.4
1
P1.3
1
P1.2
1
P1.1
1
P1.0 备注
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
0
1
1
0
1
1
0
1
1
1
1
1
1
1
P1.0= #
FEH
P1.1= #
FDH
P1.2= #
FBH
P1.3= # F7H
P1.4= #
EFH
例如:将 P1.5 口产生下降沿,就将# 0DFH 去“&” P1 口。
逻辑“&”指令,冯“0”得“0”,不影响其他位。
具体的程序操作如下:
① 开 3.5ms 定时中断
② 取出 8 个端(P1.0-P1.7)的位置值,也就是 8 个 N 值;并赋予相应的端逻辑参数;
③ 将这 8 个值由大到小排列,相应端的逻辑参数值也随着 N 的顺序排列,一一对应;
④ 将 N 值做减法,求得:
M1=N1
M2=N2-N1
M3=N3-N2
M4=N4-N3
M5=N5-N4
M6=N6-N5
M7=N7-N6
M8=N8-N7
⑤ 取出 M1,延时 M1*DIV,& 相应的逻辑参数;
取出 M2,延时 M2*DIV,& 相应的逻辑参数;
取出 M3,延时 M3*DIV,& 相应的逻辑参数;
取出 M4,延时 M4*DIV,& 相应的逻辑参数;
取出 M5,延时 M5*DIV,& 相应的逻辑参数;
取出 M6,延时 M6*DIV,& 相应的逻辑参数;
取出 M7,延时 M7*DIV,& 相应的逻辑参数;
取出 M8,延时 M8*DIV,& 相应的逻辑参数;
⑥ 8 个端的下降沿全部产生完毕,等待一定的 Tw 值,或等待 3.5ms 中断的到来;
⑦ 中断到来后,清理中断标志,然后结束该程序。
注意事项:当进行逐个排序延时的过程中,CPU 要取出 M1、M2、M3….M8,那么会有 1
个取数指令周期,当 CPU 采用 12MHz 时为 1us。最终应该在第 8 个延时,即
M8 时扣除掉,具体指令参见指令集。
4.N 排序子程序 RAM 的制定
入口处
端口
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
N 值寄存器地址
position[0]
position[1]
position[2]
position[3]
position[4]
position[5]
position[6]
position[7]
&逻辑数寄存器地址
kouchu[0]
kouchu[1]
kouchu[2]
kouchu[3]
kouchu[4]
kouchu[5]
kouchu[6]
kouchu[7]
&逻辑数值
#FEH
#FDH
#FBH
#F7H
#EFH
#DFH
#BFH
#7FH
备注:position[7]寄存器内存放的是 P1.7 端口的 N 值;kouchu[7]寄存器内存放的是 P1.7
端口的&逻辑参数值;
出口处
从左到右为 N 值从大到小排列
(大 > N 值 > 小)
未知
未知
N 值寄存器地址 &逻辑数寄存器地址 &逻辑数值
paixu_ncha[0]
paixu_ncha[1]
paixu_ncha[2]
paixu_ncha[3]
paixu_ncha[4]
paixu_ncha[5]
paixu_ncha[6]
paixu_ncha[7]
kouchu[0]
kouchu[1]
kouchu[2]
kouchu[3]
kouchu[4]
kouchu[5]
kouchu[6]
kouchu[7]
未知
未知
未知
未知
未知
未知
所谓的“未知”:由于排列按照大到小顺序,“未知”内存放的为端口信息要根据排序
做相应的调整。
备注:paixu_ncha[0]内存放的是某位的 N 值,其值最大;
paixu_ncha[7]内存放的是某位的 N 值,其值最小;
kouchu[0]—kouchu[7]内存放数,可以根据其数值判断出是具体那个端口的下降沿。
例如:其值为“0xFB”那么它就是 P1.2;