Labview智能小车控制平台.docx
《Labview智能小车控制平台.docx》由会员分享,可在线阅读,更多相关《Labview智能小车控制平台.docx(23页珍藏版)》请在冰豆网上搜索。
![Labview智能小车控制平台.docx](https://file1.bdocx.com/fileroot1/2023-1/27/bcc616c4-111b-4ea7-83cc-b83bb6bda122/bcc616c4-111b-4ea7-83cc-b83bb6bda1221.gif)
Labview智能小车控制平台
基于Labview的智能小车控制平台
摘要:
该课程设计是基于Labview的智能汽车控制平台,该平台建立在飞思卡尔单片机及51单片机控制芯片基础上,基于Labview仿真。
采用无线控制小车转向,加速,刹车系统。
该设计是测控专业集单片机控制,电路,软件编程于一体的平台练习,是集测控专业所学的一门综合提高学生素质的课程设计。
关键词:
Labview智能汽车飞思卡尔单片机测控
Abstract:
thecourseisdesignedbasedontheintelligentvehiclecontrolplatformLabview,thisplatformbasedonSCMand51single-chipmicrocomputercontrolfreescaleLabview,basedonthechip.Usingradiocontrolcaraccelerated,brakingsystem,steering.Thisdesignisaprofessionalsetssingle-chipmicrocomputercontrol,thecontrolcircuitandthesoftwareprogramminginoneoftheplatform,whichisaprofessionalknowledgeofmeasurementtoimprovestudents'comprehensivequalityofthecoursedesign.
Keywords:
intelligentvehiclefreescalemicrocontrollermeasure-controlLabview
一、单片机系统的组成
1.改装原因:
(1):
市面上的游戏方向盘都是USB通信协议,用户不了解协议内容,无法用于自己控制要求。
(2):
USB通信优势虽然非常明显,但由于其协议复杂,且受其通信距离限制,USB信号一般只能在几米的传输范围内,较串口较短,因此选择了简易可行的串口协议。
2.设计步骤:
(1):
了解内部工作及传感原理。
拆开游戏方向盘,结果发现传感原理非常简单,仅靠变阻器和按键传递控制信号。
(2):
使用一款自己熟悉的单片机(AT89S52)根据硬件电路接口电路设计自己的硬件控制电路板卡。
其中包括方向盘指挥输入部件和与PC机通信的串口通信模块。
(3):
编写自己的用户应用程序,创建自己和PC的通信协议,发挥软件编程的灵活性。
3.硬件原理图说明:
(1):
核心控制芯片选用AT89S52,其各接口使用情况如下图所示:
0834_DI、0834_DO、0834_CLK、0834_CS用于AD采样的接口。
图(7)核心控制芯片89S52
(2)AD转换及采样接口电路说明:
采样电路的等效电路图图所示:
图(8)AD转换
油门和刹车:
注:
刹车和油门的机械结构将脚下力转换为对应变阻器的阻止变化,只需采样阻值大小即可判断力的大小。
经测量知:
刹力越大,电阻值越小。
图(9)油门和刹车等效图
接口3、4之间接到游戏方向盘的刹车控制变阻器两端,相当于接一可变电阻。
接口1、2之间接到游戏方向盘的油门控制变阻器两端,相当于接一可变电阻。
AD_Brake和AD_Thtottle用于AD采样油门和刹车的模拟信号,R18,R19用于采样时分压。
方向盘:
方向盘的转向信号仍是模拟信号,用AD采样之后即可判断转动方向及幅度。
接口的1、2、3分别对应于三端滑动变阻器的三个端子。
图(10)方向盘等效电路左转时1、2之间电阻逐渐变小,AD_L的分压将逐渐变大。
右转时2、3之间的电阻逐渐变小,AD_R的分压将逐渐变大。
AD转换电路图:
AD芯片使用的是TI公司的一款8位4通道串行AD芯片,正好满足要求。
与单片机的接口为SPI的接口,具体说明和使用请参考芯片资料里的《TLC0834使用范例》文档,也可参考该芯
图(11)AD转换电路片厂商提供的技术文档,内含具体操作时序。
图(12)按键电路
(3)按键接口硬件说明
按键的设计依赖于具体的硬件结构,在此给出说明。
下图为按键的设计原理(并非实际电路),由于游戏方向盘上按键单独设计已经由机械结构确定,故在主控制板上只是留出对应接口(J)即可。
分布在方向盘的各个按键小板原理图如下所示(GND、KEY1…KEYn为留出的插槽)
该游戏方向盘上共计有19个用户按键使用(包含最中间的复位按键),具体排列如下。
图(13)按键小板
对应于游戏方向盘上5、6、7、8、9、10、11、12和中间的cruise(我们设为复位键)的按键。
见下图:
图(13)方向盘按键
对应于对应于游戏方向盘上UP、DOWN、LEFT、RIGHT的按键。
见下图:
图(14)UP、DOWN、LEFT、RIGHT的按键
对应于对应于游戏方向盘上1、2、3、4的按键。
见下图:
对应于对应于游戏方向盘上左右两个的按键,在此设为中断按键,方便用于处理实时信息。
见下图:
另外由于单片机资源较多,仍有多余的IO口6个,在此引出以便于扩展外部功能。
见下图:
(4)振动器驱动硬件电路
为增强游戏者的手感,游戏方向盘上有两个振动器,在此给出驱动电路图及说明如下:
三级管在此既作为单片机控制的开关,又充当功率放大的角色。
只需给Mor1、Mor2给出高电平即可驱动负载,低电平断开。
图(15)驱动电路
(5)在系统编程接口
现今单片机一般都支持ISP(在系统编程),这样大大方便了单片机开发用户,在此也引出了ISP的接口规范,供参考如下:
该款下载线使用的是网上非常流行的USBASP,支持USB下载和供电双功能,并且可以同时下载AT89s5x和AVR单片机(Atmage16),详细可以参考网上相关资料。
图(16)系统编程图
(6)串口通信硬件说明
为了满足串口传输的电平规范,在此需要设计电平转换电路,电路原理来源于Maxim公司的max232芯片说明文档。
图(17)串口通信电路
选用主要材料清单:
注:
材料清单中元件除发光二极管以外均要求贴片封装。
型号封装数量厂商说明
AT89S52TQFP4412ATMEL单片机
TLC0834SOP-1412TI8位串行AD转换芯片
MAX232SOP-1612MAXIM串口电平转换芯片
7805(LM7805)TO-22012ST5V电源稳压芯片
9013(8050)SOT2324(30)NPN三极管
有极性贴片钽电容(1uF,10uF)1206有极性贴片电容
二、Labview控制平台的设计
1.基本界面组成
(1)串口1:
用于连接单片机和PC机,作为方向盘数据传送的枢纽。
(2)串口2:
用于连接PC机和无线传输模块,主要是给小车发送相关的数据,实时调整小车的状态。
(3)显示控件:
本次设计至少需要显示四个参数,方向(Direction)、转角(Angle)、速度(Speed)、刹车(Brake)。
(4)全局变量、美化界面相关控件。
2.串口1的协议:
(1)PC机先往51单片机发送字符“1”,作为51单片机开始发送数据的命令。
(2)51单片机发送的一帧数据格式应为:
DxAx3x2x1Bx2x1Tx2x1Sxxxx
x:
表示数据,范围为0~256,与ASCII码表一一对应。
(3)D为方向标识符,后面紧跟的数据必须为0或1(对应的十六制数为30H和31H)。
0为前进,1为后退,默认为0.
(4)A为方向标识符,后面紧跟的第一位数是左右转标识符,取值为0或1,为为右转,1为左转。
第二、三位分别为转角(Angle)的十位和个位,取值范围为0~60。
(5)B为刹车标识符,后面数据的第一、二位分别为刹车(Brake)值的十位和个位,取值范围为0~30,即把刹车档分为了30档。
(6)T为油门标识符,后面数据的第一、二位分别为速度(Speed)值的个位和小数点后的第一位,取值范围为0.0~3.0。
(7)S为传送到小车单片机的标识符,用于PC机识别该信息后向串口2发送由51单片机读取到的AD值。
(8)S后面的数据均由单片机得到的AD值,具体范围见串口2的协议。
3.设计思路
根据制定的协议要求:
小车发送上来的数据严格遵守一定的数据格式,在实际数据前面都有一个标识符:
D为方向,A为转角,B为刹车,T为油门,因此在Labview中就必须判断发送上来的字符(串口每次只能发送一个字符内容)中是4个的哪一个标识符,后面紧跟的数据便是需要送给程序处理的。
根据以上分析,在Labview的程序设计中采用并行程序的处理方式,判断从串口1送上来的数据应该送到哪个控件上显示,单片机再发送标识符S,PC机收到此信息后便把处理后的数据送到串口2,把相关的数据送到小车上,小车根据收到的信息做出相应的决策。
传送完一帧数据后开始下一帧数据的处理,不断循环执行。
4.
界面程序图
图
(1)串口1和串口2初始化
图
(2)方向D处理程序
图(3)转角A处理程序
图(4)刹车B处理程序
图(5)油门T和串口2处理程序
5.前面板模型
图(6)智能小车控制面板显示图
三、智能小车的控制原理
1.PC机Labview程序与小车通讯协议
(1)、方式:
:
PC机Labview程序通过无线串口与小车通讯。
(2)、系统串口协议内容:
1、当PC机接到小车单片机发送的信号“1”(数据类型为unsignedchar)时,PC机便开始发送一帧数据,此时PC机的Labview程序一次性给小车发送四个数据,发送完毕后直到小车下一次发送回来的信号“1”时才再发数据。
例如发送的数据为:
03570-48
分别代表:
前进/后退油门刹车方向盘转角(注意顺序不能变)
(3)、数据说明如下:
前进/后退(DirectionFlag):
0表示前进,1表示后退(数据类型为unsignedchar型),只有两种状态。
油门(ThrottleData):
数据范围0~127,0表示小车速度为0,127表示速度为3.0m/s,线性递增(数据类型为unsignedchar型,共128档。
刹车(BrakeData):
数据范围0~127,0表示未踩刹车板,小车速度为当前速度,127表示刹车板踩到底,小车停止(数据类型为unsignedchar型)。
方向盘(AngleData):
数据范围-60~60,-60表示小车左转60度,60表示右转60度,即左负右正,0表示正中间,小车未转向(数据类型为char型)。
2.小车模型
(1)小车模型简介
模型车尺寸:
四轮驱动,长×宽×高为270×170×96(单位:
mm)
电机参数为:
DC7.2VND380
舵机参数为:
IPS017伺服器电池参数为:
7.2V2000mAh
(2)核心芯片
采用飞思卡尔公司生产的16位单片机mc9s12xs128作为主控芯片。
图(18)小车图片
(3)XL105-232AP2无线模块简介
PC机与小车通讯用无线串口XL105-232AP2。
XL105-232AP2是UART接口半双工无线传输模块,内置天线,体积小巧,适合100米内的无线通讯连接。
模块工作在2400-2483MHz公用频段。
XL105-232AP2的各项参数如:
串口速率、工作通道、产品ID等相关参数可以通过软件设置。
图(19)无线串口XL105-232AP2图片
3、系统框图
说明:
1.为了保证数据能够有条不紊地在51单片机、PC机、飞思卡尔单片机间正常地通讯,必须有相应的协调信号,统一采用发送信号“1”来识别是否发送一帧数据。
2.本次课程设计需要采用双串口通讯,对于笔记本来说需要两个USB接口,其中一个转换成RS232串口,另外一个接无线传输模块。
图(20)系统框图
附录1:
飞思卡尔智能小车程序
//MainmoduleofMKCAR摩垦智卡
#include/*commondefinesandmacros*/
#include/*derivativeinformation*/
#include"stdio.h"
#include"stdlib.h"
#include"math.h"
#pragmaLINK_INFODERIVATIVE"mc9s12xs128b"
/////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////system&inits系统及初始化//////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
#defineSYNE_SETTING4
#defineREFDV_SEETTING1//PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)busclk=40M
#definedelay{_asmnop;}
#defineENSPDTESTTIE_C2I=1;
#defineDISSPDTESTTIE_C2I=0;
#defineENPIDPITINTE_PINTE0=1;
#defineDISPIDPITINTE_PINTE0=0;
#defineMOTORFORWORD{PWME_PWME3=0;PWMCNT01=0;PWME_PWME1=1;}
#defineMOTORBACK{PWME_PWME1=0;PWMCNT23=0;PWME_PWME3=1;}
#defineCARSTOPPWME=0;
#defineMAXSPEED128
unsignedintReceive=0;
unsignedintReceiveFlag=0;
floatspeed,Throttlespeed,Brakespeed;
unsignedcharCardata[5],PreCartata[5];
voidinit_sys(bytep1,bytep2)
{
init_CRG(p1,p2);
init_interupt();
init_port();
init_motor();
init_servo();
init_PIT();
}
///////////////////////////////////////////////////////////////////////////////
/////////////////////////////useri/o串行通信函数,用于调试//////////////
///////////////////////////////////////////////////////////////////////////////
charstrDisp[80]="hello\n";
/************-串口初始化*************/
voidSciInit()
{
unsignedintbd;bd=(unsignedint)((UL/*OSCfreq*//2)/9600/*baudrate*//16/*factor*/);
bd++;
SCI0BDH=(unsignedchar)((bd>>8)&0x00ff);
SCI0BDL=(unsignedchar)(bd&0xff);//(unsignedchar)((0UL/*OSCfreq*//2)/19200/*baudrate*//16/*factor*/);
SCI0CR1=0;/*normal,noparity*/
SCI0CR2=0X2C;/*RIE=1,TE=1,RE=1*/
//SCI0CR2=0X08;
}
/******发射端程序-----单字节发送********/
voidSciSend(unsignedchartext)
{
//unsignedchara;
//temp=SCI0SR1;/*clearflag*/
/*for(;;){
a=SCI0SR1;
if((a&0x40)==0x40)break;
}
*/
while(!
(SCI0SR1&0x80));/*waitforoutputbufferempty*/
SCI0DRL=text;
}
/********-接受部分(unsignedchar型数据)************/
charSciRead(void)
{
//unsignedchartemp;
unsignedcharresult;
//temp=SCI0SR1;//clearflag
while(!
(SCI0SR1&0x20));
result=SCI0DRL;
returnresult;
}
/*************************************wsl*************************************/
voidmkTasks(void)
{
byteiSpdCar=1;
staticintbDir=1;
floatrecd_T_speed,recd_B_speed;//接收到的速度值
DisableInterrupts;
init_sys(SYNE_SETTING,REFDV_SEETTING);
SciInit();
EnableInterrupts;
StartSpeedTest();//speedpidaction
for(;;)
{
while(ReceiveFlag)
{
ReceiveFlag=0;
/////////////////////////前进和后退控制///////////////
if(Cardata[0]!
=PreCartata[0])
{
if(((unsignedint)Cardata[0])==0x30){MOTORFORWORD;}
else{MOTORBACK;}
}
/////////////////////////油门和刹车控制//////////////////
Throttlespeed=(float)((Cardata[1]*10)/MAXSPEED)*(0.3);
SetCarSpeed(Throttlespeed);
if((unsignedint)Cardata[2]>0x50)CARSTOP;
/////////////////////////方向盘控制/////////////////////////
if(Cardata[3]!
=PreCartata[3])
{
if((unsignedint)Cardata[3]<=0x3c)
{
PWMDTY67=3750+((unsignedint)Cardata[3])*30;
}
else
{
PWMDTY67=3750-(256-(unsignedint)Cardata[3])*30;
}
}
strcpy(PreCartata,Cardata);
}
}
}
/**********程序起点main**********/
voidmain(void)
{
mkTasks();
}
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////////中断程序区///////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
#pragmaCODE_SEG__NEAR_SEGNON_BANKED
voidinterrupt20sci_interrupt(void)//serialcominterrupt//notused
{
Cardata[Receive]=SciRead();
++Receive;
if(Receive==4){Receive=0;ReceiveFlag=1;SciSend
(1);}
}
#pragmaCODE_SEGDEFAULT
附录2:
51单片机程序
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitmor1=P1^2;
sbitmor2=P1^3;
sbitkey_int0=P3^2;
sbitkey_int1=P3^3;
sbitkey_1=P0^0;
voidclk(void);
uchartlc_0834(ucharch);
voidsend_byte(ucharc);
voidinit_uart(void);
voiddelay(uintms);
voidSendInformation();
voidSendDirection();
voidSendAngle();
voidSendThrottle();
voidSendBrake();
voidSendToXS128();
sbitadc_clk=P1^6;
sbitadc_di=P1^4;
sbitadc_do=P1^5;
sbitadc_cs=P1^7;
ucharCanRecive=0;
ucharBrakeData,ThrottleData,DirectionData;//四个需发送信息。
ucharBrakeDataTemp,ThrottleDataTemp,ucharAngleData1,AngleData2;
charAngleData;
/////////发送到XS128的数据//////////////
//throttle:
油门(0~127)
//brake:
刹车(0~127)
//anlge:
转角(-60~