微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于STC89C52单片机的体操机器人系统设计

基于STC89C52单片机的体操机器人系统设计

时间:12-12 来源:互联网 点击:

1 引言
模仿人的形态和行为而设计制造的机器人可称为仿人型机器人,一般分别或同时具有与人类似的四肢和头部。仿人机器人研究集机械、电子、计算机、材料、传感器、控制技术等多门科学于一体,代表着一个国家的高科技发展水平。因此,世界发达国家都不惜投入巨资进行开发研究。体操机器人具有明显的类人特征,具有可独立运行的双臂和双腿,其中手臂部分具有不少于3个自由度,双腿部分具有不少于2个自由度。可实现双手俯卧撑,倒立劈叉,左、右单手俯卧撑,左、右侧滚翻360°,前、后滚翻360°等较为复杂的体操动作,是研究仿人形机器人技术的基础。

2 体操机器人的控制电路设计
本文设计的体操机器人控制部分主要采用STC89C52RC型单片机小系统作为控制核心,该型单片机是宏晶科技推出的新一代超强抗干扰/高速/低功耗的单片机,指令代码完全兼容传统8051单片机。其性能如下:
① 12时钟/机器周期和6时钟/机器周期任意选择。
② 工作频率范围:0-40MHz,实际工作频率可达48MHz。
③ 工作电压:5V-3.4V(5V单片机)/3.8-2.0V(3V单片机)。
④ 片上集成1280字节/512字节RAM。
⑤ 通用I/O口(32/36个)。P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O口时,需要加上拉电阻。
⑥ ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器,可通过串口(P3.0/P3.1)直接下载用户程序。
⑦ 工作温度:0-75℃/-40-+85℃。⑧ 封装:PDIP-40,PLCC-44、PQFP-44。
体操机器人控制小系统的PCB板设计图如图1所示:

该体操机器人的关节驱动电机使用的是辉盛MG996通用型舵机。MG996型舵机是辉盛最新大扭力标准金属齿舵机。速度,拉力和精确度都有相应提高,是目前市场上性价比最高的大扭力通用型舵机之一。其性能如下:
① 产品净重:55g。
② 产品尺寸:40.7×19.7×42.9mm。
③ 产品拉力:10.5kg/cm(4.8V),13kg/cm(6V)。
④ 反应速度:0.20sec/60degree(4.8v),0.17sec/60degree(6.0v)。
⑤ 工作电压:4.8-7.2V。
⑥ 工作温度:0℃-55℃。
其MG996型舵机的驱动方式也是采用PWM方式,因此在考虑驱动电压为6V时,输出扭力最大的使用条件,设计了采用TLP521型光电耦合器的驱动电压放大电路,其电路如图2所示:

3 体操机器人的机械结构设计
体操机器人的机械结构设计主要考虑机器人完成各种体操动作的可行性,例如:完成双手俯卧撑、单手俯卧撑、侧滚翻、前滚翻等动作。由于本机器人不做行走动作,因此在腿部的设计中没有增加更多自由度。在本体操机器人的结构设计中采用Siemens公司的UG结构模型设计软件,设计了机器人的全部结构零件。如图3所示:

仿人型机器人制作完毕后的实物图如图4所示:

4 仿人型机器人的控制程序设计
4.1 脉宽差控制算法
多路舵机控制的基本方法是顺序输出各路脉冲给不同舵机,利用单片机高速的处理速度来实现多路控制。但是这一类控制算法对于控制舵机的数目有限制,因为控制舵机所需的PWM波的典型周期是20ms,而每一路舵机所需的最大正脉宽长度为2.5ms,因此最多只能控制8路舵机。本系统中需要控制的舵机有10个,所以选择了改进的控制算法——脉宽差法。
脉宽差法控制分为以下几个步骤:
(1) 分组排序。将多路舵机控制数据每8路分为一组,对于每一组数据(控制脉冲长短),按照从小到大的顺序排序。
(2) 计算差值。计算舵机控制数据的差值并保存计算每组内相邻的两个数据的差值(数值大的数与数值小的数的差)并保存于差值数组中。该差值数组共有8 个存储单元,第一个单元存放的是该组舵机控制数据的最小值,从第二个单元开始存放舵机控制数据的差值。
(3) 数据转换。把差值数组中的数据转换为定时时间(即控制脉冲宽度差值),再继续转换为定时初值并保存于脉宽差数组中。
(4) 舵机控制。控制某一组舵机时,先向该组内所有舵机置高电平(启动舵机),然后把脉宽差数组中的第一个数据赋值给定时寄存器。定时中断发生时,先关断脉宽差数组中第一个数据所对应的舵机,再向定时寄存器中填入脉宽差数组中的第二个数据。依此类推,就可以完成该组所有舵机的控制。在一个控制周期(20ms)内,依次用定时器定时输出脉冲控制每组舵机。在第三组舵机控制毕后,继续定时用低电平补足其余时间以完成20ms。脉宽差法原理如图5所示。

4.2 脉宽差法的程序实现
这里介绍的实现方法是基于STC89C52单片机的C语言编写的。
方法一:使用一个定时器加软件延时实现。
使用一个定时器定时20ms的舵机周期。每一路舵机所需的0.5ms至2.5ms的正脉宽则不用定时器来实现,而是用延时程序来实现。给每一路舵机定义一个无符号整型数来表征舵机不同的转角。每一次进20ms中断时先将所有端口置“1”,然后开始计数,当计数值与舵机的给定值相等时就把对应的端口输出置“0”。这样改变给定值就能改变PWM波的占空比,从而控制舵机的转动。这种方法只用到了一个定时器,节约资源,用整型数代替舵机不同的转角,便于程序的编写。
void timer0() interrupt 1 using 1 //20ms到一次中断,定时中断T0
{
TH0=0x70;
TL0=0x00;
P0=0xFF;
P1=0xFF;
PWM();
}
void PWM()
{
uint counter = 0;
while(counter 130)
{
if(counter == num[0])
P10 = 0;
if(counter == num[1])
P11 = 0;
......
if(counter == num[9])
P07 = 0;
counter++;
}
}
方法二:使用两个定时器实现。
上一种方法的优点是程序简单,占用资源少。但是软件延时的时间与单片机的晶振频率和循环程序中语句的条数有关,即同一个数值代表的舵机转角并不是确定的。第二种方法用一个定时器定时20ms周期,另一个定时器定时100us(可以更改),来代替循环定时程序。从而增强了程序的通用性。
void timer1()interrupt3 using 2
{
static count;
count = count%25;
Count++;
if(count == num[0])
P00 = 0;
......
if(counter == num[9])
P07 = 0;
}
舵机控制程序采用模块化设计方式,增强了程序的可读性和可移植性,程序流程图如图6所示。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top