机器人硬件电路设计
- 格式:doc
- 大小:902.50 KB
- 文档页数:30
本科学年论文 简易人形机器人的设计
院 系 电子信息工程学院自动化系 专业名称 自 动 化 年 级 2008 级 学生姓名 张宇哲 学 号 00824058 指导教师 仲 兆 楠 日 期 2011年09月 2
摘 要 本文介绍的人形机器人采用新华龙公司的C8051F310单片机为控制核心,利用舵机完成人形机器人的各种动作。该人形机器人可以完成下蹲、起立、走步,侧移和踢球等动作。舵机均采用单片机C8051F310内部的PCA模块产生的PWM波调节其转向和转角的大小从而实现人形机器人的各种动作。 关键字:C8051F310 舵机 PCA模块 PWM
Design and Realization Humanoid Robot Based on MCU
Abstract Humanoid 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 二.单片机电路……………………………………………3 三.RS 485总线 ……………………………………………4 四.舵机电路………………………………………………4 五.PCB制作………………………………………………5 软件设计………………………………………………………7 一.主板程序………………………………………………7 二.子板程序………………………………………………22 总结…………………………………………………………27 附录………………………………………………………28 4
概述 本次的设计主题为人形机器人,主要对人形机器人的腿部进行设计与制作。使用新华龙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
最多只能输出5路PWM,因此需要3块板子。 三.RS485总线 本设计采用485总线进行通信通过主板发出指令来控制从板从而控制各个舵机的工作:
四.舵机控制电路 每块从板上共有六组舵机驱动,用P117光耦进行隔离电路图如下: 6
五.PCB制作: PCB制作如下: 一下分别为PCB设计图以及对应的3D图 7 8
程序设计 本设计的程序一C语言来编写。程序的初始化可通过新华龙公司的专用软件(configuration wizard2)来完成,不用编程者自己完成,所以初始化相对方便。程序的主体部分由两部分组成,一部分为主板程序,控制单片机用串口模块来向从板发指令,主板的程序只发送相应的指令来协调舵机的运动。而从板的程序主要用来接受指令,并且是相应的舵机作出相应的动作。具体的动作实在从板的程序中完成的。 程序设计如下:
一.主板程序 void Uart_Send(unsigned char x) { 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 9
// 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; } 10
// Initialization function for device, // Call Init_Device() from your main program void Init_Device(void) { PCA_Init(); Port_IO_Init(); Oscillator_Init(); Timer_Init(); UART_Init(); Interrupts_Init(); } 以上为CONCIGRITION WIZARD2程序所生成的初始化程序,程序中对PCA,定时器,串口,以及各个端口进行初始化设置。
void Delay(unsigned int x) { unsigned int y,z; for(y=0;yfor(z=0;z<50;z++); } void Uart_Send(unsigned char x) { SBUF0=x; while(!TI0); TI0=0; } 以上为主程序中使用的延时以及串口发送子程序,由于主板只需要发送数据,所以只有数据发送程序。
以下为主板中控制各个动作的子程序,所执行的动作有站立,行走,左移,蹲下,站起,踢腿。每个动作都以for循环来实现,目的是使舵机的偏角一点点改变,不至于一下子打到设定的位置。 void Walk(void) { uchar i; for(i=0;i<11;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);