电动车跷跷板大学生电子设计竞赛一等奖.docx
《电动车跷跷板大学生电子设计竞赛一等奖.docx》由会员分享,可在线阅读,更多相关《电动车跷跷板大学生电子设计竞赛一等奖.docx(20页珍藏版)》请在冰豆网上搜索。
电动车跷跷板大学生电子设计竞赛一等奖
电动车跷跷板
大学生电子设计竞赛一等奖
摘要:
本系统以凌阳SPCE061A单片机为主控制器,辅以寻迹、角度传感器、微调、时间、测量与显示、无线传输和语音等单元,实现小车自己登陆跷跷板,寻迹前进与后退,LED显示时间,自动寻找平衡点并语音提示等基本要求和发挥部分功能。
此外,我们还扩展了路程测量与显示,上位机实时显示跷跷板状态的功能,可以在PC机上方便的观看系统状态,使其更加形象化。
关键词:
SPCE061A寻迹角度传感器无线传输
Abstract:
ThissystemtakesSurplusSPCE061AMCUasthemaincontroller,assistedwithseekingmarkunit,anglesensorunit,tinyregulationunit,measuringanddisplayingtimeunit,linelesstransmission,playingsoundandsoon,inorderthatitcanlandteeterboardbyitself,runforwardandbackwardaccordingtothefixedroute,measureanddisplaythetimebyLED,lookforthebalancepointautomaticallyandbroadcastsound.Onthebaseofachievingtheessencerequestandtheexertsection,wealsomeasureanddisplaythedistance,usecomputertodisplaytherealstateoftheteeterboardseparately.Inthisway,wecanseethesystem’sstateconvenientlyandvisuallyonthePC.
Keyword:
SPCE061ASeekingmarkanglesensorLinelesstransmission
1.系统方案
1.1系统设计与结构框图
根据题目要求,本系统主要由电源模块,控制器模块,电机驱动模块,寻迹模块微调模块,语音模块,显示模块,平衡检测模块,计时模块等构成。
系统的结构框图如图1所示:
1.2方案论证
小车选择:
本设计中小车要爬坡和自动登上跷跷板,购买玩具车不能很好的适应要求。
又考虑到四轮车转弯受到限制,菱形车爬坡不方便,所以我们自己设计车体结构为三角形,灵活性大,适于爬坡,且尽量使小车重心低以便于制动。
控制器选择:
方案一:
采用可编程逻辑器件CPLD
方案二:
采用Atmel公司的AT89S52单片机
方案三:
采用凌阳公司的SPCE061板。
CPLD可以实现各种复杂的逻辑功能、体积小、稳定性高,而价格也较高,适合作为大规模控制系统的控制核心。
AT89S52低功耗,高性能,但其本身功能较少,因此需要增加较多的外围电路来实现功能。
SPCE061A体积小,易扩展,结构简单。
从适用度和价格两方面考虑,我们决定采用61板作为主控制器。
电源模块:
小车为活动性机器,故最好采用电池供电。
电机工作需要12V电压,且要求较大的电流,其它模块需5V供电,电流要求不高。
这样,体积小,容量大,重量轻的锂电池结合12V—5V的DC-DC芯片便成为我们的最佳选择。
电机选择:
方案一:
采用步进电机
方案二:
采用直流减速电机
步进电机可以准确定位,但输出力矩低,速度慢,且体积大,重量大,不适用于小车爬坡,也可能达不到时间上的要求。
而直流减速电机转动力矩大,速度大,体积小,重量轻,因而成为我们的最终选择。
考虑到要防止小车下坡时惯性过大而滑出跷跷板,在满足时间要求基础上,我们选择50转/min减速电机以求较大力矩。
电机驱动模块
方案一:
采用晶体管构建H桥驱动
方案二:
采用专用芯片L298
H桥由4个三极管组成,可方便实现直流电机的四象限运行,分别对应正转、正转制动、反转、反转制动。
专用驱动芯片L298,响应频率高,一片可控制两个直流电机,操作方便,稳定性好,性能优良。
最终,我们选用L298作为电机驱动。
平衡检测模块
方案一:
采用铅垂线+光折断器
方案二:
采用角度传感器
根据题目要求,平衡的定义为A、B两端与地面的距离差d=|dA-dB|不大于40mm,即跷跷板的倾角要小于1.43º(arcsin(0.02/0.8)=1.43º)才能判定为平衡。
采用铅垂线+光折断器,通过判断垂线角度来判定平衡。
但操作起来比较复杂,且误差较大。
ZCT245AL—485角度传感器直接输出角度值,精度为0.1º,故我们采用方案二。
寻迹模块
方案一:
通过开关型霍尔传感器
方案二:
采用光电传感器
开关型霍尔传感器只能跟踪磁性物质组成的曲线,成本高,而反射式光电传感器采用一体化结构,利用黑、白线反射光的强弱寻迹,灵敏度高,体积小,且结构紧凑,安装方便,故采用方案二。
微调模块:
在小车调节达到一定程度后,再对其进行微调很不方便,很难控制它的移动距离,故我们增加微调模块。
即在小车上安装一舵机,由它来控制一重物前后运动,以此来调节小车一侧的力矩。
计时模块:
61单片机具有强大的中断功能。
我们可以通过开2HZ中断进行计数,然后计算出时间。
这样,无需外部硬件,程序也较简单。
.
显示模块:
数码管显示速度快,亮度高,我们用其来显示路程、时间及角度等数字信息,且为节省端口,采用了串口通信芯片CH451作为驱动。
语音模块:
61单片机自带语音模块,且具有语音处理函数库供用户调用,功能强大,应用方便。
所以我们选择此方法来播报语音。
路程测量模块:
方案一:
用霍尔开关。
方案二:
采用CCD鼠标。
霍尔开关利用霍尔效应原理,受到磁块体积限制,不能进行高度细分。
采用鼠标CCD摄像测距,安装方便,稳定性好,且精度高,可精确到0.1mm以内。
所以,我们采用方案二。
无线模块:
通过无线来实现小车与上位机的通讯,我们采用常见的无线单片收发芯片nRF2401,它体积小、功耗少、外围元件少,有助于减轻小车重量。
1.3实现方法
铝合金自制车体采用L298驱动直流减速电机实现行进,光电传感器结合寻迹算法完成电动车寻线功能。
利用角度传感器的测量量作为被控量,实现电动车的闭环反馈控制,根据PID控制算法找到平衡点,这是本系统的核心部分。
同时LED显示模块和PC无线通信模块实现了良好的人机交互界面。
我们确定的最终方案为:
1.小车模块:
采用自制三角形车体结构
2.控制模块:
采用凌阳公司的SPCE061A单片机
3.电源模块:
采用锂电池结合DC-DC芯片供电。
4.电机模块:
采用直流减速电机,由L298来驱动。
5.测角模块:
采用ZCT245AL—485角度传感器。
6.微调模块:
采用舵机控制一重物在车上平滑缓慢移动来实现。
7.寻迹模块:
采用反射式光电传感器。
。
8.计时模块:
采用开2HZ中断方式。
9.显示模块:
采用LED显示时间、路程及角度,由CH451作为驱动。
10.语音模块:
采用凌阳自带语音功能。
11.测距模块:
采用CCD鼠标测距。
12.无线模块:
采用无线单片收发芯片nRF2401。
2.理论分析与计算
2.1寻迹测量与控制:
本系统中要考虑三种状态下的寻迹算法:
第一,小车怎样实现自动驶上跷跷板;第二,前进过程寻迹算法;第三,逆向行驶时寻迹算法。
其中,登陆跷跷板的控制最为复杂。
为此,我们分别在车头、车体中央、车尾处安装了3、2、3个对管。
寻迹线的铺设完全与算法相结合。
然后根据读入的对管状态值,来调节小车的行驶状态。
寻迹线的铺设如附录A图1示,对管安装如附录A图2示,真值表如附录A表1示。
2.2时间测量与计算:
本系统中对于时间的计量是通过开2HZ中断的形式实现的,不需要任何硬件设施。
其具体实现方法就是每进入一次中断,则计数值加一。
通过该计数值,我们就可方便的计算出时间。
2.3平衡位置判定、计算、及调节控制方法:
判定:
系统中,我们采用角度传感器来测量小车与地面的夹角。
在小车由不平衡到平衡的过程中,跷跷板一定是处于振荡状态的。
若在一段时间内所测量到的角度值均在1.43º以内,则判定小车平衡。
计算:
设配重质量为Mpkg,重心距离转轴Spm,距板面hpm;小车重为Mckg,重心距板面hcm;微调物为Mmkg,重心距板面hmm旋转半径为Rm。
如附录A图3中A图所示,小车的最终理论平衡点距转轴S1的计算式为:
,由此可得
。
但由于跷跷板存在倾角Ø,使得物体重心偏移。
如附录A中图1B图所示,在有倾角Ø情况下,力矩平衡计算式变为:
,从而可得
。
到达该点后,小车再稍向前移动,跷跷板开始振荡。
控制:
由上述计算过程可知,小车在超出了理论平衡点后跷跷板开始振荡,我们所应做的,就是使小车能够退至合适的位置从而令跷跷板平衡。
综合分析各种常用控制算法和现有测试仪器:
由于跷跷板的振荡为谐振式,且角度传感器的响应频率较低,在小车速度较高时,我们并不能得到实时准确的角度值,因而我们必须在调节平衡时,先减小车速。
首先考虑采用二分法来调节小车移动方式,但实验之后发现这种方式不好控制。
最终,我们的控制方法为:
根据当前角度来控制小车下一步的步长,从而慢慢达到平衡。
3.电路与程序设计
3.1检测与驱动电路设计
电机驱动模块:
一片L298N可控制两个直流电机,我们用PWM输出来调制车速,且为了防止电机模块对前级的干扰,我们加了光电耦合级,电路连接如附录A图4示。
寻迹模块:
我们采用反射式光电对管,其输出接比较器,由地面反射状况的不同而输出1,0信号予以反馈。
其电路连接如附录A图5示。
角度传感器模块:
ZCT245AL—485角度传感器为485接口,故应将其先与485转换电路连接,然后再与单片机相连。
其电路连接如附录A图6示。
显示模块:
数码管用于显示时间、路程和角度,由串口通信芯片CH451来驱动,采用动态显示方式,其电路连接如附录A图7示。
无线模块:
nRF2401业界体积最小、功耗最少、外围元件最少的无线单片收发芯片,编程很方便,实际传输距离在50-80米左右。
其电路如附录A图8示。
3.2总体电路图
单元电路确定后,我们对单片机端口进行了合理的分配,整个系统的总体电路如附录A图9示,最终小车实物如附录图10示。
3.3软件设计与工作流程图
因为本系统中小车要进行前进、平衡调节、延时、语音播报、后退等一系列活动,所以对于程序的安排结构要求严格。
在此,我们采用模块化设计方法,将整个程序分为以下几个模块:
.主程序;电机驱动子程序;寻找平衡点子程序;LED显示子程序;无线通信子程序等。
主程序代码见附录2。
主程序流程图如下图2示。
4.功能测试与结果分析
4.1基本功能测试
表1基本功能时间测试
1
2
3
实际时间(s)
5s
5s
5s
显示时间(s)
5s
5s
5s
1
2
3
平衡倾角值
0.5º
0.3º
0.4º
平衡所需时间
30
37
33
1
2
3
实际时间(s)
4s
4s
4s
显示时间(s)
4s
4s
4s
1
2
3
实际时间(s)
9s
9s
9s
显示时间(s)
9s
9s
9s
4.2发挥功能测试:
表2配重平衡测试
左侧
右侧
中间
能否自动驶上跷跷板
能
能
能
第一次平衡平衡倾角
0.6
0.7
0.6
第二次平衡平衡倾角
0.6
0.6
0.8
表3时间测试
1
2
3
登上跷跷板时间
4s
3s
4s
第一次平衡时间
36s
34s
38s
第二次平衡时间
72s
68s
76s
显示时间
1:
12
1:
08
1:
16
4.3创新发挥
在完成基本要求和发挥部分的基础上,我们又扩展了以下功能:
用CCD鼠标测量路程并由数码管实时显示,精度可达0.01cm;通过无线收发芯片nRF2401与上位机实现通讯,从而在上位机上对跷跷板状态形象化显示。
4.4结果分析:
我们在软件上精心调试多次,硬件上注意每一个小细节,最终使得我们的小车在多次测试中都较好地完成了题目地基本要求和发挥部分。
同时我们所扩展的路程测量与显示功能,上位机实时显示跷跷板状态功能也得以实现,效果良好。
5.结束语
通过良好的寻迹,二分法与微调结合等算法,我们的小车可顺利完成各段行程,并较为快速的找到平衡点;通过鼠标测距、中断计时,可实时显示路程与时间;通过nRF2401,顺利实现小车系统与上位机的无线通讯,从而通过PC机直观、形象的显示跷跷板状态。
6.参考文献
[1]海成等。
《MCU-DSP型单片机原理与应用》。
北京航空航天大学出版社
[2]张培仁等。
《机器人控制系统设计与实现》。
北京:
清华大学出版社
[3]谭浩强.。
《C语言程序设计》(第二版)。
北京:
清华大学出版社
[4]于海生等。
《微型计算机控制技术》。
北京:
清华大学出版社
[5]黄智伟等。
《全国大学生电子设计竞赛训练教程》。
电子工业出版社
[6]王鸿明.。
《电工技术与电子技术.》。
北京:
清华大学出版社
[7]王成华。
《电子线路基础教程》。
科学出版社,
附录A
图1寻迹线
图2对管安装图
图3平衡计算示意图
B
图4电机驱动电路图
图5光电对管连接图
图6角度传感器连接图
图7数码管驱动电路图
图8nRF2401连接图
图9系统总电路图
表1寻迹真值表
1
2
3
4
5
6
7
8
反应
前进
0
1
0
×
×
×
×
×
前进
1
0
0
×
×
×
×
×
左转
0
0
1
×
×
×
×
×
右转
1
1
1
×
×
×
×
×
停止
后退
×
×
×
×
×
0
1
0
前进
×
×
×
×
×
1
0
0
左转
×
×
×
×
×
0
0
1
右转
×
×
×
×
×
1
1
1
停止
转弯
1
0
0
0
0
0
0
0
右转
1
1
0
0
0
0
0
0
右转
0
1
0
×
×
×
×
×
前进
0
0
1
0
0
0
0
0
左转
0
1
1
0
0
0
0
0
左转
附录B
#include"SPCE061A.h"
/*
系统端口分配
IOA0~3左右电机方向IOB0、1鼠标测距
IOA4舵机IOB2~5NF2401
IOA5~7CH451IOB8、9左右电机PWM调速
IOA8~15光电对管IOB7、10、11角度传感器
*/
//sxw
#defineZCT_FILT0//输出频率设定(FILT**)
#defineZCT_Z1//以当前位置为相对零度(&Z)
#defineZCT_HE2//十六进制通信模式(*HE)
#defineZCT_P3//执行单次输出(*P)
#defineZCT_n4//连续输出模式(*n)
externvoidUART_Init();
externvoidInit_CH451();
externvoidWrite_Angle_Comm(unsignedintcomm_number);
externvoidRead_Angle_Data();
externvoidProcess_Data();
externvoidrun();
externvoidrun_slow(intmotor_left,intmotor_right);
externvoidFollow_Line_Zheng();
externvoidFollow_Line_Fan();
voidSys_Init();
voidDelay_16us(unsignedintus);
voidDelay_ms(unsignedintms);
intstop();
externintx_angle,y_angle,angle_begin;
intisStop=0;
intclock=0;
intmain(void)
{
unsignedintmode=1,stop_flag=1;
unsignedintA_C=1,C_B=0,B_A=0,Seek_balance=0;
unsignedintA_C1=1,C1_C2,C2_B=0;
unsignedintcar_line_flag=0;
unsignedintangle_i=0;
unsignedintcar_balance_time=140,car_balance_time_demo=140;
intmouse_distance=0,car_distance=10;//10cm//1英寸等于2.54cm,400个点,128为0.8128cm
intmouse_distance_demo;
Sys_Init();
UART_Init();
Write_Angle_Comm(ZCT_n);
Write_Angle_Comm(ZCT_n);
Write_Angle_Comm(ZCT_HE);
Write_Angle_Comm(ZCT_HE);
Init_CH451();
Mouse_Init();
Read_Angle_Data();
if(mode==1)//基本部分,模式1
{
/*for(;angle_i<3;angle_i++)
{Read_Angle_Data();//读取角度传感器数据,加上自适应
angle_begin+=y_angle;
}
angle_begin=angle_begin/3;//计算出起始角度(跷跷板角度5.02)
*/
while(stop_flag)//演示过程
{
if(A_C)//从A点到C点
{
Follow_Line_Zheng();//寻迹正走
/*if(stop()){//检测到C点的十字线,进入寻找平衡状态
A_C=0;C_B=1;//?
?
?
//可采用过线方式,以减少干扰
Delay_ms(1000);
run(2,2);
}*/
if((*P_IOA_Data&0x0700)==0x0700)car_line_flag=1;
if(((*P_IOA_Data&0x1800)==0x1800)&&car_line_flag)
{
car_line_flag=0;
run(0,0);
A_C=0;Seek_balance=1;
Delay_ms(2000);
}
}//if(A_C)
/**************************************************************************
***寻找平衡
*************************************************************************/
if(Seek_balance)//分成一小段
{
Read_Angle_Data();
Show_Angle(y_angle);
mouse_distance_demo=Read_Mouse();
while((y_angle>28)||(y_angle<-28))
{
if(y_angle>28)
{while(mouse_distance{Follow_Line_Zheng_Slow();
Delay_ms(20);//速度慢,故可每隔50ms读取一次数据
Show_Time();//也需考虑时间
mouse_distance+=Read_Mouse();//数据需另处理否?
?
}
run_slow(0,0);Delay_ms(500);
mouse_distance+=Read_Mouse();//实际走的距离补偿
car_distance=mouse_distance;//更新数据
mouse_distance=0;
}
else
{while((-mouse_distance){Follow_Line_Fan_Slow();
Delay_ms(20);//速度慢,故可每隔50ms读取一次数据
Show_Time();//也需考虑时间
mouse_distance+=Read_Mouse();
}
run_slow(0,0);Delay_ms(500);
mouse_distance+=Read_Mouse();//实际走的距离补偿
car_distance=mouse_distance;//更新数据
mouse_distance=0;
}
run_slow(0,0);
Delay_ms(2000);
Read_Angle_Data();
Show_Angle(y_angle);
*P_Watchdog_Clear=1;
}
}
if(C_B)//从C点到B点
{
Follow_Line_Zheng();
if(stop()){//检测到C点的