飞思卡尔智能车模起跑线识别方法的设计与实现(光电组)
飞思卡尔智能车光电资料(doc 8页)

飞思卡尔智能车光电资料(doc 8页)基于光耦传感器的控制方法-从离散量到连续量康世胤1,李长城2,莫一林3,顾全全4,陆耿5(1. 清华大学自动化系,北京 100084;2. 清华大学自动化系,北京 100084;3. 清华大学自动化系,北京 100084;4. 清华大学自动化系,北京 100084;5. 清华大学自动化系,北京 100084)摘要: 第一届“飞思卡尔”杯全国大学生智能车邀请赛要求对高速行驶的小车进行实时控制,使其巡线完成比赛赛道。
针对这种要求,我们选择了最成熟的PID控制,尝试了由离散的不完全微分的PD控制到相对连续PD控制的过渡,通过采集光耦传感器输出的模拟量,采用对称求位置法得到连续性较好的位置信息,利用双排传感器计算角度,对位置和角度同时进行PD控制,经过细致调试确定相应参数,并合理利用分段、设置死区等方法,最终小车可以获得较好的稳定性和在高速情况对赛道中心线的跟随特性。
关键词:道路寻迹;PID控制;对称定位;离散;连续Control Method Based on Photoelectric Coupling Device – fromDiscrete Signal to Continual SignalKANG Shiyin1,LI Changcheng2,MO Yilin3,GU Quanquan4,LU Geng5(1. Automation, Tsinghua University, Beijing 100084, China;2. Automation, Tsinghua University, Beijing 100084, China;3. Automation, Tsinghua University, Beijing 100084, China;4. Automation, Tsinghua University, Beijing 100084, China;5. Automation, Tsinghua University, Beijing 100084, China;)Abstract: In the coming FREESCALE College Student Smart Car Competition ’06, real time control strategies are required to be applied in the high-speed model car which to make sure the car tracking the unknown road and finishing 2 laps of game. Based on the requirement we select one of the most well applied proportion-integration-deviation (PID) method. Much works are carried out including trying varies of strategy from initial discrete PD to final continual PD. In the current strategy analog output of photoelectric coupling devices are sampled and converted from A to D. Symmetric positioning method is applied to obtain precise direction information. Furthermore by applying dual sensor array the turning angle is calculated. PD method is applied on location and angle. After careful modification the corresponding parameters are decided empirically. In addition by using some other methods such as track segmentation and dead area presetting, the model car can obtain better status including good stability and fine tracking character in high speed.Key words: Road Tracking, Proportion-Integration-Deviation Control, Symmetric Positioning, Discrete, Continual第一届“飞思卡尔”杯全国大学生智能车邀请赛的赛题是控制比赛小车,使其按要求用尽可能短的时间完成比赛赛道,比赛允许选手自行设计传感器和控制电路,并编写控制程序,禁止改动舵机和轮胎等小车结构。
第五界飞思卡尔智能车大赛程序(光电组)

}
else if(turn_value==direction_turn[0])
{
turn_value=direction_turn[0];
speed_expect=speed_set[0];
}
break;
case 2:if(turn_value==direction_turn[0])
//The PIT module has no external pins.
//PIT 模式没有外部引脚
unsigned char light=0; //激光管检测标志
unsigned short turn_value=0; //转向的PWM数值
unsigned short direction_turn[7]={333,430,560,647,705,780,888}; //转向给定值初始化
{
turn_value=direction_turn[6];
speed_expect=speed_set[6];
}
else if(turn_value==direction_turn[6])
{
turn_value=direction_turn[6];
speed_expect=speed_set[6];
}
else if(turn_value==direction_turn[2])
{
turn_value=direction_turn[1];
speed_expect=speed_set[1];
}
break;
case 4:if(turn_value==direction_turn[1])
飞思卡尔智能车 智能车源代码光电组(有注解)

智能车源代码光电组(有注解)#include <hidef.h> /* common defines and macros */#include <mc9s12dg256.h> /* derivative information */#include "math.h"#include "PWM.h"#include "A TD.h"#include "LQprintp.h"#pragma LINK_INFO DERIV A TIVE "mc9s12dg256b"unsigned int i = 0;unsigned int j = 0;unsigned int t = 0;byte ad_value[13];uchar data[13];int sum = 0;uchar start_flag = 0;uchar num = 0;uchar lw=0;unsigned int per = 65530;int SPWM = 0;int L_SPWM = 0;unsigned int SPmax = 1000;int MPWM = 0;uchar current_corrd = 0;static unsigned int mem_num = 0;//***********************PID**************** ***************static unsigned int Kp=25;static unsigned int Kp2=60;static unsigned int Ki=9;static unsigned int Kd=30;static unsigned int rKp=100;static unsigned int rKp2=60;static unsigned int rKi=0;static unsigned int rKd=60;unsigned short E = 5;unsigned char q = 1;int Mp = 0;int Mi = 0;int Md = 0;int Mp2 = 0;int P_Speed = 0;int L_u[3];//****************************************** ****************//***********************舵机PID变量**********************static unsigned int s_sKp=35; //直道PID的P值static unsigned int s_sKp2=0; //直道PID 的二阶P值static unsigned int s_sKi=0; //直道PID的I值static unsigned int s_sKd=10; //直道PID的D值//****用于防止PID溢出******unsigned short s_sE = 5;unsigned char s_sq = 1;//*************************//****分别存放P I D 值*****int s_sMp = 0;int s_sMi = 0;int s_sMd = 0;int s_sMp2 = 0;//*************************int sL_u[3]; //存放前3次理论速度与实际速度的差值int last_corrd[3][10] ={{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};//****************************************** ***************//*********************PID调试中断**************************unsigned char cp = 0;unsigned char ci = 0;unsigned char cd = 0;unsigned int search_PACN10;unsigned int np = 0;unsigned int sp[500];//****************************************** ****************//*********************存储前20点的数据*********************int L_num[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};int sum_corrd = 0;int wb = 0; //记录当前状态黑为0,白为1;//****************************************** ****************//********************红外滤波*****************************int corrd[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};int T_corrd = 0;int is_white = 0;int numb = 0;//****************************************** ****************//***********************数据统计***************************int corrd_sate[23] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};int SPWM_sate[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};int MPWM_sate[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; uchar corrd_time[512];uchar SPWM_time[512];uchar MPWM_time[512];uchar PACN_time[512];//****************************************** ****************void setbusclock(void){CLKSEL=0X00; //disengage PLL to systemPLLCTL_PLLON=1; //turn on PLL SYNR=1;REFDV=1;//pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;_asm(nop); //BUS CLOCK=16M_asm(nop);while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;CLKSEL_PLLSEL =1; //engage PLL to system;}void Dly_ms(int ms){int ii,jj;if (ms<1) ms=1;for(ii=0;ii<ms;ii++)for(jj=0;jj<2670;jj++);//busclk:16MHz--1ms}static void SCI_Init(void){SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enableSCI0BDH=0x00; //出口波特率为9600SCI0BDL=0x68;//SCI0BDL=busclk/(16*SCI0BDL)//busclk 8MHz, 9600bps,SCI0BDL=0x34//busclk 16MHz, 9600bps,SCI0BDL=0x68//busclk 24MHz, 9600bps,SCI0BDL=0x9C} //busclk 32MHz, 9600bps,SCI0BDL=0xD0static void IOC_Init(void){ PERT = 0XFF;//PPST=0XFF;DDRT=0XFe;PBCTL=0X50;//PT0 PIN,PACN10 16BIT,FALLing edge,NOT INTERRUPT//PACN0=200;//PACN1=0xFF;TCTL4=0x01;//40表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿//TIE =0x00;//每一位对应相应通道中断允许,0表示禁止中断TIOS =0xfe;//每一位对应通道的: 0输入捕捉,1输出比较}unsigned int get_Speed(){int Speed;Speed = PACN10;PACN10 = 0;return Speed;}void s_PID_MPWM(){L_u[2] = L_u[1];L_u[1] = L_u[0];L_u[0] = P_Speed - search_PACN10;Mp = Kp * L_u[0];Mi = Mi + Ki * L_u[0];Md = Kd * (L_u[0] - 2 * L_u[1] + L_u[2]);Mp2 = Kp2 * (L_u[0] - L_u[1]);if(((Ki * L_u[0]) > E)||((Ki * L_u[0]) < -E)) q = 0; else q = 1;MPWM = MPWM + Mp + q * Mi + Md + Mp2;if(MPWM > 1000) MPWM = 1000;if(MPWM < -1000) MPWM = -1000;Set_MPWM(MPWM);}void r_PID_MPWM(){L_u[2] = L_u[1];L_u[1] = L_u[0];L_u[0] = P_Speed - search_PACN10;Mp = rKp * L_u[0];Mi = Mi + rKi * L_u[0];Md = rKd * (L_u[0] - 2 * L_u[1] + L_u[2]);Mp2 = rKp2 * (L_u[0] - L_u[1]);if(((rKi * L_u[0]) > E)||((rKi * L_u[0]) < -E)) q = 0; else q = 1;MPWM = MPWM + Mp + q * Mi + Md + Mp2;if(MPWM > 1000) MPWM = 1000;if(MPWM < -1000) MPWM = -1000;Set_MPWM(MPWM);}//*******************舵机PID控制函数*************************void s_PID_SPWM(){sL_u[2] = sL_u[1];sL_u[1] = sL_u[0];sL_u[0] = ((current_corrd+last_corrd[0][1]) - (last_corrd[0][2]+last_corrd[0][3]))/2;//*********计算PID值***********if(sL_u[0]<20 && sL_u[0]>-20){s_sMp = s_sKp * sL_u[0];s_sMi = s_sMi + s_sKi * sL_u[0];s_sMd = s_sKd * (sL_u[0] - 2 * sL_u[1] + sL_u[2]);s_sMp2 = s_sKp2 * (sL_u[0] - sL_u[1]);//*****************************//***********I项溢出防止*******if(((s_sKi * sL_u[0]) > s_sE)||((s_sKi * sL_u[0]) < -s_sE)) s_sq = 0;else s_sq = 1;//*****************************SPWM = SPWM + s_sMp + s_sq * s_sMi + s_sMd + s_sMp2;//*********PWM溢出防止*********if(SPWM > 70) SPWM = 70;if(SPWM < -70) SPWM = -70;//*****************************}else sL_u[0] = sL_u[1];Set_SPWM(SPWM);}//****************************************** ****************void show_SPWM_data(){for(j = 0; j < 15; j++){printp("%10d", SPWM_sate[j]);}}void show_MPWM_data(){for(j = 0; j < 11; j++){printp("%10d", MPWM_sate[j]);}}void show_corrd_data(){for(j = 0; j < 23; j++){printp("%6d", corrd_sate[j]);}}void show_corrd_time(){for(j = 0; j < 512; j++){printp("%c", corrd_time[j]);}}void show_SPWM_time(){for(j = 0; j < 512; j++){printp("%c", SPWM_time[j]);}}void show_MPWM_time(){for(j = 0; j < 512; j++){printp("%c", MPWM_time[j]);}}void show_PACN_time(){for(j = 0; j < 512; j++){printp("%c", PACN_time[j]);}}void main(void) {/* put your own code here */setbusclock();SCI_Init();AD_Init();IOC_Init();Ini_PWM();EnableInterrupts;for(;;){Dly_ms(10);//*************红外滤波*************************for(j=0; j<10; j++){adc_get(ad_value);for(i = 1; i<12; i++){if(ad_value[i]>=160){data[i] = 1;num = num + 1;}else data[i] = 0;sum = sum + data[i] * 2*i;//printp("%10d", data[i]);}if(num == 0){corrd[j] = -1;}else{corrd[j] = sum/num;}sum = 0;num = 0;}is_white = 0;for(i=0;i<10;i++){if(corrd[i] < 0){is_white++;}for(j=i;j<10;j++){T_corrd = corrd[j];corrd[j] = corrd[i];corrd[i] = T_corrd;}}if(is_white > 6){numb = 0;}sum = 0;j = 0;for(i=3; i<8; i++){if(corrd[i] > -1){sum += corrd[i];j++;}}if(j!=0){current_corrd = sum/j;numb = j;}L_num[9] = L_num[8];L_num[8] = L_num[7];L_num[7] = L_num[6];L_num[6] = L_num[5];L_num[5] = L_num[4];L_num[4] = L_num[3];L_num[3] = L_num[2];L_num[2] = L_num[1];L_num[1] = L_num[0];L_num[0] = numb;//****************************************************wb = L_num[1]|L_num[2]|L_num[3]|L_num[4]|L_num[5]| L_num[6]|L_num[7]|L_num[8]|L_num[9];if(numb == 0){DDRB = 0x80;if(search_PACN10 > 10 && wb>0){P_Speed = 20;if(lw == 0){SPWM = -70;}else{SPWM = 72;}//if(sum_corrd<220&&sum_corrd>-220)Set_MPWM(0);// else// Set_MPWM(700);}else{P_Speed = 20;if(lw == 0){SPWM = -70;}else{SPWM = 72;}Set_MPWM(1000);}//Set_MPWM(0);}else{DDRB = 0x00;// printp("%d ", current_corrd);// if(PTJ & 0x80) Set_MPWM(0);//elseif(wb == 0){Set_MPWM(1000);}else{switch(current_corrd){case 2: SPWM = -70;P_Speed = 32;r_PID_MPWM();lw = 0;break;case 3: SPWM = -60;P_Speed = 32;r_PID_MPWM();lw = 0;break;case 4: SPWM = -50;P_Speed = 32;r_PID_MPWM();lw = 0;break;case 5: SPWM = -40;P_Speed =32;r_PID_MPWM();lw = 0;break;case 6: SPWM = -30;P_Speed = 32;r_PID_MPWM();lw = 0;break;case 7: SPWM = -25;P_Speed = 32;r_PID_MPWM();lw = 0;break;case 8: SPWM = -20;P_Speed = 32;r_PID_MPWM();lw = 0;break;case 9: SPWM = -15;P_Speed = 32;s_PID_MPWM();lw = 0;break;case 10: SPWM = -10; P_Speed = 32;s_PID_MPWM();lw = 0;break;case 11: SPWM = -5; P_Speed = 32;s_PID_MPWM();lw = 0;break;case 12: SPWM = 0; P_Speed = 32;s_PID_MPWM();break;case 13: SPWM = 5; P_Speed = 32;s_PID_MPWM();lw = 1;break;case 14: SPWM = 10; P_Speed = 32;s_PID_MPWM();lw = 1;break;case 15: SPWM = 15; P_Speed = 32;s_PID_MPWM();lw = 1;break;case 16: SPWM = 20; P_Speed = 32;r_PID_MPWM();lw = 1;break;case 17: SPWM = 25; P_Speed = 32;r_PID_MPWM();lw = 1;break;case 18: SPWM = 30; P_Speed = 32;r_PID_MPWM();lw = 1;break;case 19: SPWM = 40; P_Speed = 32;r_PID_MPWM();lw = 1;break;case 20: SPWM = 50; P_Speed = 32;r_PID_MPWM();lw = 1;break;case 21: SPWM = 60; P_Speed = 32;r_PID_MPWM();lw = 1;break;case 22: SPWM = 70; P_Speed = 32;r_PID_MPWM();lw = 1;break;default: break;}//Set_MPWM(500);}}last_corrd[0][3] = last_corrd[0][2];last_corrd[0][2] = last_corrd[0][1];last_corrd[0][1] = last_corrd[0][0];last_corrd[0][0] = current_corrd;corrd_sate[current_corrd]++;SPWM_sate[SPWM/10+7]++;MPWM_sate[MPWM/10]++;corrd_time[t]=current_corrd;SPWM_time[t]=SPWM+70;MPWM_time[t]=(MPWM+1000)/10;s_PID_SPWM();//Set_SPWM(SPWM);//Set_MPWM(500);search_PACN10 = PACN10;//printp("%10d", search_PACN10);PACN_time[t]=search_PACN10;PACN10 = 0;sum_corrd = 0;sum = 0;start_flag = 0;num = 0;t++;if(t==512){MPWM=0;for(;;);}} /* wait forever *//* please make sure that you never leave this function */}void interrupt 20 SCI0RX(void) {byte result,temp;DisableInterrupts;temp=SCI0SR1; /*clear flag*/result=SCI0DRL;if(result=='s'||result=='S') show_SPWM_data();if(result=='M'||result=='m') show_MPWM_data(); if(result=='c'||result=='C') show_corrd_data();if(result=='1'||result=='!') show_corrd_time();if(result=='2'||result=='@') show_SPWM_time();if(result=='3'||result=='#') show_MPWM_time();if(result=='4'||result=='$') show_PACN_time();if(result=='a'||result=='A'){MPWM=0;for(;;)EnableInterrupts;;}EnableInterrupts;}。
飞思卡尔智能车光电组技术报告

飞思卡尔智能车光电组技术报告一、智能车光电组概述智能车光电组是指智能车中的关键性能元件——光电传感器集合体。
它能对车辆运动状态、线路、红绿灯等信息进行感知,实现智能驾驶的基础。
智能车光电组主要包括红外线传感器、光耦传感器、光电限位传感器等。
这些传感器通过感知周围环境中的光电信息,将其转化为电信号,再与控制电路进行通信,完成车辆的控制和判断。
二、红外线传感器红外线传感器是智能车光电组中最常用的传感器之一,其主要作用是对赛道上各种异物或者障碍进行探测,从而实现自主避障。
红外线传感器有两种,一种是红外线避障传感器,主要检测前方是否有障碍物。
另一种是寻迹传感器,主要检测车辆行进轨迹及车轮边界。
这两种传感器都通过发射一束红外线,然后检测红外线反射信号的强弱,来判断当前道路状态。
智能车中多数采用两种红外线传感器的组合,一个用于永久性突出物体的检测和避障功能,一个用于寻迹,检测当前赛道行驶的状态。
这种组合方案在实际使用中既能够减小了智能车的体积,同时也能够同时满足避障和寻迹两种功能的需求。
三、光耦传感器光耦传感器主要是测量霍尔电压,电容电压,电阻电压等物理量,全局范围内掌握智能车行驶的状态,构成智能车控制系统的重要部分。
通过对各种物理量的感应,对智能车进行动态实时控制。
如针对车速问题,可以采用霍尔电压测量方法,对车辆运动状态进行简单的判断。
智能车中采用光电传感器和电路配合的方法,还可以实现车辆行驶过程中的速度随时控制和加速度调整。
四、光电限位传感器光电限位传感器是一种可以控制智能车极限运动状态的传感器。
传感器通过实时控制智能车运动状态,避免车辆因超出极限而出现事故。
光电限位传感器一般分为三种,分别是机械限位传感器、磁性限位传感器和光电限位传感器。
传感器固定在车架上,在车辆行驶过程中限定车辆的行驶限度,从而确保车辆的安全性。
五、结论智能车光电传感器组是智能车控制系统中的重要组成部分。
它通过对周围环境的感知和探测来确保车辆的安全和自主导航。
飞思卡尔智能车光电资料

飞思卡尔智能车光电资料概述飞思卡尔智能车(Smart car)系列是一款基于飞思卡尔公司的光电传感技术的自动驾驶小车。
光电传感技术是利用光电元件将感受到的光信号转化为电信号,并通过处理电信号得到有用的信息。
飞思卡尔智能车光电资料提供了有关自动驾驶小车的光电传感器的详细信息,包括工作原理、技术规格和应用案例等。
工作原理飞思卡尔智能车光电传感器是通过感受周围的光线来实现环境感知和障碍物检测的。
光电传感器通常由发射器和接收器两部分组成,发射器将红外线或其他光束发射出去,接收器则接收到从目标物体反射回来的光线。
通过测量发射光束和接收光束之间的差异,可以判断目标物体的位置、形状和距离等。
光电传感器可以分为两种类型:距离传感器和线路传感器。
距离传感器主要用于测量目标物体与车辆之间的距离,常用于自动驾驶小车的防碰撞系统。
线路传感器主要用于检测车辆行驶的路径,常用于自动驾驶小车的导航系统。
技术规格飞思卡尔智能车光电传感器具有以下技术规格:•工作电压:3.3V•工作电流:10mA•输出信号:数字信号•工作距离:10cm - 100cm•发射角度:60度•接收灵敏度:高于5000Lux应用案例飞思卡尔智能车光电传感器广泛应用于自动驾驶小车的各个方面,包括但不限于以下应用案例:防碰撞系统飞思卡尔智能车光电传感器可以配备在车辆的前部,用于检测前方是否有障碍物。
当传感器检测到前方有障碍物时,会向控制系统发出警告信号,控制系统则会采取相应措施,如减速或避让,以防止碰撞事故的发生。
导航系统飞思卡尔智能车光电传感器可以配备在车辆的底部,用于检测车辆行驶路径。
传感器将红外线发射到地面上的线路上,通过接收反射回来的光线来确定车辆的行驶方向和位置。
导航系统可以根据传感器的信号来控制车辆的行驶轨迹,以实现自动驾驶。
环境感知系统飞思卡尔智能车光电传感器可以配备在车辆的四周,用于感知周围的环境。
传感器可以检测到周围物体的位置、形状和距离等信息,以帮助车辆做出相应的决策,如避让行人或停车等。
飞思卡尔智能车起跑线的识别

飞思卡尔智能车起跑线的识别前天东北赛区要举行个联谊会,所里的老师就让我们在联谊会的时候给大家演示一个识别起跑线的简单示范!虽然对于别人来说这不成什么问题,可是这对于刚接触小车,刚接触飞思卡尔片子的我来说就不得不成为一个问题了,幸亏有我们组的大黄牛在,才使我们识别起跑线的示范得以成功演示!真庆幸有我们组长这个大黄牛在。
识别起跑线关键在于设计一个好的算法能够准确、稳定的描述起跑线的特征,特别是和十字交叉线的区别,二者的区别就在于一个是连续的黑线,前者的直道两侧有两段黑色横线,并且两段横线和直道之间有一段特殊规格的白色区域;而后者是连续的白色横线和直道交叉。
这样就可以通过判断整场数据中符合前面特征的就为起跑线。
由于摄像头的物理特性,我们只采取是在近端出现并且有连续多行出现此特征的才为起跑线。
并且在连续识别起跑线第三次的时候使小车能够停下来。
由于看到小车的时候是在还没有到起跑线的时间,所以在判断为第三次看到起跑线的时候我们这时候并没有立即使小车停下来,而是设置一个延时,使小车能够在越过起跑线之后再停下来!这样子保证了没有延长小车行时间。
飞思卡尔智能车制作全过程(本人在很久以前做的一辆用来比赛的智能车--获得华北一等奖,全国二等奖,有许多可改进地方.)下面我们来立即开始我们的智能车之旅:首先,一个系统中,传感器至关重要."不管你的CPU的速度如何的快,通信机制如何的优越,系统的精度永远无法超越传感器的精度" .是的,在这个系统中,传感器的精度,其准确性就显得至关重要.如果你问我传感器的电路,呵呵,我早就和大家分享了,在我发表的日志中,有一篇<<基于反射式距离传感器>>的文章就详细的说明了传感器的硬件电路以及可以采取的信号采样方式.传感器安装成一排,如上面排列.(就是个一字排列,没有什么特别)接下来,看看我们如何处理传感器得到的信息:大家看到了.结构很简单,我们已经搞定了传感器通路.下面我们来看看多机的控制方面的问题:其实,不管是便宜还是比较贵的舵机,都是一样的用法.舵机的特点就是不同的占空比方波就对应着舵机的不同转角.当然不同的舵机有不同的频率要求.比如我用的这个舵机:方波频率50HZ.怎么改变占空比?这个不就是PWM模块的功能嘛.PWM模块可以输出任意占空比的方波.只要你控制其中的占空比寄存器,就可以直接控制舵机的转角.你只要将传感器的状态和这个占空比对应上,不就OK了?就这么简单,做到这里,你就可以让你的车在跑道上跑了!接下来,我们的工作是让智能车更加完善:速度要稳定.在当前的系统结构中,要使一个系统更稳定更可靠,闭环系统是一个选择.(如果你不知道什么是闭环系统,可以参照我的文章里面的一篇"基于单片机的PID电机调速"),既然是一个闭环系统,速度传感器是必不可少的,用什么样的传感器做为速度反馈呢:仔细看,和后轮之间有一条皮带的这个貌似电机的东西,就是我的速度传感器,它的学名叫"旋转编码器".这个器件的特点就是:每转一圈,就会从输出端输出一定的脉冲,比如我这个旋转编码器是500线的,就是转一圈输出500个脉冲.因此,我只要在单位时间内计数输出端输出的脉冲数,我就可以计算出车辆的速度.显然,这个速度可以用来作为PID速度调节的反馈.现在有了反馈,我们需要的是调节智能车驱动电机的速度了,如何来调速,就成了必须解决的问题了.我用的是驱动芯片MC33886.其实,这个芯片就是一个功率放大的模块.我们知道,单片机输出的PWM信号还是TTL信号,是不能直接用来驱动电机的.非要通过功率模块的放大不可.这个道理其实很简单,就像上次我给大家画的哪个电子琴电路的放大电路一样:看上面的那个三极管,就是将TTL电路的电流放大,才能够来驱动蜂鸣器.其实这里的这个MC33886就是这样的一个作用.而且我们自己也完全可以用三极管自己搭建一个这样的功率放大电路,当然,驱动能力肯定不如这里的这个MC33886(如我们用三极管就搭建了超过MC33886的电路,摩托罗拉就不会卖几十块钱一个了.呵呵.)知道了这个MC33886的工作原理,就好说了,一句话,通过PWM来调节电机的速度.当方波中高电平占的比例大,电机的平均电压肯定高,转速肯定快.也就是说,PWM的占空比越大,电机转速越高.看,就这么简单,这个智能车就做好了.接下来,我们就把我们知道的PID知识放到舵机和直流驱动电机的控制中去.就可以达到一个比较好的控制效果.如果要达到更高的水平,肯定机械方面的改造也少不了.当然,这不属于本文的讨论范围.呵呵.飞思卡尔智能车制作全过程---舵机篇智能车的制作中,看经验来说,舵机的控制是个关键.相比驱动电机的调速,舵机的控制对于智能车的整体速度来说要重要的多.PID算法是个经典的算法,一定要将舵机的PID调好,这样来说即使不进行驱动电机的调速(匀速),也能跑出一个很好的成绩.机械方面:从我们的测试上来看,舵机的力矩比较大,完全足以驱动前轮的转向.因此舵机的相应速度就成了关键.怎么增加舵机的响应速度呢?更改舵机的电路?不行,组委会不允许.一个非常有效的办法是更改舵机连接件的长度.我们来看看示意图:从上图我们能看到,当舵机转动时,左右轮子就发生偏转.很明显,连接件长度增加,就会使舵机转动更小的转角而达到同样的效果.舵机的特点是转动一定的角度需要一定的时间.不如说(只是比喻,没有数据),舵机转动10度需要2ms,那么要使轮子转动同样的角度,增长连接件后就只需要转动5度,那么时间是1ms,就能反应更快了.据经验,这个舵机的连接件还有必要修改.大约增长0.5倍~2倍.在今年中,有人使用了两个舵机分别控制两个轮子.想法很好.但今年不允许使用了.接下来就是软件上面的问题了.这里的软件问题不单单是软件上的问题,因为我们要牵涉到传感器的布局问题.其实,没有人说自己的传感器布局是最好的,但是肯定有最适合你的算法的.比如说,常规的传感器布局是如下图:这里好像说到了传感器,我们只是略微的一提.上图只是个示意图,意思就是在中心的地方传感器比较的密集,在两边的地方传感器比较的稀疏.这样做是有好处的,大家看车辆在行驶到转弯处的情况:相信看到这里,大家应该是一目了然了,在转弯的时候,车是偏离跑道的,所以两边比较稀疏还是比较科学的,关于这个,我们将在传感器中在仔细讨论。
“飞思卡尔”智能车辅助设备的设计与实现

毕业设计说明书(论文)中文摘要“飞思卡尔”智能车在后期调试过程中,需要不断的更改程序中的速度和舵机偏转的角度,其工作量很大,也极其繁琐,浪费了大量的时间。
比赛时,由于比赛场景,赛道尺寸,难易度等因素都是未知,同时规则要求比赛前不能更改智能车中的程序。
因此,为了后期调试过程中提高效率,比赛时能及时更改比赛策略,将在智能车上安装辅助设备。
本文为解决人机交互问题采用液晶显示模块显示智能车信息,拨码开关和键盘调整程序参数和选择策略,无线监测模块和上位机检测软件对车实时运行时的数据进行监测和存储等手段。
经过研究与分析,并进行了比较,最终选定nokia5110 LCD液晶显示模块,拨码快关与键盘,无线模块与上位机软件作为智能车的辅助设备,设计了接口电路,编写了程序。
通过比赛,智能车的辅助设备得到了很好地利用,不仅为调试节约了大量时间,而且及时修改比赛策略,大大提高了比赛成绩。
关键词:飞思卡尔;液晶;键盘;拨码开关;无线—I—毕业设计说明书(论文)外文摘要Title Freescale Intelligent Vehicle AuxiliaryEquipment Design And ImplementationAbstractFreescale Smart Car in the post-commissioning process, the need to constantly change the program's speed and steering gear deflection angle, their workload, but also extremely cumbersome, wasting a lot of time. The game, due to the competition scene, the track size, degree of difficulty and other factors are unknown, the rule requires that before the game can not change the procedures in the smart car. Therefore, in order to improve efficiency in the post-commissioning process, the game in a timely manner to change the game strategy and auxiliary equipment will be installed in the smart car.LCD module to display the smart car information to solve the problem of human-computer interaction, the DIP switch and keyboard to adjust the program parameters and selection strategies, wireless monitoring module and the host computer detection software on the vehicle run-time data monitoring and storage means. Research and analysis, and compared with the final selection of nokia5110 LCD LCD module DIP fast off the keyboard, wireless module and the host computer software as the auxiliary equipment of the smart car, the design of the interface circuit, write a program.Through the game, the auxiliary equipment of the smart car to good use, saving a lot of time not only for debugging, and in a timely manner to modify the game strategy, greatly improving the competition results. Keywords: Freescale;LCD ;Keyboard ;DIP switch;Wireless目录目录毕业设计说明书(论文)中文摘要 (I)毕业设计说明书(论文)外文摘要 (II)第一章绪论 (1)1.1飞思卡尔简介 (1)1.2飞思卡尔智能车竞赛国内外现状 (1)1.2.1飞思卡尔智能车竞赛国外现状 (1)1.2.2 国内智能车竞赛现状 (2)1.3飞思卡尔智能车辅助设备研究的背景及意义 (4)第二章飞思卡尔智能车系统分析 (6)2.1光电组智能车系统分析 (6)2.2摄像头组智能车系统分析 (7)2.3电磁组智能车系统分析 (8)2.4三组智能车总体分析 (9)第三章飞思卡尔智能车辅助设备的设计 (10)3.1显示模块 (10)3.1.1液晶模块简述 (10)3.1.2液晶模块主要参数 (10)3.1.3飞思卡尔智能车显示模块的比较与选择 (11)3.1.4 飞思卡尔智能车显示模块的使用 (12)3.2输入设备 (14)3.2.1矩阵键盘与拨码开关简述 (14)3.2.2矩阵键盘与拨码开关的结构与工作原理 (14)3.2.4飞思卡尔智能车输入设备的使用 (16)3.3在线监测设备 (18)3.3.1在线监测设备简述 (18)3.3.2在线监测设备种类种类 (20)3.3.3飞思卡尔智能车在线监测设备的比较与选择 (21)3.3.4 飞思卡尔智能车在线监测设备的使用 (22)第四章飞思卡尔智能车辅助设备在线调试 (24)4.1飞思卡尔智能车显示模块在线调试 (24)4.2飞思卡尔智能车在线监测模块在线调试 (24)—III—东北电力大学信息工程学院毕业论文结论 (26)参考文献 (27)致谢 (28)附录 (29)绪论第一章绪论1.1飞思卡尔简介飞思卡尔(Freescale Semiconductor)是全球领先的半导体公司,为规模庞大、增长迅速的市场提供嵌入式处理产品和连接产品。
飞思卡尔光电组

传感器硬件原理图
传感器元器件清单
? 发光二极管 × 8
发光二极管(贴片封装0805) × 8
? 接收管 × 8
调制管 × 4
? 三极管8050 × 4
电位器500Ω(滑动变阻器) × 8
? 电容0.1μF(贴片封装0603) × 8
? 电阻22Ω(贴片封装0805) × 16
? 电阻1.5kΩ(贴片封装0805) × 8
00110000000000
黑线相当偏左 01000000000000
没有黑线(盲区) 00000000000000
传感器在起点与十字路口
? 如何分辨是 后期重点
2、路径识别算法
? 传感器相关初始化
? void PORT_Init(void)
?{
? DDRA = 0x00;
//端口A方向输入
? PUCR_PUPAE = 1; //端口A信号上拉
按传感器输出信号不同,检测方法 分两种:数字量输出(调制,以我们学 校为代表)和模拟量输出(A/D,以清 华为代表)。
二、光电车硬件
元器件标号基本知识: R电阻标号识别
C电容标号识别
←无k是标号
有k就是阻值 →
光电传感器:发射电路
调制是为了将连续光变成频率约180kHz的光脉冲
注意:⒈我们使用的接收管只能接收调制光,因此发射管必须经过调制电 路发射调制光,否则接收管无法接收光信号;
? PORTA = 0x00; //端口A初值为0
}
寄存器按位赋值举例PUCR_PUPAE = 1; (PUCR |= 0x01;)
? 传感器状态采集:
? void Sensor_collect(void) //采集传感器状态
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
飞思卡尔智能车模起跑线识别方法的设计与实现
设计思想及算法实现
车模与赛道的参数如图1所示。
车模运行的主要形式主要是车模的规定的赛道内行进,赛道中央有一条25mm宽的黑色引导线。
常用的车模巡线方案有光电传感器阵列和CCD探测法等,这里介绍光电传感器阵列的设计方案。
光电传感器是靠红外发射管和红外接收管组成的传感器,如图2所示。
红外发射管发射的红外线具有一定的方向性,当红外线照射到白色表面上时会有较大的反射,如果距离Dl取值合适,红外接收管可接收到反射回的红外线,再利用红外接收管的电气特性,在电路中处理红外线的接收信息;如果反射表面为黑色,红外光会被表面将其大部分吸收,红外接收管就难以收到红外线。
这样,就可以利用红外收发管组成的光电传感器检测赛道黑线,实现智能车的巡线方案。
光电传感器阵列布局参数的确定
如图3所示,光电传感器阵列参数主要有管距D(管内侧距离),管直径d,影响光电传感器阵列参数的主要因素有:
●起跑标志线和十字交叉线;
●比赛规则对车模尺寸的限制;
●跑道黑色引导线的宽度;
●舵机转弯精度。
根据以上影响因素,建立模型如图3和图4所示。
起跑标志线和十字交叉线的识别方案要和光电传感器阵列参数联系起来考虑,所以首先根据起跑标志线的基本识别方法来确定光电传感器阵列参数。
单片机在处理起跑标志线和十字交叉线的区别时,较方便的方法就是当光电传感器阵列经过十字交叉线时7个传感器全检测到黑线,而经过起跑标志线时会有个别传感器检测到白色赛道表面。
根据这个道理,建立模型如图3和图4所示,分两种情况讨论:
1) 光电传感器阵列有2个传感器检测到白色跑道而其它传感器检测到黑线时,如图3所示;
2) 光电传感器阵列有1个传感器检测到白色跑道而其它传感器检测到黑线时,如图4所示。
根据以上两种情形,在光电传感器阵列采用等距分布的情况下,可有如(1)式所示的数学描述。
(1)
(2)
(3)
根据(3)式,做如图5所示的数轴标注方法来表示不等式的取值范围。
图5中计算所得的D值范围为(25, 30-1.5d)。
但是也要考虑特殊情况。
由于车身在经过起跑标志线时并不是每次都能保持和跑道引导线平行,所以要考虑当车身偏斜进入起跑线时的情况会不会使(1)式有所变化。
如图5所示。
考虑偏斜的角度如图6所示,车身偏斜时在起跑线白色间隙的长度f=19mm,这样(1)式的数学描述中发生变化的仅仅是图4所示中的跑道间隙值17.5mm,该值被f代替。
带入新值后用数轴标注法标注D值的区间如图7所示。
比较图6发现,A点向B点靠近形成A′点,并没有超过B 点;C点和D点分别移动到C′点和D′点位置,所以D的取值范围有扩大的趋势,这样,图5标注的D值范围符合要求。
如果偏斜角度继续增大,前排光电传感器阵列不能同时进入起始标志线,这样在单片机编程算法中很容易处理这种情况。
综合以上讨论,可知:
光电传感器的管距(管内侧距离)D取值范围为(25, 30-1.5d);
根据误差理论,单纯从传感器的外径尺寸上考虑,其值d越小越好;
本设计中取光电管直径d值为3mm,D值范围(25mm,25.5mm)。
实测效果
根据以上分析的光电传感器的管距D取值范围制作车模的寻线传感器阵列,对车模进行了大于50次的测试,实测结果表明:车模均能正确识别到起跑线。
但是,设计还存在一些问题,主要有:
*对D的取值要求苛刻;
*要求红外传感器的正常工作率为90%以上。
结语
本文分析了智能车模比赛中的相关技术参数,建立了光电传感器阵列的数学模型,确定了阵列参数。
这为车模系统的路况记忆算法提供了基本参考点。
本文还分析了起跑线识别方法的实测效果,实测结果表明:车模均能正确识别到起跑线。
(因版面有限,本文已作部分删节)。