当前位置:文档之家› 智能机器人创新实践进度报告

智能机器人创新实践进度报告

智能机器人创新实践进度报告
——自动寻线小车电路设计进度:
上图为使用Protel进行设计的自动寻线小车主电路原理图。

该电路的主要部件为:STC89S52芯片,L298电机驱动芯。

STC89S52作为系统的CPU,P2.0——P2.4口负责接收红外对管传来的小车在跑道上的位置信息。

P1.0——P1.3l输出控制电机的PWM波,通过这四个端口可实现小车的左转、右转及直线行使。

L298是电机的驱动芯片,IN1——IN4为控制信号输入端,与89S52的P1.0——P1.3相连。

OUT1——OUT4则直接与电机连接。

OUT1和OUT2一组,一起控制左边的电机。

OUT3、OUT4一组,一起控制右边的电机。

硬件设计进度:
上图为小车主电路原理图的PCB图。

采用双面板,顶层与底层都有走线。

程序设计进度:
程序的设计我们已基本完成。

下面是程序清单:
#include <reg52.h>
sbit PWM1 = P1^0;//控制左边的电机
sbit PWM11 =P1^1;
sbit PWM2 = P1^2;//控制右边的电机
sbit PWM22 =P1^3;
static char huancun;//红外采集缓存区
static int error[3]={0,0,0},Err;//小车位置偏差
unsigned char CYCLE=100; //定义周期该数字X基准定时时间如果是10 则周期是10 x 0.1ms
unsigned char PWM_ON1,PWM_ON2,PWM_ON11,PWM_ON22 ;//定义高电平时间
unsigned int i,j,k;
void init();//初始化
void delay(unsigned int);//延时函数
void main()
{
init();//初始化
while(1)
{
if(Err>0)//小车左转
{
PWM_ON1 = 0;
PWM_ON11 =0.7*Err;//根据误差确定拐弯程度
PWM_ON2 =100;
PWM_ON22 = 0;
}
else if(Err<0)//小车右转
{
PWM_ON1 = 100;
PWM_ON11 =0;
PWM_ON2 =0;
PWM_ON22 =(0.7*Err);//根据误差确定拐弯程度}
else
{
PWM_ON1 = 100;
PWM_ON2 = 100;
}
}
}
void init ()
{
TMOD |=0x11;//定时器设置 1ms in 12M crystal
TH0=(65536-100)/256;
TL0=(65536-100)%256;//定时1mS
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;//定时50mS
EA=1;
ET1=1; //打开中断
TR1=1;
ET0=1;
TR0=1;
}
/*********************************************/
/* 定时中断 0产生周期为10MS的PWM波 */
/*********************************************/
void time0(void) interrupt 1 using 2
{
static unsigned char count; //
TH0=(65536-100)/256;
TL0=(65536-100)%256;//定时0.1mS
if (count>=PWM_ON1)
{
PWM1 = 0;
}
if(count >=PWM_ON11)
{
PWM11 = 0;
}
if(count >=PWM_ON2)
{
PWM2=0;
}
if(count >=PWM_ON22)
{
PWM22 =0;
}
count++;
if(count >= CYCLE)
{
count=0;
if(PWM_ON1!=0) //如果左右时间是0 保持原来状态
PWM1 = 1;//
if(PWM_ON2!=0)
PWM2 = 1;
if(PWM_ON11!=0) //如果左右时间是0 保持原来状态
PWM11 = 1;//
if(PWM_ON22!=0)
PWM22 = 1;
}
}
/*信号的采样*/
void time1(void) interrupt 3 using 1
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;//定时10mS
huancun=P2|0x80;//读取红外对管传来的数据
if((huancun & 0x7f)!=0x00)//排除干扰
{
{
error[2]=error[1];
error[1]=error[0];
if((huancun|0x80)!=0xff)//如果没有冲出跑道误差清0;
error[0]=0;
for(i=0;i<7;i++)//累积误差
{
if( (huancun&(0x01<<i))==0x00 )
{
bquan++;
error[0]+=(3-i)*(3-i)*(3-i);
}
}
}
Err=error[0]+1.2*(error[0]-error[2]);
}
}
void delay(unsigned int n)
{
for (k=0;k<110;k++)
for(j=0;j<n;j++);
}
总进度报告表:
. .。

相关主题