资源描述
自动追光自动壁障
电动小车(B题)
摘要:本电动小车系统是用飞思卡尔公司生产的16位MC9S12XS128单片机作为主控制芯片,2片MC33886作为驱动芯片控制小车左右两路直流电机,电动小车模型采用左右两路直流电机驱动四轮,车模精简、稳定性高。左右两电机差速实现转向功能,小车简易减速齿轮箱,各装有两个编码器,实现左右各两轮的测速,方便小车转向定位。小车供电系统是由3路低压差2940稳压芯片构成的。小车壁障传感器采用超声波传感器,精确测得障碍物距离小车位置,以实现小车及时躲避障碍物。小车追光系统采用3个光敏电阻成圆弧形摆布置于单舵机构成的机构上,实现实时锁定光源,完成追光壁障功能。
根据实测结果,表明所设计的系统性能指标完全达到题目基本要求,发挥部分也已经完全满足题目要求。
关键字:MC9S12XS128单片机 转向定位 超声波传感器 单舵机摇头机械结构
目录
1 引言 ..........................................................4
2 方案设计 ......................................................4
2.1 设计思路 ................................................4
2.2 系统整体结构 ............................................4
2.3 单元模块设计方案选择 ....................................5
2.3.1 小车底盘 ..........................................5
2.3.2 单片机控制部分 ....................................5
2.3.3 电机驱动电路 ......................................5
2.3.4 壁障追光传感器选择 ................................5
2.3.5 追光系统机械结构 ..................................6
2.3.6 太阳能充电系统 ....................................6
3 设计实现 ......................................................6
3.1 场地的实现 ..............................................6
3.2 控制和伺服电路设计 ......................................6
3.3 小车壁障的实现 ..........................................7
3.4 跟踪引导算法的实现 ......................................7
3.5 太阳能板追光和引导的实现.................................7
3.6 小车停车的实现 ..........................................8
3.7 太阳能充电系统实现 ......................................8
4 系统测试 ......................................................8
4.1 测试仪器 ................................................8
4.2 测试方法 ................................................8
4.3 测试结果 ................................................8
4.4 测试结果分析 ............................................9
5 结论 ..........................................................9
参考资料 ........................................................9
附录1 系统硬件原理图 ...........................................10
附录2 程序清单 .................................................11
自动追光自动壁障电动小车
1 引言
为了满足题目要求,本电动小车系统采用超声波传感器精确定位障碍物位置实现壁障;用光敏电阻寻找光源,光敏电阻置于摇头机构上,完成光源的准确追踪;太阳能充电系统;整个小车系统硬件电路紧凑、对称、整齐,机械结构合理,重心稳定。整个小车系统很好地达到了题目要求。
2 方案设计
2.1 设计思路
为设计一集追光、壁障、太阳能智能充电系统于一体的智能小车系统,本参赛队采用飞思卡尔公司生产的16位MC9S12XS128单片机作为控制芯片,电机驱动芯片MC33886控制小车系统的RS-260直流电机,动力强劲。为实现测速功能,使用了2个100线的编码器,利用XS128输入捕捉功能进行测速。供电系统用3片低压差稳压芯片2940构成3路供电系统。自行制作了超声波测距模块,实现3米内障碍物位置测定,模块工作稳定。伺服舵机构成的双自由度云台进行对光源的定位。
2.2 系统整体结构
系统硬件原理图见附录1。系统结构框图如图1所示。
XS128
寻光系统
MC33886
舵机
编码器
输出模块
超声波收发模块
2940供电系统
太阳能充电系统
图1 系统结构框图
本智能追光壁障可太阳能充电小车是以控制芯片MC9S12XS128辅以外围电路设计而成。用电机驱动芯片MC33886提供动力,超声波传感器实现壁障,光敏电阻组成的检测光源追光系统,独立的太阳能充电系统,从而组成此基本追光壁障太阳能可充电智能小车。
2.3 单元模块设计方案选择
2.3.1 小车底盘
方案1:采用双直流减速电机各驱动两轮,配以万向轮转向的小车底盘。此种小车底盘转向灵活,易于控制,便于壁障。但小车载重较多时重心不稳,更不利于双自由度云台实时追踪光源。
方案2:采用飞思卡尔智能车车模,有舵机控制转向,精准,但其转弯半径较大,不利于壁障,动力强劲,容易过冲。
方案 3:采用双直流电机驱动四轮的机器人平台小车底盘,小车机械结构紧凑,重心稳,易于负重。采用双轮差速配合编码器测速,可以实现转向定位。
综上3种方案,为了保证小车载重多时重心较稳,易于负重,本参赛队选择方案3作为壁障追光小车系统的小车底盘。
2.3.2 单片机控制部分
方案1:采用STC公司生产的最新产品STC12C5A60S2,此单片机具有两路PWM/PCA功能,8路AD采集,双串口,内部时钟总线最高可达35Mhz。但本电动小车系统所需PWM输出较多,用定时器模拟非常麻烦。
方案2:采用飞思卡尔公司生产的MC9S12XS128单片机,此单片机具有8路PWM,16路AD采集通道,2个UART,2个硬件SPI,具有背景调试功能,方便实时查看程序中全局变量的值,具有80个引脚,硬件资源相当丰富。
综上2种方案,因所需PWM输出较多,本参赛队选择方案2作为控制芯片。
2.3.3 电机驱动电路
方案1:采用直流电机驱动芯片L298,驱动电流可达1.2A,外围器件较简单,但体积较大,引脚呈两排,间距小,不利于手工焊接连线。
方案2:采用直流电机驱动芯片MC33886,驱动电流可达2A,外围器件简单,贴片封装体积小,采用DIP转接板后,较利于手工焊接。
综上2种方案,为减少芯片占板面积,利于手工焊接,本参赛队选择方案2作为电机驱动电路芯片。
2.3.4 壁障追光传感器选择
方案1:壁障传感器采用超声波模块,测距精准无干扰,追光传感器用光敏电阻,光敏电阻对光线敏感,电阻值在亮暗环境下相差甚大。光敏电阻配合筒状遮体,可以精准地对光线实现定位。
方案2:壁障传感器采用光电开关,测距亦较精准,追光传感器采用光敏二极管或光敏三极管,采集的是开关量,追踪光源精度较低。
综上2种方案,为使测距精准无干扰,且追踪光源精度高,本参赛队选择方案1的超声波模块和光敏电阻。
2.3.5 追光系统机械结构
方案1:采用单舵机机械结构,U型件固定的太阳能电池板和追光系统在机械结构上并不复杂。左右摆动控制太阳能电池板面对光源的朝向,架设位置适中,单舵机程序中算法实现较协调,算法处理后舵机总是可以单输出锁定光源。
方案2:采用双舵机构成的双自由度云台机械结构,U型舵机支架和舵机底盘支架固定双舵机,太阳能电池板固定位置可能超过25cm。双舵机输出位置在算法中控制复杂,在时间有限的情况下未必可以实现。
综上2种方案,为使车体整体高度适中,算法较协调易实现,本参赛队选择方案1的单舵机机械结构固定追光系统和太阳能电池板。
2.3.6 太阳能充电系统
方案1:采用大功率太阳能电池板用继电器控制直接给蓄电池充电,由单片机内部AD通过精密分压电阻采集此时发电电压和电池电压,换算成功率,当电池板发电功率大于蓄电池功率,继电器接通充电电路。但可能使被充电电池电压会在很短时间上升,造成虚电压,若不加控制,电池电压会继续上升高于其额定电压,造成危险。
方案2:采用功率适中,面积适中的电池板,使用PWM脉宽调制的方式去控制MOS管的导通,从而利用PWM的占空比去控制充电电流,并联一个指示灯,通过指示灯的明暗程度,直观的显示此时的充电状态强弱,再结合单片机对光电板和电池电压的采集比较,当电池电压接近其额定电压,改用较小充电电流,提高浮充电压点,尽量减弱虚电压作用,达到理想的充电状态。
综上2种方案,方案1功率电池板面积较大,重量较重,增加小车负载,使转动惯量大,转向定位精度下降,充电不易控制,充电效果不好,故本队选用方案2脉宽调制充电方式。
3 设计实现
3.1 场地的实现
本参赛队在四天三夜制作智能小车过程中,队员间相互协作,手工利用KT板制作题目要求的场地和障碍物。光源用100W的白炽灯模拟,同时对白炽灯产生的光进行凹面半球形聚光。场地面积分别为1.5m*1.5m和2m*2m两块场地。15cm*15cm*15cm的正方体障碍物。在1.5m*1.5m范围内随机摆放3个障碍物,光源在1.5m固定位置摆放,高度25cm。
3.2 控制和伺服电路设计
以XS128为核心控制芯片,超声波实时发送声波,检测障碍物,根据光敏电阻状态,单片机控制舵机带动太阳能电池板转向始终面向光源,并根据舵机转向控制小车行进,左右测速电机实时反馈出小车运行状态提供给单片机进行数据分析。
3.3 小车壁障的实现
小车驶入场地后,如若遇到障碍物,超声波检测障碍物距离,障碍物在车体前20cm以内位置,车体调节转向以躲避障碍物。在检测到光源情况下,车体在壁障时太阳能电池板和追光系统锁定光源位置,车体进行转向以实现壁障同时追踪光源。
3.4 跟踪引导算法实现
在没有障碍物的情况下,光源位置指导小车前进,即进行追光,太阳能电池正对光源对蓄电池进行充电,有障碍物时壁障,小车离光源一定位置时停车。
程序流程图如图2所示。
检测是否有光源
开始
设定初始值
锁定光源
检测是否有障碍
壁障
继续前进
距离是否可停车
光源指导前进
停车
Y
Y
Y
N
N
N
图2 程序流程图
3.5 太阳能板追光和引导的实现
利用光敏电阻对环境亮暗的敏感性设计寻找光源传感器,即光敏电阻和已知电阻的分压电路,采集光敏电阻端和已知电阻端间电压,通过模拟量的电压分析,即可模糊地判断光线的强弱。与另两路寻光传感器电路中得到的电压值相比较,即可判断出光源的位置。利用单舵机机械结构实时把光源位置方向锁在正中间光敏电阻所对方向。
由于光敏电阻对环境的敏感性,导致环境中的散光造成的同一规格的光敏电阻在相同照度下电阻值不同。为此,在每个光敏电阻前加筒状遮体,使光敏电阻的基准电阻值基本相同,为检测光源时三者电阻值的比较有统一标准,提高光源检测的精确度。
采集的电压值为模拟量,提高了光源检测的空间精度,模拟量亦可以作比较,赋相应的比例系数、微分系数代入舵机控制软件模块。光敏电阻检测光源电路图如图3所示。
串联分压的电阻使用精密可调电位器,弥补三个光敏电阻由于自身固有参数不一致导致相同状态下各自状态量差异太大,以采集到的电压值大小判断离光源的远近。
3.6 小车停车实现
小车在发现光源后追踪光源实时锁住光源位置,当中间光敏电阻上模拟电压小于一定值时,小车则停车,找到光源大致位置。
3.7 太阳能充电系统实现 图3 光源检测电路
太阳能充电系统中设计一发光二极管来指示太阳能为蓄电池供电状态,发光二极管越亮,充电电流越大,反之灯越暗电流越小。方便且直观地指示了太阳能充电系统的工作状态。
4 系统测试
4.1 测试仪器
测试仪器包括数字万用表,示波器,直流电源。
4.2 测试方法
数字万用表主要用来测试各个I/O口状态和电路中引线的通断状态;示波器用来检测PWM输出的频率;直流电源为模块电路提供测试电源。
4.3 测试结果
序号
具体要求
实现情况
1
基
本
要
求
光源用不大于100W的白炽灯,场地不小于1.5m*1.5m,障碍物不小于15cm*15cm*15cm。可以对光源进行聚光。
完成
2
光源在离小车大于1.5m的固定位置摆放,放置高度不高于25cm。小车发现光源后沿光源方向前进。
完成
3
小车前进方向上至少随机放置三个障碍物。遇到障碍物,小车应绕道前进。
完成
序号
具体要求
实现情况
4
在小车绕道过程中,太阳能板应始终对准光源。
完成
5
到达离光源一定位置后,小车应停止前进。
完成
6
小车前进直线距离应大于1.2米,时间不大于2分钟。
完成
7
能显示太阳能为蓄电池供电状态。
完成
8
发
挥
部分
场地尺寸2m*2m,光源离小车2米以上。
完成
9
障碍物5个以上。
完成
10
能逆着光源前进,并绕过障碍物,但太阳能板始终对准光源。
未完成
11
完成时间不大于1分钟。
未完成
12
在无白炽灯光源情况下,小车可以沿自然光源方向前进。
未完成
13
其他
未完成
4.4 测试结果分析
小车在1.5m*1.5m的场地上,能够追踪光源,实时将太阳能电池板正对光源,给蓄电池充电,行进过程中能躲避障碍物,最终到达光源一定位置后停车。
5 结论
由测试结果知道,本设计完成了全部基本要求和部分发挥要求。
此次电子设计大赛使我们获益匪浅,收获颇丰。设计制作过程中,我们遇到了很多的困难,但通过团队的协作,最终我们一一克服了它,并且取得了成功。总结经验,理论知识固然重要,动手能力也要重视,另外,队员之间一定要团结协作,共同攻关。通过这次设计制作,我们发现需要学的知识还有很多,所以我们还要继续努力,增加电子知识储备量。
参考资料
[1]《protel DXP电路设计与应用》臧铁钢 唐才峰等编 中国铁道出版社
[2]《电子系统设计实践》全国大学生电子设计竞赛湖北赛区组委组编 华中科技大学出版社
[3]《全国大学生电子设计竞赛技能训练》黄智伟编 北京航空航天大学出版社
[4]《单片机与嵌入式系统开发方法》薛涛 宫辉 曾鸣等编 清华大学出版社
附录1 系统硬件原理图
附录2 程序清单
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
typedef unsigned int uint;
typedef unsigned char uchar;
#include "5110.h"
#include "init.h"
#include "count_distance.h"
#include "steering_engine con.h"
#include "control_car.h"
uchar n;
void main()
{
init_all(); //系统初始化
EnableInterrupts; //开总中断
for(;;)
{
LCD_write_string(0,0,"dist:");
LCD_write_num((uint)(true_distance));
LCD_write_char(' ');
LCD_write_char(' ');
LCD_write_char(' ');
LCD_write_string(0,1,"PAC:");
LCD_write_num(get_speed);
LCD_write_char(' ');
LCD_write_char(' ');
LCD_write_char(' ');
LCD_write_char(' ');
//get_analog();
control_steer();
car_control();
LCD_write_string(0,2,"ad0:");
LCD_write_num(ad0);
LCD_write_char(' ');
LCD_write_char(' ');
LCD_write_string(0,3,"ad2:");
LCD_write_num(ad2);
LCD_write_char(' ');
LCD_write_char(' ');
LCD_write_string(0,4,"ad4:");
LCD_write_num(ad4);
LCD_write_char(' ');
LCD_write_char(' ');
LCD_write_string(0,5,"lsp:");
LCD_write_num(last_control_pwm);
LCD_write_char(' ');
LCD_write_char(' ');
LCD_write_string(50,5,"p:");
LCD_write_num(control_pwm);
LCD_write_char(' ');
LCD_write_char(' ');
}
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 7 RTI_ISR() //实时中断函数采集速度
{
CRGINT_RTIE=0;
CRGFLG_RTIF=1;
n++;
if(n==3)
{
n=0;
get_speed=PACNT;
if(large_turn_flag==1||small_turn_flag==1)
PACNT=0; //只要有转弯走过的路径就不在40cm内记
}
CRGINT_RTIE=1;
}
void interrupt 66 PIT0_interrupt(void)
{
PITTF_PTF0=1;
}
void interrupt 67 PIT1_interrupt(void ) //超声波测距时用
{
over_flag=1;
PITTF_PTF1=1;
}
#define beep PORTB_PB1 //蜂鸣器脚定义
#define left_light PTS_PTS2
#define right_light PORTA_PA6 //左右两路指示灯
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1500;y>0;y--);
}
void set_busclk_16M() //超频到16M
{
CLKSEL=0X00;
PLLCTL_PLLON=1;
SYNR=0x00 | 0x01;
REFDV=0x80 | 0x01;
POSTDIV=0x00;
_asm(nop);
_asm(nop);
while(!(CRGFLG_LOCK==1));
CLKSEL_PLLSEL =1;
}
void PWM_init() //PWM初始化
{
PWME=0x00;
PWMCTL=0xc0; //45、67级联
PWMCLK=0xbf; //使用CLOCK SA和CLOCK SB
PWMPRCLK=0x33; //CLOCK A=16/8=2M,ClOCK B=16/8=2M
PWMSCLA=10;
PWMSCLB=10; //CLOCK SA=CLOCK A/(2*PWMSCLA)=100KHZ, CLOCK SB=CLOCK SB/(2*PWMSCLB)=100KHZ
PWMCAE=0; //中间对齐
PWMPOL=0xbf; //起始输出高电平
PWMPER67=1000;
PWMPER45=1000; //period=100HZ
PWMPER0=100;
PWMPER1=100;
PWMPER2=100;
PWMPER3=100; //period=1KHZ
PWMDTY67=143;
PWMDTY45=143;
PWMDTY0=0;
PWMDTY2=0; //左路电机
PWMDTY1=0;
PWMDTY3=0; //右路电机
PWME=0xbf; //使能PWM 0,1,2,3,45,67通道
}
void PIT_init() //PIT初始化,PIT0超声波测距时用,PIT1 5110显示刷新
{
PITCFLMT_PITE=0; //disable PIT
//PITCE_PCE1=0; // 周期中断定时器1使能(此步很重要,只有先使能通道,才能够装初值)
PITMUX_PMUX1=1; // 通道1与微定时器1相关联
PITINTE_PINTE1= 1; // 通道1中断使能
PITCE_PCE0=1;
PITMUX_PMUX0=0;
PITINTE_PINTE0= 1;
PITMTLD0=160-1; //产生一个定时脉冲为10us
PITLD0=1000-1; //定时10ms
PITCFLMT_PITE=1; //使能PIT
}
void ADC_init() //ADC初始化
{
ATD0CTL1 = 0x00; //7:1-外部触发,65:00-8位采集精度,4:放电,3210:ch
ATD0CTL2 = 0x40; //禁止外部触发,中断禁止
ATD0CTL3 = 0xe8; //右对齐无符号,每次转化6各序列, No FIFO, Freeze模式下继续转化
ATD0CTL4 = 0x01; //765:采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]=8M
ATD0CTL5 = 0x30; //6:0特殊通道禁止,5:1连续转化 ,4:1多通道轮流采样
ATD0DIEN = 0xff; //禁止数字量输入
}
uchar read_adc(uchar ch)
{
uchar ad;
while(!ATD0STAT0_SCF);
switch(ch)
{
default:
case 0:
ad = ATD0DR0L;
break;
case 1:
ad = ATD0DR1L;
break;
case 2:
ad =ATD0DR2L;
break;
case 3:
ad =ATD0DR3L;
break;
case 4:
ad =ATD0DR4L;
break;
case 5:
ad =ATD0DR5L;
break;
case 6:
ad =ATD0DR6L;
break;
case 7:
ad =ATD0DR7L;
break;
}
return ad;
}
void ECT_init()
{
TIOS=0x00;
TSCR1=TSCR1_TEN_MASK;
TSCR2=TSCR2_PR0_MASK;
TCTL4=TCTL4_EDG0A_MASK|TCTL4_EDG1A_MASK|TCTL4_EDG2B_MASK;
PACTL=0x40;
TFLG1=TFLG1_C0F_MASK|TFLG1_C1F_MASK|TFLG1_C2F_MASK;
TIE=0x00; //关闭所有通道中断
}
void RTI_init()
{
CRGINT_RTIE=1;
RTICTL=0x52;
CRGFLG_RTIF=1;
}
void init_all() //初始化
{
set_busclk_16M();
PWM_init();
PIT_init();
ADC_init();
RTI_init();
ECT_init();
DDRA_DDRA6=1;
DDRB=0xff;
DDRS_DDRS1=1;
DDRS_DDRS2=1;
DDRS_DDRS3=0;
delay1ms(200); //延时200ms
beep=1;
LCD_init(); //LCD初始化函数
LCD_clear(); //LCD清屏幕
}
#define steer_center 143
#define right_limit 43
#define left_limit 243
uchar ad0,ad2,ad4; //分别对应于左、中、右三个光敏电阻采回的模拟电压的数字量
uchar KP; //比例系数
uchar last_pwm_value_init; //上一次舵机输出值初始化
uchar control_pwm; //舵机PWM输出值
uchar last_control_pwm; //上一次舵机PWM输出值
void get_analog() //采集三路光敏电阻采光系统中的电压值
{
ad0=read_adc(0); //左路光敏电阻
ad2=read_adc(2); //中路光敏电阻
ad4=read_adc(4); //右路光敏电阻
}
/*void search_m_analog() //找寻中间光敏电阻最小值的位置
{
uint i;
uchar j;
temp_control_pwm=left_limit;
get_analog(); //检测一下三个传感器的状态
if(ad2_value_init==0)
{
j++;
if(j==2)
ad2_value_init=1; //初始化完成
}
for(i=0;i<20;i++)
{
if(left_flag==0&&right_flag==0) //对中间光敏电阻的变化趋势进行判断
{
if(ad_last-ad_pre>0)
{
}
}
temp_control_pwm=temp_control_pwm-10; //从左往右以步进10进行舵机打角
get_analog(); //每打一次角采集一次模拟量
if(ad2-ad2_last>0&&ad2_value_init==1) //如果出现拐点,则记住PWM的输出,退出循环
{
control_pwm=temp_control_pwm-10;
ad2_value_init=0;
break;
}
PWMDTY45=temp_control_pwm; //输出临时打角值,进行找寻中间光敏电阻最小值
ad2_last=ad2; //保存此次中间光敏电阻的状态
ad2_pre=ad2_last;
}
} */
void analog_analyse()
{
get_analog();
if(last_pwm_value_init==0)
{
last_control_pwm=steer_center;
KP=25;
last_pwm_value_init=1; //初始化完成
}
if(ad0-ad2<0) //左边接收到光源
{
control_pwm=last_control_pwm-(ad0-ad2)*KP/100;
}
else if(ad4-ad2<0) //右路接收到光源
{
control_pwm=last_control_pwm+(ad4-ad2)*KP/100;
}
else if(ad2-ad4<0&&ad2-ad0<0) //中间接收到光源
{
if(ad2<80)
{
control_pwm=last_control_pwm;
}
else
control_pwm=last_control_pwm-(ad2-ad0)*5/100+(ad2-ad4)*5/100; //也进行角度调节
}
else
{ //其他情况则舵机打角到中间位置
control_pwm=steer_center;
}
last_control_pwm=control_pwm; //保存上一次舵机输出值
}
void control_steer()
{
analog_analyse();
if(control_pwm>=left_limit)
control_pwm=left_limit;
else if(control_pwm<=right_limit)
control_pwm=right_limit;
PWMDTY45=control_pwm; //模拟量分析
}
展开阅读全文