基于89s51单片机的循迹小车设计报告 本文关键词:单片机,小车,报告,设计,s51
基于89s51单片机的循迹小车设计报告 本文简介:1基于89s51单片机的循迹小车设计报告基于89s51单片机的循迹小车设计报告摘要本文介绍了基于at89s52单片机的智能小车的设计与实现。小车完成的主要功能是能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。小车系统以AT89S52单片机为系统控制处理器;采用红外对管获取赛道的信息;通过
基于89s51单片机的循迹小车设计报告 本文内容:
1
基于
89s51
单片机的循迹
小车设计报告
基于
89s51
单片机的循迹小车设计报告
摘
要
本文介绍了基于
at89s52
单片机的智能小车的设计与实现。小车完成的主要功
能是能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。小车
系统以
AT89S52
单片机为系统控制处理器;采用红外对管获取赛道的信息;
通过数字
PID
控制策略和
PWM
控制技术来对小车的方向和速度进行控制。本
文介绍了小车硬件和软件系统的设计过程。
关键字:at89s52
单片机;
光电管;
PID;
基于
89s51
单片机的循迹小车设计报告
目
录
摘摘
要要2
第一章第一章
引言引言2
1.1
设计目的2
1.2
设计方案介绍2
1.3
技术报告内容安排2
第二章第二章
技术方案概要说明技术方案概要说明3
第三章第三章
硬件电路的设计硬件电路的设计4
3.1
单片机最小系统4
3.2
传感器电路4
3.3
电源电路设计5
3.4
舵机及电机驱动电路设计5
第四章第四章
软件系统的实现软件系统的实现6
4.1
主程序设计6
4.2
程序思路6
第五章第五章
结论结论7
附录:源程序主代码附录:源程序主代码8
基于
89s51
单片机的循迹小车设计报告
第一章
引言
1.1
设计目的
通过设计进一步掌握51单片机的应用,特别是在嵌入式系统中的应用。
进一步学习51单片机在系统中的控制功能,能够合理设计单片机的外围电路,
并使之与单片机构成整个系统。
1.2
设计方案介绍
该智能车采用红外对管方案进行道路检测,单片机根据采集到的红外对管
的不同状态判断小车当前状态,通过pid控制发出控制命令,控制舵机和电
机的工作状态以实现对小车姿态的控制。
1.3
技术报告内容安排
本技术报告主要分为三个部分。第一部分是对整个系统实现方法的一个概
要说明,主要内容是对整个技术方案的概述;第二部分是对硬件电路设计的说
明,主要介绍系统传感器的设计及其他硬件电路的设计原理等;第三部分是对
系统软件设计部分的说明,主要内容是智能模型车设计中主要用到的控制理论、
算法说明及代码设计介绍等。
基于
89s51
单片机的循迹小车设计报告
第二章
技术方案概要说明
本模型车的电路系统包括电源管理模块、单片机模块、传感器模块、电机
驱动模块、舵机控制模块。
在整个系统中,由电源管理模块实现对其他各模块的电源管理。其中,对
单片机、光电管、舵机提供
5V
电压,对电机提供
6V
电压。
路径识别电路由
8
对光电发送与接收管组成。由于路面存在黑色引导线,
落在黑线区域内的光电接收管接收到反射的光线的强度与白色的路面不同,进
而在光电接收管两端产生不同的电压值,由此判断路线的走向。传感器模块将
当前采集到的一组电压值传递给单片机,进而根据一定得算法对舵机进行控制,
使小车自动寻线行走。
单片机模块是智能车的核心部分,主要完成对外围各个模块的管理,实现对
外围模块的信号发送,以及对传感器模块的信号采集,并根据软件算法对所采
集的信号进行处理,发送信号给执行模块进行任务执行,还对各种突发事件进
行监控和处理,保证整个系统的正常运作。
舵机控制模块则根据检测情况经单片机处理后发出相应的
PWM
波对舵机
进行转向的控制。
电机驱动模块采用H桥驱动,通过
PWM
波对电机进行控制,以实现对小
车速度的调节。
基于
89s51
单片机的循迹小车设计报告
第三章
硬件电路的设计
3.1
单片机最小系统
小车采用
atmel
公司的
at89s52
单片机作为控制芯片,图
3-1
是其最小系统
电路。主要包括:时钟电路、电源电路、复位电路。其中各个部分的功能如下:
1、时钟电路:给单片机提供一个外接的
16MHz
的石英晶振。
2、电源电路:给单片机提供
5V
电源。
3、复位电路:在电压达到正常值时给单片机一个复位信号。
图
3-1
单片机最小系统原理图
3.2
传感器电路
光电寻线方案一般由多对红外收发管组成,通过检测接收到的反射光强,
判断黑白线。原理图由红外对管和电压比较器两部分组成,红外对管输出的模
拟电压通过电压比较器转换成数字电平输出到单片机。
基于
89s51
单片机的循迹小车设计报告
3-2
赛道检测原理图:
3.3
电源电路设计
模型车通过自身系统,采集赛道信息,获取自身速度信息,加以处理,由芯片
给出指令控制其前进转向等动作,各部分都需要由电路支持,电源管理尤为重
要。在本设计中,51
单片机使用
5V
电源,电机及舵机使用
6V
电源。考虑到
电源为充电电池组,额定电压为
7.2V,实际充满电后电压则为
6.5-6.8V,所以
单片机及传感器模块采用
7805
稳压后的
5V
电源供电,舵机及电机直接由电池
供电。
3.4
舵机及电机驱动电路设计
舵机的驱动电路比较简单,电源直接由电池组提供,其输入信号为单片机
输出的
pwm
波。
本系统使用的电机驱动板为一个由分立元件制作的直流电动机可逆双极型
桥式驱动器,其功率元件由四支N沟道功率MOSFET管组成,由此电路,通过
设置51输出的PWM波的占空比可以达到控制电机转速的效果。
3-3
H
桥驱动电路
基于
89s51
单片机的循迹小车设计报告
第四章
软件系统的实现
4.1
主程序设计
单片机系统需要接收路径识别电路的信号,采用某种路径搜索算法进行寻
线判断,进而控制舵机和直流驱动电机的工作。小车系统的软件使用
C
语言实
现。
主体控制框架:
模型车采用的控制方法是根据传感器采集到的路况信息,通过计算得到具
体的方向偏移量和速度,控制小车的行走状态。
4.2
程序思路
智能车利用了一字形排布的8个传感器来探测道路,并将每个传感器采集
到的信息转换成了数字电平。因此8个传感器的数据正好构成一个字节,由单
片机P2口读入。
由于读入的数据并不方便直接参与控制计算,因此先将该数据集分成16
类,分别对应于小车不同的位置信息,由
0-15
表示,其中0表示引导线位于小
车最左侧,7
表示引导线位于小车中部,14
表示引导线位于小车最右侧,15
表
示未检测到引导线或其他错误情况。
将上面的转换后的数据作为控制计算的反馈输入,与7相减即得到小车偏
差信息,然后通过增量型
pid
算法计算出舵机的控制信息。
将小车偏差信息的微分作为速度
pid
的输入,依然通过增量型
pid
算法得到
电机的控制信息。至此小车完成一次控制周期。
由于
at89s51
单片机没有
PWM
模块,因此需要通过通用
I/O
口进行模拟来
输出舵机和电机所需的
PWM
波。
可以分别使用一个定时器来作为一路
PWM
波的计时器。先将
I/O
口置位,
设定高电平时间及定时器的初值,当定时器产生中断时,再将
I/O
口清零,并
设定低电平时间,由此循环即可产生
PWM
波。其中,高电平时间有控制计算
得出,低电平时间有
PWM
周期减去高电平时间得到。
路况信息数据处理
偏转方向
车
速
基于
89s51
单片机的循迹小车设计报告
第五章
结论
本设计主要用到了单片机的通用
IO
口的读写,定时器,中断等基本功能,
通过实际操作进一步掌握了
51
单片机的使用。同时,通过单片机外围电路的设
计,更深入学习了
51
单片机在嵌入式系统中的应用。通过实际焊接电路,编写
程序,也进一步提高了我的动手能力以及分析解决错误的能力,是我能够更好
的将所学知识应用到实际中来。
本系统能够基本满足设计要求,能够较快较平稳的是小车沿引导线行驶,
但由于经验能力有限,该系统还存在着许多不尽人意的地方有待于进一步的完
善与改进。
基于
89s51
单片机的循迹小车设计报告
附录:源程序主代码
#include
#include
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
#define
MIDDLE
1390
//舵机中心位置
#define
LEFT
1600
#define
RIGHT
1000
#define
T
20000
#define
HIGH
7300
//电机基准速度
sbit
rudder=P1^0;
//定义舵机
PWM
波输出端口为
P1.0
口
sbit
pulse=P1^1;
//定义后轮
PWM
波输出端口为
P1.1
口
char
flag1=0,flag2=0;//定义全局变量(flag1
用于控制舵机
//PWM
标志位,flag2
用于控制电机
PWM)
uint
b=0,a=0;//b
用来装载电机所需的高电平时间,a
用
于保存电机所需高电平时间
void
main()
{
uchar
receive,ek[4]={7,7,7,7};
uint
pidr=0;
uint
pidlr=0;
uint
ppid=0;
IE=0x8a;
TMOD=0x11;
TH0=0x00;
TL0=0x00;
TR0=1;
TH1=0x00;
TL1=0x00;
TR1=1;
基于
89s51
单片机的循迹小车设计报告
while(1)
{
receive=P2;
//采集光电传感器的值
/*--------------switch----------------*/
switch(receive)
//根据采集到的值进行判断
{
case
0x7f:ek[3]=0;break;
//0111
1111
最左边(或右边)1
个
光电传感器检测到黑线
case
0x3f:ek[3]=1;break;
//0011
1111
最左边(或右边)2
个
光电传感器检测到黑线
case
0xbf:ek[3]=2;break;
//1011
1111
依次类推
case
0x9f:ek[3]=3;break;
//1001
1111
case
0xdf:ek[3]=4;break;
//1101
1111
case
0xcf:ek[3]=5;break;
//1100
1111
case
0xef:ek[3]=6;break;
//1110
1111
case
0xe7:ek[3]=7;break;
//1110
0111
case
0xf7:ek[3]=8;break;
//1111
0111
case
0xf3:ek[3]=9;break;
//1111
0011
case
0xfb:ek[3]=10;break;
//1111
1011
case
0xf9:ek[3]=11;break;
//1111
1001
case
0xfd:ek[3]=12;break;
//1111
1101
case
0xfc:ek[3]=13;break;
//1111
1100
case
0xfe:ek[3]=14;break;
//1111
1110
default:
ek[3]=15;break;
//1111
1111
没有检测到黑线(是
需要保持上一次测量值的)
}
/*--------------switch----------------*/
if(ek[3]=
=15)
{pidr
=
pidlr;
}
else
{pidr=0.2*pidlr+0.8*(23*(ek[3]-7)+2*(ek[3]+ek[2]+ek[1]+ek[0]-
28)+7*(ek[3]-ek[2]));
if(ek[2]!=ek[3])
ppid=-160*(cabs(ek[3]-7))+220*(cabs(ek[1]-7)-cabs(ek[3]-7));
}
a=HIGH+ppid;
//a
是电机高电平时间
b=pidr+MIDDLE;
//b
就是舵机
PWM
波高电平时间
if(bLEFT)
b=LEFT;
if(bRIGHT)
b=RIGHT;
{char
i;
基于
89s51
单片机的循迹小车设计报告
for(i=0;i3;i++)
ek[i]=ek[i+1];
}
pidlr=pidr;
}
}
void
zhongduan_t0(void)
interrupt
1
//产生舵机
PWM
波中断子程序(T0
中断)
{
if(flag1==0)
{
TH0=(uchar)((65536-b)/256);
TL0=(uchar)((65536-b)%256);
flag1=1;
rudder=1;
}
else
{
TH0=(uchar)((38869+b)/256);
TL0=(uchar)((38869+b)%256);
flag1=0;
rudder=0;
}
}
void
zhongduan_t1(void)
interrupt
3
{
if(flag2==0)
{
TH1=(uchar)((65536-HIGH)/256);
TL1=(uchar)((65536-HIGH)%256);
flag2=1;
pulse=0;
}
else
{
TH1=(65536-T+HIGH)/256;
TL1=(65536-T+HIGH)%256;
flag2=0;
pulse=1;
}
}