绘图小车设计Word文档下载推荐.docx
《绘图小车设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《绘图小车设计Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。
![绘图小车设计Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-11/23/c4673c1a-9110-4675-8288-6a2fe52049c0/c4673c1a-9110-4675-8288-6a2fe52049c01.gif)
2.1、控制模块6
2.2、电机驱动模块6
2.3、传感器模块7
三、软件设计8
前言
本小组的只能小车结构简单,并且认为题目为画线而非寻线,因此传感器只有一个,为霍尔传感器用于测量小车走过的距离,然后通过单片机控制,以及小键盘的输入使其实现各种的绘图。
单片机运用的是新手最普遍用的51单片机,该单片机经典,较为简单,其功能也不弱,性价比比较高。
一、设计思路
题目为用小车画出指定的图案,并且只有指定长度的支线,或指定边长的矩形等指定形状的且只有直角的转弯。
本这从最简单的方案出发,即,每次用小键盘对单片机输入每次需要画图的要图,如“画一个边长100的矩形”即按“1”“0”“0”“右转”“1”“0”“0”“右转”“1”“0”“0”“右转”“1”“0”“0”“确认”,那么在单片机的控制下,并且通过霍尔传感器对距离的测量,实现100的行走,但由于人工放置的小磁铁精度不太够,所以这100肯定是有偏差,在目前的条件下,使得本小车的精度不足。
至于左、右的转弯,由于本小车是由两个马达的后轮以及单个前万向轮组成,并且笔安装在后轮对轴的正中心,所以直角转弯只需用单片机来控制一个轮向前,另一个轮向后,并且速度一致,再用霍尔传感器使得轮子转动特定的距离即可,当然,还是精度的问题,依旧是个大问题。
所以总得来说,本小车就有,控制模块,传感模块以及电机驱动模块。
原理图设计:
(1)51单片机控制模块
(2)霍尔传感器模块
(3)电机驱动模块
(4)电源供电模块
二、硬件设计
2.1、控制模块
因为这次画画小车的动能需求不大,只是画一些基本的图形。
因此选择比较容易操作的51单片机系统。
51单片机是基础入门的一个单片机,还是应用最广泛的一种。
运用51单片机p1.0~p1.7控制键盘输入,p0.0~p0.3,p2.0~p2.1控制电机驱动,XTAL1,XTAL2控制晶振模块,RET控制复位模块。
2.2、电机驱动模块
采用LM298控制电机驱动模块,电机驱动有2个直流电机,分别控制不同的轮使它有不同的转速以控制转弯。
通过out1~out3管脚控制电机的转动。
L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。
4脚VS接电源电压,VS电压范围VIH为+2.5~46V。
输出电流可达2.5A,可驱动电感性负载。
1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。
L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。
5,7,10,12脚接输入控制电平,控制电机的正反转。
EnA,EnB接控制使能端,控制电机的停转。
以下的是L298N功能逻辑图。
2.3、传感器模块
小车的传感器一般选用红外线传感器或者霍尔传感器,因为这次小车的所需要的功能不多,因此采用霍尔传感器。
一个霍尔元件一般有四个引出端子,其中两根是霍尔元件的偏置电流IC的输入端,另两根是霍尔电压的输出端。
如果两输出端构成外回路,就会产生霍尔电流。
一般地说,偏置电流的设定通常由外部的基准电压源给出;
若精度要求高,则基准电压源均用恒流源取代。
为了达到高的灵敏度,有的霍尔元件的传感面上装有高导磁系数的坡莫合金;
这类传感器的霍尔电势较大,但在0.05T左右出现饱和,仅适用在低量限、小量程下使用。
三、软件设计
本小车使用51单片机,使用KevlC51编写程序。
程序的分为,键盘输入数据的识别转化部分,以及霍尔传感器的输入部分以及电机的输出部分。
总得来说,本者最简单小车的原则,本程序也是相当的简单,就不详细介绍。
程序如下:
#include<
reg52.h>
#defineucharunsignedchar
codeuchark_tab[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,
0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};
//键值
ucharjs=0;
voiddelay(unsignedintcnt)//延时函数
{
while(--cnt);
}
ucharnkey_s0(uchary)
{
uchari,b;
for(i=0;
i,16;
i++)
{
b=k_tab[i];
if(b==y)
returni;
}
ucharnkey()
uchara,b;
P1=0xf0;
a=P1;
b=a;
P1=0xf;
a|=b;
b=nkey_s0(a);
returnb;
bitkeys()
uchara;
if(a==0xf0)
return1;
else
return0;
ucharkeyi()
while
(1)
{
if(keys()==0)
delay(9000);
if(keys()==0)
{
a=nkey();
if(a<
0x10&
&
keys()==1)
returna;
}
}
}
main()
ucharx[3],i=0,a[10],j=0,ks=0,k=0;
P0=0x2d;
//电机关
IE=0x85;
//开外中断
TCON=0x05;
//下降沿触发
while
(1)//主循环
while(ks==0)
if(keyi()==0)x[i]=1,i++;
if(keyi()==1)x[i]=2,i++;
if(keyi()==2)x[i]=3,i++;
if(keyi()==4)x[i]=4,i++;
if(keyi()==5)x[i]=5,i++;
if(keyi()==6)x[i]=6,i++;
if(keyi()==8)x[i]=7,i++;
if(keyi()==9)x[i]=8,i++;
if(keyi()==10)x[i]=9,i++;
if(keyi()==12)a[j]=1000*x[0]+100*x[1]+10*x[2]+1,i=0,j++;
//左转
if(keyi()==13)x[i]=0,i++;
if(keyi()==14)a[j]=1000*x[0]+100*x[1]+10*x[2]+2,i=0,j++;
//右转
if(keyi()==15)
{ks=1;
a[j]=1000*x[0]+100*x[1]+10*x[2]+0;
}//确定
delay(99999);
for(k=0;
k<
=j;
k++)
js=0;
while(js!
=(a[k]/10)/4)
P0=0x36;
//电机开
P0=0x2d;
=3)
if(a[k]%10==1)P0=0x33;
//左转
if(a[k]%10==2)P0=0x1e;
//右转
if(a[k]%10==0)break;
j=0,ks=0;
voidint0(void)interrupt0
js++;