利用舵机制作简易机器人Word文档下载推荐.docx
《利用舵机制作简易机器人Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《利用舵机制作简易机器人Word文档下载推荐.docx(37页珍藏版)》请在冰豆网上搜索。
BasedonMCU
Abstract
HumanoidRobotthatisdescribedinthisarticleisusingNcDragonsingle-chipmicrocomputerascontrolcore,usingruddertocompletevariousaction。
TheHumanoidRobotcancompletethesquatting,standingup,walking,lateralmovingandkickingactions.RudderiscontrolledbyPWMwavesproducedbyC8051F310MCUinternalPCAmodule.Thoseactionsisachievedthroughadjustingsteeringandrudderangle.
Keywords:
C8051F310RudderPCAmodulePWM
概述
本项目是基于51单片机的人形机器人的设计,整个程序采用C语言。
近年来机器人就有很大的发展潜力,随着科技的进步,机器人将会做的越来越完善。
人形机器人的产生解决的许多生产中的难题,它可以代替人类做许多危险而又高难度的工作。
在一些场合机器人已经可以代替人类,相信在今后的时间里,人形机器人将会为我带来许多帮助。
原理图的设计
一、单片机外围电路
本单片机的晶振为32.768MHZ,但是在后期的测试发现外部晶振输出不稳定,因此本项目采用的是内部晶振。
我们所设计的机器人总共有12个舵机,而这款F310最多只能输出5路PWM,因此需要3块板子。
二、电源驱动电路
电源芯片采用AZ1084和LM1117。
其中AZ1084输入电压为7.2v,输出电压为5v,LM1117输入电压为5v,输出电压为3.3v。
F310单片机的工作电压是3.3v,因此需要经过两次降压达到3.3v。
为了稳定工作电压,采用IB0505LS来稳定单片机的工作电压。
三、通信接口
我们需要3块电路板来是机器人工作,因此通信是必须考虑的问题。
在此我们采用485来实现单片机之间的通信,通过一块主板来控制其余两块副板子的工作。
485的好处就是它不像232那样要考虑电平匹配的问题。
四、舵机接口
采用光电隔离来稳定输出,是舵机正常稳定的工作。
机器人有两条腿,每条腿由6路舵机来控制。
PCB图制作
一、普通前
二、普通后(顶层)
三、普通后(底层)
元器件列表
源程序
左腿初始化:
#include"
c8051f310.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitP2_7=P2^7;
#definewalk_zuo_1186
#definewalk_zuo_2187
#definewalk_zuo_3188
#definewalk_zuo_4189
#definewalk_zuo_5190
#definewalk_mark222
ucharmark;
ucharact,arc;
voidInit_Variables()
{
act=0;
arc=0;
}
voidPCA_Init()
PCA0CN=0x40;
PCA0MD&
=~0x40;
PCA0MD=0x02;
PCA0CPM0=0xC2;
PCA0CPM1=0xC2;
PCA0CPM2=0xC2;
PCA0CPM3=0xC2;
PCA0CPM4=0xC2;
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);
voidPort_IO_Init()
P0MDOUT=0xC3;
P1MDOUT=0x01;
P2MDOUT=0x80;
P0SKIP=0x0C;
P1SKIP=0x06;
XBR0=0x01;
XBR1=0x45;
P2_7=0;
voidOscillator_Init()
OSCICN=0x82;
voidTimer_Init()
TCON=0x40;
TMOD=0x20;
CKCON=0x01;
TL1=0x61;
TH1=0x61;
voidUART_Init()
SCON0=0x10;
voidInterrupts_Init()
IE=0x90;
voidDelay(uintdly)
uinti,j;
for(i=0;
i<
dly;
i++)
for(j=0;
j<
1000;
j++);
//Initializationfunctionfordevice,
//CallInit_Device()fromyourmainprogram
voidInit_Device(void)
Init_Variables();
PCA_Init();
Port_IO_Init();
Oscillator_Init();
Timer_Init();
//Delay(5);
UART_Init();
Interrupts_Init();
voidzuo_1_duoji(ucharx)
PCA0CPL0=(uchar)((uint)(31*x+58000)%256);
PCA0CPH0=(uchar)((31*x+58000)/256);
voidzuo_2_duoji(ucharx)
PCA0CPL1=(uchar)((uint)(31*x+58000)%256);
PCA0CPH1=(uchar)((31*x+58000)/256);
voidzuo_3_duoji(ucharx)
PCA0CPL2=(uchar)((uint)(31*x+58000)%256);
PCA0CPH2=(uchar)((31*x+58000)/256);
voidzuo_4_duoji(ucharx)
PCA0CPL3=(uchar)((uint)(31*x+58000)%256);
PCA0CPH3=(uchar)((31*x+58000)/256);
voidzuo_5_duoji(ucharx)
PCA0CPL4=(uchar)((uint)(31*x+58000)%256);
PCA0CPH4=(uchar)((31*x+58000)/256);
voidwalk()
switch(act)
{
casewalk_zuo_1:
zuo_1_duoji(arc);
break;
casewalk_zuo_5:
zuo_5_duoji(arc);
casewalk_zuo_2:
zuo_2_duoji(arc);
casewalk_zuo_3:
zuo_3_duoji(arc);
casewalk_zuo_4:
zuo_4_duoji(arc);
default:
}
voidmain()
Init_Device();
while
(1);
voidUART_Interrupt(void)interrupt4
uchardat,i;
//ucharmark;
if(RI0==1)
for(i=0;
2;
{
while(!
RI0);
dat=SBUF0;
if(dat>
180)
act=dat;
else
arc=dat;
RI0=0;
}
walk();
右腿初始化:
#definewalk_you_1181
#definewalk_you_2182
#definewalk_you_3183
#definewalk_you_4184
#definewalk_you_5185
#definewalk_mark223
PCA0CN=0x40;
PCA0CPL0=(uchar)((uint)(31*20+58000)%256);
PCA0CPH0=(u