机器人硬件电路设计.doc_第1页
机器人硬件电路设计.doc_第2页
机器人硬件电路设计.doc_第3页
机器人硬件电路设计.doc_第4页
机器人硬件电路设计.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

本科学年论文简易人形机器人的设计院 系 电子信息工程学院自动化系专业名称 自 动 化 年 级 2008 级 学生姓名 张宇哲 学 号 00824058 指导教师 仲 兆 楠 日 期 2011年09月摘 要本文介绍的人形机器人采用新华龙公司的C8051F310单片机为控制核心,利用舵机完成人形机器人的各种动作。该人形机器人可以完成下蹲、起立、走步,侧移和踢球等动作。舵机均采用单片机C8051F310内部的PCA模块产生的PWM波调节其转向和转角的大小从而实现人形机器人的各种动作。关键字:C8051F310 舵机 PCA模块 PWMDesign and Realization Humanoid Robot Based on MCUAbstractHumanoid Robot that is described in this article is using Nc Dragon single-chip microcomputer as control core,using rudder to complete various action。The Humanoid Robot can complete the squatting , standing up , walking , lateral moving and kicking actions. Rudder is controlled by PWM waves produced by C8051F310 MCU internal PCA module . Those actions is achieved through adjusting steering and rudder angle .Keywords: C8051F310 Rudder PCA module PWM目录概述3硬件电路设计3一电源电路3二单片机电路3三RS 485总线 4 四舵机电路4五PCB制作5软件设计7 一主板程序7 二子板程序22总结27附录28概述本次的设计主题为人形机器人,主要对人形机器人的腿部进行设计与制作。使用新华龙C8051F310单片机作为主控芯片。通过该单片机的PCA模块产生的PWM波来控制舵机的运动。对腿部的控制需要三块电路板,一块主控板,两块从板。主控板主要用来通过485总线向从板发送数据指令,而从板则接收主板的指令来完成相应的控制。舵机的具体动作时依靠从板的控制来实现的。硬件电路设计本次所设计的机器人是由新华龙C8051F310控制,两条人形机械腿由十二个舵机组成由三块电路板控制。且三块电路板由三名组员分别设计完成。其中一块主控板控制两块从板,通过485总线进行通信,从而实现机械腿的协调动作。我主要负责从板的设计与制作,以下将从板的设计进行说明。一 电源电路 电源芯片采用AZ1084和LM1117。其中AZ1084输入电压为7.2v,输出电压为5v,LM1117输入电压为5v,输出电压为3.3v。F310单片机的工作电压是3.3v,因此需要经过两次降压达到3.3v。为了稳定工作电压,采用IB0505LS来稳定单片机的工作电压。二单片机电路单片机及用来调试的接口电路如下:本单片机的晶振为32.768MHZ,但是在后期的测试发现外部晶振输出不稳定,因此采用的是内部晶振。我们所设计的机器人总共有12个舵机,而这款F310最多只能输出5路PWM,因此需要3块板子。三RS485总线本设计采用485总线进行通信通过主板发出指令来控制从板从而控制各个舵机的工作:四舵机控制电路每块从板上共有六组舵机驱动,用P117光耦进行隔离电路图如下:五PCB制作:PCB制作如下:一下分别为PCB设计图以及对应的3D图程序设计本设计的程序一C语言来编写。程序的初始化可通过新华龙公司的专用软件(configuration wizard2)来完成,不用编程者自己完成,所以初始化相对方便。程序的主体部分由两部分组成,一部分为主板程序,控制单片机用串口模块来向从板发指令,主板的程序只发送相应的指令来协调舵机的运动。而从板的程序主要用来接受指令,并且是相应的舵机作出相应的动作。具体的动作实在从板的程序中完成的。程序设计如下:一主板程序void Uart_Send(unsigned charx)SBUF0=x;while(!TI0);TI0=0;void PCA_Init() PCA0CN = 0x40; PCA0MD &= 0x40; PCA0MD = 0x02; PCA0CPM0 = 0xC2; PCA0CPM1 = 0xC2; PCA0CPL0 = 0x49; PCA0CPL1 = 0x43; PCA0CPH0 = 0xEC; PCA0CPH1 = 0xEB;void Port_IO_Init() / P0.0 - Skipped, Open-Drain, Digital / P0.1 - Skipped, Open-Drain, Digital / P0.2 - Skipped, Open-Drain, Digital / P0.3 - Skipped, Open-Drain, Digital / P0.4 - TX0 (UART0), Open-Drain, Digital / P0.5 - RX0 (UART0), Open-Drain, Digital / P0.6 - CEX0 (PCA), Open-Drain, Digital / P0.7 - CEX1 (PCA), Open-Drain, Digital / P1.0 - Unassigned, Open-Drain, Digital / P1.1 - Unassigned, Open-Drain, Digital / P1.2 - Unassigned, Open-Drain, Digital / P1.3 - Unassigned, Open-Drain, Digital / P1.4 - Unassigned, Open-Drain, Digital / P1.5 - Unassigned, Open-Drain, Digital / P1.6 - Unassigned, Open-Drain, Digital / P1.7 - Unassigned, Open-Drain, Digital / P2.0 - Unassigned, Open-Drain, Digital / P2.1 - Unassigned, Open-Drain, Digital / P2.2 - Unassigned, Open-Drain, Digital / P2.3 - Unassigned, Open-Drain, Digital P0SKIP = 0x0F; XBR0 = 0x01; XBR1 = 0x42;void Oscillator_Init() OSCICN = 0x82;void Timer_Init() TCON = 0x40; TMOD = 0x20; CKCON = 0x01; TL1 = 0x61; TH1 = 0x61;void UART_Init() SCON0 = 0x10;void Interrupts_Init() IP = 0x10; IE = 0x80;/ Initialization function for device,/ Call Init_Device() from your main programvoid Init_Device(void) PCA_Init(); Port_IO_Init(); Oscillator_Init(); Timer_Init(); UART_Init(); Interrupts_Init();以上为CONCIGRITION WIZARD2程序所生成的初始化程序,程序中对PCA,定时器,串口,以及各个端口进行初始化设置。voidDelay(unsigned int x)unsigned int y,z;for(y=0;yx;y+)for(z=0;z50;z+);void Uart_Send(unsigned charx)SBUF0=x;while(!TI0);TI0=0;以上为主程序中使用的延时以及串口发送子程序,由于主板只需要发送数据,所以只有数据发送程序。以下为主板中控制各个动作的子程序,所执行的动作有站立,行走,左移,蹲下,站起,踢腿。每个动作都以for循环来实现,目的是使舵机的偏角一点点改变,不至于一下子打到设定的位置。void Walk(void)uchar i;for(i=0;i11;i+) /右腿2,3,4关节抬起。Uart_Send(walk_you_2);Uart_Send(64-3*i);Delay(5);Uart_Send(walk_you_3);Uart_Send(93+2*i);Delay(5);Uart_Send(walk_you_4);Uart_Send(136-i);Delay(5);Uart_Send(walk_zuo_1); /左腿1,5关节调节重心位置Uart_Send(142-i);Delay(2);Uart_Send(walk_zuo_5);Uart_Send(143+i);Delay(200);Delay(1500);for(i=0;i0;i-)Uart_Send(walk_you_2);/ 右腿伸直Uart_Send(64-3*i);Delay(5);Uart_Send(walk_you_3);Uart_Send(93+2*i);Delay(5);Uart_Send(walk_you_4);Uart_Send(136-i);Delay(5);Uart_Send(walk_zuo_1);Uart_Send(142-i);Delay(2);Uart_Send(walk_zuo_2);/左腿伸直Uart_Send(45-i);Delay(2);Uart_Send(walk_zuo_3);Uart_Send(91-i);Delay(2);Uart_Send(walk_zuo_4);Uart_Send(50-i);Delay(200);Delay(1500);for(i=0;i11;i+)Uart_Send(walk_zuo_2);/左腿抬起迈步 Uart_Send(45+i*3);Delay(5);Uart_Send(walk_zuo_3);Uart_Send(91-2*i);Delay(5);Uart_Send(walk_zuo_4);Uart_Send(50+i);Delay(5);Uart_Send(walk_you_1);/调节重心Uart_Send(20+i);Delay(2);Uart_Send(walk_you_5);Uart_Send(30+i);Delay(200);Delay(1500);for(i=0;i0;i-)Uart_Send(walk_zuo_2);/左腿伸直 Uart_Send(45+i*3);Delay(5);Uart_Send(walk_zuo_3);Uart_Send(91-i*2);Delay(5);Uart_Send(walk_zuo_4);Uart_Send(50+2*i);Delay(5);Uart_Send(walk_you_1);Uart_Send(20+i);Delay(2);Uart_Send(walk_you_2);/右腿伸直Uart_Send(65+i);Delay(2);Uart_Send(walk_you_3);Uart_Send(93+i);Delay(5);Uart_Send(walk_you_4);Uart_Send(136+i*2);Delay(200);Delay(1500);void Stop()Uart_Send(walk_you_1);Uart_Send(13);Delay(5);Uart_Send(walk_zuo_1);Uart_Send(142);Delay(100);Uart_Send(walk_you_2);Uart_Send(65);Delay(5);Uart_Send(walk_zuo_2);Uart_Send(45);Delay(100);Uart_Send(walk_you_3);Uart_Send(91);Delay(5);Uart_Send(walk_zuo_3);Uart_Send(93);Delay(100);Uart_Send(walk_you_4);Uart_Send(136);Delay(5);Uart_Send(walk_zuo_4);Uart_Send(50);Delay(100);Uart_Send(walk_you_5);Uart_Send(32);Delay(5);Uart_Send(walk_zuo_5);Uart_Send(143);Delay(100);void Dunxia()uchar i;/蹲下for(i=0;i16;i+)Uart_Send(walk_you_4);Uart_Send(136+2*i);Delay(2);Uart_Send(walk_zuo_4);Uart_Send(50-2*i);Delay(2);Uart_Send(walk_you_3);Uart_Send(93+i*4);Delay(2);Uart_Send(walk_zuo_3);Uart_Send(91-i*4);Delay(2);Uart_Send(walk_you_2);Uart_Send(65-i*3);Delay(2);Uart_Send(walk_zuo_2);Uart_Send(45+i*2);Delay(500);for(i=0;i0;i-)Uart_Send(walk_you_4);Uart_Send(136+2*i);Delay(2);Uart_Send(walk_zuo_4);Uart_Send(50-2*i);Delay(2);Uart_Send(walk_you_3);Uart_Send(93+i*4);Delay(2);Uart_Send(walk_zuo_3);Uart_Send(91-i*4);Delay(2);Uart_Send(walk_you_2);Uart_Send(65-i*3);Delay(2);Uart_Send(walk_zuo_2);Uart_Send(45+i*2);Delay(500);void Dunxia_bf_Left_Move()uchar i;for(i=0;i0;i-)Uart_Send(walk_zuo_2);Uart_Send(45+3*i);Delay(2);Uart_Send(walk_you_2);Uart_Send(65-3*i);Delay(2);Uart_Send(walk_zuo_3);Uart_Send(91-2*i);Delay(2);Uart_Send(walk_you_3);Uart_Send(93+2*i);Delay(2);Uart_Send(walk_zuo_4);Uart_Send(50-i);Delay(2);Uart_Send(walk_you_4);Uart_Send(136+i);Delay(400);void Left_Move()uchar i;for(i=0;i0;i-)Uart_Send(walk_you_1);Uart_Send(20-i);Delay(2);Uart_Send(walk_you_5);Uart_Send(30+i);Delay(500);Delay(2000);for(i=10;i0;i-)Uart_Send(walk_zuo_2);/左腿伸直Uart_Send(75+3*i);Delay(2);Uart_Send(walk_zuo_3);Uart_Send(71-2*i);Delay(2);Uart_Send(walk_zuo_4);Uart_Send(40+i);Delay(2);Uart_Send(walk_zuo_1);Uart_Send(142-2*i);Delay(2);Uart_Send(walk_zuo_5);Uart_Send(143+2*i);Delay(2);/Uart_Send(walk_you_2);/右腿后蹬/Uart_Send(65-3*i);/Delay(2);Uart_Send(walk_you_3);Uart_Send(103+i);Delay(2);Uart_Send(walk_you_4);Uart_Send(136+i);Delay(2);Uart_Send(walk_you_1);Uart_Send(30-i);Delay(2);Uart_Send(walk_you_5);Uart_Send(20+i);Delay(500);Delay(5000);for(i=0;i0;i-)Uart_Send(walk_zuo_1);Uart_Send(142-i);Delay(2);Uart_Send(walk_zuo_5);Uart_Send(143-i);Delay(2);Uart_Send(walk_you_2);Uart_Send(35-2*i);Delay(2);Uart_Send(walk_you_3);Uart_Send(113+2*i);Delay(2);Uart_Send(walk_you_4);Uart_Send(146+2*i);Delay(2);Delay(500);Delay(5000);void kick_ball()uchar i;for(i=0;i11;i+)/重心左移Uart_Send(walk_zuo_1);Uart_Send(142-2*i);Delay(2);Uart_Send(walk_zuo_5);Uart_Send(143-2*i);Delay(2);Uart_Send(walk_you_5);Uart_Send(30-2*i);Delay(500);Delay(10000);for(i=0;i11;i+)/向后方抬起右腿Uart_Send(walk_you_2);Uart_Send(65+5*i);Delay(2);Uart_Send(walk_you_3);Uart_Send(91+2*i);Delay(2);Delay(1000);Delay(20000);for(i=0;i4;i+)/向前踢大腿Uart_Send(walk_you_2);Uart_Send(15+20*i);/Delay(2000);/Delay(20000);for(i=0;i6;i+)/向前踢小腿部分Uart_Send(walk_you_3);Uart_Send(111-11*i);Delay(2);Uart_Send(walk_you_4);Uart_Send(136-6*i);Delay(2);/Delay(2000);Delay(5000);for(i=0;i0;i-) /重心调回Uart_Send(walk_zuo_1);Uart_Send(142-2*i);Delay(2);Uart_Send(walk_zuo_5);Uart_Send(143-2*i);Delay(2);Uart_Send(walk_you_5);Uart_Send(30-2*i);Delay(1500);Delay(20000);以下为主板主程序,其通过for循环以及简单的子程序调用来实现各个动作的顺序执行void main()uchar num=0;uchar walk_flag=0,dunxia_flag=1,left_move_flag=0,kick_flag=0;Init_Device();P1_0 = 1;Delay(50000);for(;)if(dunxia_flag=1)Stop();Delay(20000);Delay(20000);Dunxia();Delay(20000);num+;if(num3)num=0;stop();dunxia_flag=0;walk_flag=1;Delay(50000); if(walk_flag=1)num+;Walk();if(num15)num=0;Stop();left_move_flag=1;walk_flag=0;Delay(50000);if(left_move_flag=1)num+;Dunxia_bf_Left_Move();Delay(20000);Left_Move();Delay(20000);stand_af_Left_Move();Delay(20000);if(num6)num=0;stop();left_move_flag=0;kick_flag=1;Delay(50000);if(kick_flag=1)num+;kick_ball();Delay(20000);stop();if(num4)num=0;stop();kick_flag=0;dunxia_flag=1;Delay(50000);二 子板程序子板程序主要对接收的舵机号以及偏角进行处理,从而控制舵机的动作。因为其比较简单,所以只做简单叙述。具体程序如下(为左腿的控制程序但左右腿控制程序完全一致,顾不做重复介绍):#include c8051f310.h#define uchar unsigned char#define uint unsigned intsbitP2_7 = P2 7;#define walk_zuo_1 186 /定义变量来指定具体控制哪个舵机工作#define walk_zuo_2 187 /其舵机号的设定与主板所发指令的舵机号相同#define walk_zuo_3 188#define walk_zuo_4 189#define walk_zuo_5 190#definewalk_mark 222ucharmark;uchar act,arc;/ Peripheral specific initialization functions,/ Called from the Init_Device() functionvoid Init_Variables()act=0;arc=0;void PCA_Init() /由软件生成的初始化程序PCA0CN = 0x40; PCA0MD &= 0x40; PCA0MD = 0x02; PCA0CPM0 = 0xC2; PCA0CPM1 = 0xC2; PCA0CPM2 = 0xC2; PCA0CPM3 = 0xC2; PCA0CPM4 = 0xC2; /* PCA0CPL0 = 0xA5; PCA0CPL1 = 0x99; PCA0CPL2 = 0x51; PCA0CPL3 = 0x1E; PCA0CPL4 = 0x8F; PCA0CPH0 = 0xFB; PCA0CPH1 = 0xF9; PCA0CPH2 = 0xF8; PCA0CPH3 = 0xE5; PCA0CPH4 = 0xE2;*/PCA0CPL0 = (uchar)(uint)(31*141.6+58000)%256);PCA0CPH0 = (uchar)(31*141.6+58000)/256);PCA0CPL1 = (uchar)(uint)(31*45.3+58000)%256);PCA0CPH1 = (uchar)(31*45.3+58000)/256);PCA0CPL2 = (uchar)(uint)(31*90.8+58000)%256);PCA0CPH2 = (uchar)(31*90.8+58000)/256);PCA0CPL3 = (uchar)(uint)(31*49.7+58000)%256);PCA0CPH3 = (uchar)(31*49.7+58000)/256);PCA0CPL4 = (uchar)(uint)(31*147.9+58000)%256);PCA0CPH4 = (uchar)(31*147.9+58000)/256);void Port_IO_Init() / P0.0 - CEX0 (PCA), Push-Pull, Digital / P0.1 - CEX1 (PCA), Push-Pull, Digital / P0.2 - Skipped, Open-Drain, Digital / P0.3 - Skipped, Open-Drain, Digital / P0.4 - TX0 (UART0), Open-Drain, Digital / P0.5 - RX0 (UART0), Open-Drain, Digital / P0.6 - CEX2 (PCA), Push-Pull, Digital / P0.7 - CEX3 (PCA), Push-Pull, Digital / P1.0 - Skipped, Open-Drain, Digital / P1.1 - Skipped, Open-Drain, Digital / P1.2 - Skipped, Open-Drain, Digital / P1.3 - CEX4 (PCA), Push-Pull, Digital / P1.4 - Unassigned, Open-Drain, Digital / P1.5 - Unassigned, Open-Drain, Digital / P1.6 - Unassigned, Open-Drain, Digital / P1.7 - Unassigned, Open-Drain, Digital / P2.0 - Unassigned, Open-Drain, Digital / P2.1 - Unassigned, Open-Drain, Digital / P2.2 - Unassigned, Open-Drain, Digital / P2.3 - Unassigned, Open-Drain, Digital P0MDOUT = 0xC3; P1MDOUT = 0x01; P2MDOUT = 0x80; P0SKIP = 0x0C; P1SKIP = 0x06; XBR0 = 0x01; XBR1 = 0x45;P2_7 = 0;void Oscillator_Init() OSCICN = 0x82;void Timer_Init() TCON = 0x40; TMOD = 0x20; CKCON = 0x01; TL1 = 0x61; TH1 = 0x61;void UART_Init() SCON0 = 0x10;void Interrupts_Init() IE = 0x90;void Delay(uint dly)uint i,j;for(i=0;idly;i+)for(j=0;j1000;j+);/ Initialization function for device,/ Call Init_Device() from your main programvoid Init_Device(void) Init_Variables();PCA_Init(); Port_IO_Init(); Oscillator_Init(); Timer_Init();/Delay(5); UART_Init(); Interrupts_Init();void zuo_1_duoji(uchar x) /控制各个舵机动作的子程序,通过设置相应的/PCA寄存器来控制PWM波的占空比PCA0CPL0 = (uchar)(uint)(31*x+58000)%256);/通过发送的角度来计算PCA0CPH0 = (uchar)(31*x+58000)/256); /出寄存器应设置的具体数值void zuo_2_duoji(uchar x)PCA0CPL1 = (uchar)(uint)(31*x+58000)%256);PCA0CPH1 = (uchar)(31*x+58000)/256);void zuo_3_duoji(uchar x)PCA0CPL2 = (uchar)(uint)(31*x+58000)%256);PCA0CPH2 = (uchar)(31*x+58000)/256);void z

温馨提示

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

评论

0/150

提交评论