基于单片机的多自由度机械手臂控制器设计
唐 山 学 院
毕 业 设 计
设计题目: 基于单片机的多自由度机械手臂控制器设计
系 别: 信息工程系
班 级: 11 电气工程及其自动化 3 班
姓 名: 刘亮
指 导 教 师: 田红霞
2015 年 6 月 1 日
基于单片机的多自由度机械手臂控制器设计
摘 要
机械臂控制器作为机械臂的大脑,对于它的研究有着十分重要的意义。随着微电子技术和控制方法的不断进步,以单片机作为控制器的控制系统越来越成熟。本课题正是基于单片机的机械臂控制系统的研究。
本文首先介绍了国内外机械臂发展状况以及控制系统的发展状况。其次,阐述了四自由度机械手臂控制系统的硬件电路设计及软件实现。详细阐述了机械臂控制系统中单片机及其外围电路设计、电源电路设计和舵机驱动电路设计。在程序设计中,着重介绍了利用微分插补法进行PWM调速的程序设计。并给出了控制器软件设计及流程图。最后,给出了系统调试中出现的软硬件问题,进行了详细的分析并给出了相应的解决办法。
关键词: 机械臂 单片机 自由度 舵机 PWM
Design of Multi DOF Manipulator Controller Based on MCU
Abstract
As the brain of robot arm, manipulator controller is very important for its research.With the development of microelectronics technology and control method, the control system of MCU is becoming more and more mature.This thesis is based on the research of the manipulator control system of MCU.Firstly,it is introduced the development of the manipulator and the control system at home and abroad.Secondly,it is given the circuit and software design for the four DOF manipulator in this disertation.it is expatiated the Single Chip Microcomputer(SCM),the relative circuit design ,Power circuit design,and driver circuit design of manipulator control system.In the design of the program, the design of PWM speed regulation by differential interpolation is introduced emphatically.The software design and flow chart of the controller are given.Finally,it is presented the problems of hardware and software in practive given resolves.Key word: Manipulator;MCU;DOF;Steering engine;PWM
1 引言 1
1.1 研究的背景和意义 1
1.2 国内外机械臂研究现状 2
1.2.1 国外机械臂研究现状 2
1.2.2 国内机械臂研究现状 3
1.3 机械臂控制器的发展现状 3
1.4 本设计研究的任务 4
2 机械结构与控制系统概述 5
2.1 机械结构 5
2.2 控制系统 6
2.3 系统功能介绍 8
2.4 舵机工作原理与控制方法 8
2.4.1 概述 8
2.4.2 舵机的组成 8
2.4.3 舵机工作原理 9
3 系统硬件电路设计 11
3.1 时钟电路设计 11
3.2 复位电路设计 11
3.3 控制器电源电路设计 12
3.4 舵机驱动电路 13
3.5 串口通信电路设计 13
4 系统软件设计 14
4.1 四自由机械臂轨迹规划 15
4.2 主程序设计 16
4.3 舵机调速程序设计 17
4.3.1 舵机 PWM 信号 17
4.3.2 利用微分插补法实现对多路 PWM 信号的输出 18
4.4 初末位置置换子程序 21
4.5 机械爪控制程序 22
4.6 定时器中断子程序 23
4.6.1 定时器 T1 中断程序 23
4.6.2 定时器 T0 中断子程序 24
5 系统软硬件调试 25
5.1 单片机系统开发调试工具 25
5.1.1 编程器 25
5.1.2 集成开发环境 Keil 和 Protues 25
5.2 控制系统的仿真 26
5.3 软件调试 27
5.4 硬件调试 27
5.5 软硬件联合调试 28
6 结论 29
谢辞 30
参考文献 31
附录 32
1引言
1.1 研究的背景和意义
机器人是传统的机械结构学结合现代电子技术、电机学、计算机科学、控制理论、信息科学和传感器技术等多学科综合性高新技术产物,它是一种拟生结构、高速运行、重复操作和高精度机电一体化的自动化设备。在研究和开发未知及不确定环境下作业的机器人的过程中,人们逐步认识到机器人技术的本质是感知、决策、行动和交互技术的结合 [1]。随着科技的不断进步尤其控制理论、材料学和传动结构学的发展以及制造工艺的进步,推动着机器人技术大跨步的向前发展。目前,各个领域的都有其专有的机器人为其服务,如移动机器人、微机器人、水下机器人、医疗机器人、军用机器人、空中空间机器人、娱乐机器人等 [2]。当今各领域的制造行业都有其自动化流水线,例如,汽车自动化生产流水线就主要由工业机器人组成。机器人与其他相应的制造设备的最大的优点是,其对生产环境有着极大的适应性和对各种任务的拓展性。目前工业机器人已和最初的仿人型机器人有着很大的区别,更加符合各种不同生产制造领域的特殊要求,其中,目前,大多数工业机器人的形状类似人的手臂,能模拟人的手臂的部分动作,按预定的程序轨迹及其它要求,实现抓取、搬运工作或操纵工具的自动化装置 [3]。它们通常用于代替人的繁重劳动以解决人的生存,生产的难题,实现生产的机械化和自动化,能在有害环境下操作以保护人身安全,因而广泛应用于机械制造、冶金、电子、轻工业和原子能等行业 [4]。
近年来工业机器人在工厂自动化改革中发挥着巨大的作用,代替人处理一些重复性、精密性、高工作负荷的工作,大大加快了生产效率,缩减了生产周期。如汽车自动化生产线中的机器人的无缝焊接,钢厂里的钢材分拣机器人的搬运打捆,都用到了工业机器人(机械臂)。
各生产领域专有的机器人能够使生产效率更高,降低损失,节约成本。随着机器人技术的发展,当前的工业机械手臂的结构更加的简单,大多数为模块化的,因此,能够做到易于维护、容易扩展到更多的自由度,并且其动作能够具有较高的灵活性。对于机械手臂的控制器设计,希望使用复杂高效的控制算法使机械手臂实现更高的控制性能,更精确的定位精度。并希望其控制拥有较好的系统稳定性并有较强的可扩展性。
1.2 国内外机械臂研究现状
1.2.1 国外机械臂研究现状
世界上第一台工业机器人(机械手臂)诞生在美国,1954 年美国人乔治·德沃尔研制了世界上第一台可编程机器人样机。从第一台机械手臂诞生以来的 60 多年里,人类对机械手臂的热情不但没有丝毫减弱,反而越来越多的人投入到机械臂的研究和制造中。1969 年,世界上第一条自动化汽车生产线由美国通用汽车公司用 21 台工业机器人组成。美国凭借其机器人技术全面、先进、适应性强在国际上仍一直处于领先地位。
日本在 1967 年,由丰田纺织自动化公司从美国引入第一台工业机器人,开始了日本的工业机器人发展时代。1976 年 以后,随着微电子 的快速发展和 市场需求 急剧增加,日本当时 经济增长迅速,劳动力显著不足,工业机器人 的出现使 企业 犹如获得了救命稻草,使其 日本工业 机器人得到快速发展。日本现有的工业机器人保有量位居世界第一,素有 “ 机器人王国 ” 之称 [ 5 ]。
工业机器人在欧洲的发展也非常快,1973 年 ABB 公司研制的 IRB6 机器人,是世界上第一台全自动微型处理器控制的机器人。同年库卡机器人也推出了自己的第一台机器人 FAMULUS,它是第一个由 6 个电机驱动的关节机器人。大多数欧洲国家政府比较重视工业机器人的发展,比如法国规定,对于一些危险、有毒、有害的工作岗位,必须以机器人来代替普通人的劳动。德国由于其先进的工业体系,政府通过大力支持一系列研究计划,建立了一个完整的 工业机器人科学技术体系,使 德国 机器人 技术一直处于领先的地位。近些年,意大利、瑞典、英国、俄罗斯、乌克兰 等国家由于自身国内机器人市场的 巨大 需求 和国际上机器人市场的激烈竞争,发展速度 也 非常迅速。
目前,世界上工业机器人生产厂家主要集中在日本和欧美。日系生产厂家组要有三菱、发那科、松下、川崎、安川等。欧系中具有代表性的有,瑞典的 ABB、德国的 KUKA、美国的 Adept、意大利的 COMAU 及奥地利的 IGM 公司。下面以 KUKA 最新研制的小型机器人 KR 6 R700 fivve 为代表介绍当前工业机器人的最新技术,KR AGILUS fivve 是一个五自由度的机械臂,它的特点是极高的作业速度和极高的精确度。因为它的体积小,占用空间很小,可选择安装地面、天花板等位置,因此 KR AGILUS fivve 的安装适用能力极高。KR AGILUS fivve 的重量 48kg,最大负荷是 6kg,最大工作半径是 7067mm, 重复精确度为
void vpwm();
void change(void);
void jiazi(void);
uint16 pos[2][5]={
{1000,1200,2000,1000,1500}, // 此节扩展成 4 个舵机,则此处变为两个数组。
{1000,500,1400,1650,500} // 数组中的 1~4 成员代表每一个舵机的两个位置。
};
uint16 pwm[5]={1500,900,1700,1300,1500};// 定时器 T0 取定时值从这里取
uint16 pwm0[3]={500,2100,1500};// 定时器 T1 初值从这里取
uint16 pwmj;
uint8 flag_vpwm=0;// 表示到达了该更新 pwm[] 的时间
uint16 n=1000;// 用来计算需要建立多少个中间数据
uint16 m=1;// 用来累计已经执行了多少中间数据
double dp;
double dp0[5];// 微分插补增量
uint8 point_now=0;// 与 point_aim 一起标记缓存出口位置,即取数位置
uint8 point_aim=1;
void main(void)
{
Timer_init();// 定时器初始化
Timer0(31);// 进入定时器循环
Timer1(31);
P0M1=0;// 设置 P 口为强推免输出模式,下同
P0M0=0XFF;
P1M1=0;
P1M0=0XFF;
P2M1=0;
P2M0=0XFF;
P3M1=0;
P3M0=0XFF;
P4M1=0;
P4M0=0XFF;
P5M1=0;
P5M0=0XFF;
P4SW|=0X70;
change();
while(1)
{
if(flag_vpwm==1)// 每进一次定时器中断 flag_vpwm 被置位为 1
{ vpwm();// 更新 pwm[] 数组,角度增加一个插补量
flag_vpwm=0;
}
}
}
/*******************************************************************
函 数 名: change()
功能描述:初位置末尾置更替
:有效的数据是插补增量,和插补次数,知道这两个量,和当前初位置即可
******************************************************************/
void change(void)
{
uint8 s;
if(point_aim==1)// 首末位置互换,实现舵机摆动
{
point_aim=0;
point_now=1;
}
else
{
point_aim=1;
point_now=0;
}
n=pos[point_aim][0];// 计算新的插补次数
for(s=1;s<5;s++)// 计算新的插补增量
{
if(pos[point_aim][s]>pos[point_now][s])// 目标角度值比当前角度值大
{
dp=pos[point_aim][s]-pos[point_now][s];
dp0[s]=dp/n;// 插补增量为正
}
if(pos[point_aim][s]<=pos[point_now][s])// 目标角度值比当当前角度值小
{
dp=pos[point_now][s]-pos[point_aim][s];
dp0[s]=dp/n;
dp0[s]=-dp0[s];// 插补增量为负
}
}
m=0;//m 清 0
}
/*******************************************************************
函数名: jiazi()
功能描述:夹子开合函数
*******************************************************************/
void jiazi()
{
static uint8 k=1;
switch(k)
{
case 1:
pwmj=pwm0[1];
break;
case 2:
{
pwmj=pwm0[2];
k=0;
}break;
default:break;
}
k++;
}
/*******************************************************************
函 数 名: pwm[] 数组更新函数
功能描述:数据插补,由 Timer0 控制,使舵机平滑实现速度控制
:另一个功能是执行完一行后去更新下一行数据,即调用 change()
*******************************************************************/
void vpwm(void)
{
uint8 j=0;
uint8 how=0;// 用来记录到达目标位置的舵机个数
static uint8 flag_how;// 用来表示是不是 4 个舵机都达到目标位置,是则置 1
static uint8 flag_Tover;// 用来表示运行时间是否结束,结束则置 1
m++;// 用来累加插补过的次数
if(m==n)//n 是本行作业要插补的总次数
flag_Tover=1;// 一行数据的执行时间已经完成for(j=1;j<5;j++)
{
if(((pwm[j]-pos[point_aim][j])<5)||((pos[point_aim][j]-pwm[j])<5))
{ // 检测靠近终点位置
how++;// 是,则累加一个
pwm[j]=pos[point_aim][j];// 并且直接过度到终点位置
}
else // 不靠近终点,继续插补
pwm[j]=pos[point_now][j]+m*dp0[j];
}
if(how==4)
flag_how=1;//4 个舵机都到达终点
how=0;
if((flag_Tover==1)&&(flag_how==1))
{ // 从插补次数,和脉宽宽度两方面都到达终点,本作业行完成flag_Tover=0;
flag_how=0;
jiazi();// 改变夹子状态
change();// 更新角度
}
return;
}
/*******************************************************************
该文件中放的都是与定时器相关的一些函数
*******************************************************************/
#include<12c5a.h>//STC12C5A 系列单片机
extern uint16 pwm[];
extern uint8 flag_vpwm;
extern uint16 pwmj;
sbit pwm3=P0^3;
sbit pwm2=P0^2;
sbit pwm1=P0^1;
sbit pwmn=P0^0;
/******************************************************************* 函数名: timer_init()
功能: 定时器初始化函数
备注: 1T
*******************************************************************/
void Timer_init()
{
EA=1;// 开总中断
AUXR|=0x80;//T0 工作在 1T,T1 工作在 12T
TMOD|= 0x11;//T0,T1 工作在方式 1,16 位
ET0 = 1;// 开定时器 0 中断
ET1 = 1;
}
/******************************************************************* 函数名: timer0(uint32 us)
功能: 定时器 0 定时函数
参数: us, 毫秒。精确定时。
备注: 晶振 12M,工作模式 1T
*******************************************************************/
void Timer0(uint32 us)
{
uint32 valu;
valu=us*12;// 工作在 1T,最大定时时间 2700us
valu=valu;
valu=0xffff-valu;
TH0=valu>>8;
TL0=(valu<<8)>>8;
TR0 = 1;//T0 开始工作
}
/*******************************************************************
函数名: timer1(int16 us)
功能: 定时器 1 定时函数
参数: us, 毫秒。精确定时。
备注: 晶振 12M,工作模式 12T
*******************************************************************/
void Timer1(uint32 us)
{
uint32 valu;
valu=0xffff-us;
TH1=valu>>8;
TL1=(valu<<8)>>8;
TR1 = 1;//T1 开始工作
}
/*******************************************************************
函数名: T0zd(void)interrupt 1
功能: 定时器 0 中断函数
备注: 控制 4 个舵机
*******************************************************************/
void T0zd(void)interrupt 1
{
static uint8 i=1;
switch(i)
{
case 1:
{
pwm1=1;
Timer0(pwm[1]);// 定时
flag_vpwm=1;
} break;
case 2:
{
pwm1=0;//pwm1 变低
Timer0(5000-pwm[1]);// 定时
flag_vpwm=1;
} break;
case 3:
{
pwm2=1;//pwm2 变高
Timer0(pwm[2]);// 定时常数为 pwm[2]
flag_vpwm=1;
} break;
case 4:
{
pwm2=0;//pwm2 变低
Timer0(5000-pwm[2]);// 定时常数为 pwm[2]
flag_vpwm=1;
} break;
case 5:
{
pwm3=1;//pwm3 变高
Timer0(pwm[3]);// 定时常数为 pwm[3]
flag_vpwm=1;
} break;
case 6:
{
pwm3=0;//pwm3 变低
Timer0(5000-pwm[3]);// 定时
flag_vpwm=1;
} break;
case 7:
{
pwm4=1;//pwm4 变高
Timer0(pwm[4]);// 定时
flag_vpwm=1;
} break;
case 8:
{
pwm4=0;//pwm4 变低
Timer0(5000-pwm[4]);// 定时
flag_vpwm=1;
} break;
default:break;
}
i++;
}
/*******************************************************************
函数名: T1zd(void)interrupt 1
功能: 定时器 1 中断函数
备注: 控制夹子舵机
*******************************************************************/
void T1zd(void)interrupt 3
{
static uint8 i=1;
switch(i)//
{
case 1:
{
pwmn=1;
Timer1(pwmj);// 定时
} break;
case 2:
{
pwmn=0;//pwm 变低
Timer0(20000-pwmj);// 定时
i=0;
} break;
default:break;
}
i++;
}
#ifndef TIMER
#define TIMER
extern Timer_init();
extern Timer0(uint32 us);
extern Timer1(uint32 us);
#endif
版权声明:
1.大文斗范文网的资料来自互联网以及用户的投稿,用于非商业性学习目的免费阅览。
2.《基于单片机的多自由度机械手臂控制器设计》一文的著作权归原作者所有,仅供学习参考,转载或引用时请保留版权信息。
3.如果本网所转载内容不慎侵犯了您的权益,请联系我们,我们将会及时删除。
本栏目阅读排行
- 1《其多列》教学设计3篇
- 2多声部歌唱教学设计(精选7篇)
- 3其多列教学设计(共17篇)
- 4汽车差速器设计与分析机械毕业设计论文
- 5我祖国多辽阔-教学设计和教学反思
- 6初二语文《多一些宽容》说课设计
- 7可爱的动物多文本教学设计(通用8篇)
- 8卧式单面多轴钻孔组合机床液压系统设计
- 9小学校园防欺凌主题班会教学设计多篇
- 10阀盖零件机械加工工艺规程及夹具设计课程设计
- 11开题报告-柱塞泵零件机械加工工艺规程及夹具设计
- 12小学二年级语文上册《酸和甜》教学设计多篇
- 13三年级上册道德与法治第10课《父母多爱我》教学设计
- 14《求比一个数的几倍多(或少)几的数》教学设计
- 15「部编版」二年级下语文18、《太空生活趣事多》优质课教学设计
