人人范文网 范文大全

实习报告——智能车设计

发布时间:2020-03-03 08:51:19 来源:范文大全 收藏本文 下载本文 手机版

工业项目设计与制作报告

——基于电磁传感器的智能车设计

姓名:王香伟 学号:102673 专业:自动化

基于电磁传感器的智能车设计

——工业设计报告

(102673 王香伟自动化)

智能车以自主寻线、高速行驶为目的,以嵌入式系统为支撑,以PID控制算法和汽车结构知识为核心,以信号与系统、电力电子、电机拖动、传感器等为基础,是一项综合的设计。全车设计我认为可分为四大部分:检测信号采集,控制算法,驱动及车体结构设计,辅助部分。一下我将一一介绍:

一、检测信号采集:

a.将交变磁场采集成电路中的交流电压

我们电磁组,检测的是赛道中线导线中100mA,20KHz的交流电所产生的交变磁场。利用交变电磁场在电感线圈中产生交变电压的原理,辅以LRC滤波来检测电磁信号。所用电感L=10mH,电容C=6.8nF,二者串联谐振频率为20KHz,可滤掉所感应到的其它频率的电磁信号。

b.将交流电压放大并整流成直流电压

我们采用运放AD823将所获得的的信号电压放大,并通过二极管和电容不可控整流电路将放大后的交流电压转换为直流电压。

c.将直流电压通过单片机AD口输入。

五个电感的电磁信号分别连到单片机的五个不同的AD口上,单片机利用一个AD转换器的多路开关的功能将他们一一转换为数字量,这一过程在软件中时这样实现的。通过定时器中断0.5ms触发一次AD中断,通过AD中断读取AD采样值。相应代码如下:

#define PIT1_TIME

500 //0.5ms MK60_PITS_INITIALIZE_(MK60_PIT_CH1,SystemCoreClock,PIT1_TIME);设置定时器中断为0.5ms触发一次

MK60_PITS_Enables_IRQ(MK60_PIT_CH1);打开定时器中断

} 在定时器中断的响应函数中打开AD中断并将多路开关选择em0通道。 void PIT1_IRQHandler(void)

{

PIT->CHANNEL[1].TCTRL &= ~PIT_TCTRL_TIE_MASK;

PIT->CHANNEL[1].TFLG |= PIT_TFLG_TIF_MASK;

PIT->CHANNEL[1].TCTRL |= (PIT_TCTRL_TIE_MASK | PIT_TCTRL_TEN_MASK);

ADC1->SC1[0] = (ADC1->SC1[0] & (~ADC_SC1_ADCH_MASK)) + ADC1_EM0; } 然后再在ad中断的响应函数中,将AD寄存器的值读到程序中,赋给程序中对应的数组变量。

void ADC1_IRQHandler(void) {

static uint32_t adc_cnt = 0;

ADC1->SC1[0] = (ADC1->SC1[0] & (~ADC_SC1_ADCH_MASK)) + ADC1_EM0; switch (adc_cnt)

{

case 0:

{

adc1_head++;

}

} if(adc1_head >= 10)

adc1_head = 0; em_adc[0][adc1_head] = ADC1->R[0]; ADC1->SC1[0] = (ADC1->SC1[0] & (~ADC_SC1_ADCH_MASK)) + ADC1_EM1; adc_cnt = 1; break; } case 1: { em_adc[1][adc1_head] = ADC1->R[0]; ADC1->SC1[0] = (ADC1->SC1[0] & (~ADC_SC1_ADCH_MASK)) + ADC1_EM2; adc_cnt = 2; break; } case 2: { em_adc[2][adc1_head] = ADC1->R[0]; ADC1->SC1[0] = (ADC1->SC1[0] & (~ADC_SC1_ADCH_MASK)) + ADC1_EM3; adc_cnt = 3; break; } case 3: { em_adc[3][adc1_head] = ADC1->R[0]; ADC1->SC1[0] = (ADC1->SC1[0] & (~ADC_SC1_ADCH_MASK)) + ADC1_EM4; adc_cnt = 4; break; } case 4: { em_adc[4][adc1_head] = ADC1->R[0]; ADC1->SC1[0] = (ADC1->SC1[0] & (~ADC_SC1_ADCH_MASK)) + ADC_DISABLE; adc_cnt = 0; break; } 每个传感器值都在不同的时间读了十次,一共五个传感器,组成了一个5X10的数组。 之后再通过滤波(将每个传感器的值加权平均得到一个之后可用于计算的值)

如果五个电感的最大值不一样,可以将他们的最大值标准化到10000 void em_adc_filter(void) { volatile int i_pos = 0; int32_t fir_i,fir_head; float em_adc_sum[5] = {0,0,0,0,0}; float fir[em_adc_size] = {0.4,0.1,0.1,0.1,0.1,0.1,0.05,0.05,0.0,0.0}; for(i_pos = 0;i_pos

{

for(fir_i = 0;fir_i

{

fir_head = adc1_headrow) + D_DIRECTION * row_sub + I_DIRECTION)) + steer_midd_adjust ; 此句代码即为方向控制的PID算法,其中

P_DIRECTION为比例系数、D_DIRECTION为微分系数、并未添加积分控制,比例系数和微分系数是根据车在赛道位置时刻变化的,如何变化正是我们后期调试的重点,大体思路为,小车在赛道中线附近时控制系数较小,距离中线较远时,控制。

float get_kp(int po_er) { float kp_l;

if(po_er

{

kp_l=p_5;

D_DIRECTION_RATIO=d_small;

}

else if(po_er

{

kp_l=p_5+0.002*(po_er-500)*(p_10-p_5);

D_DIRECTION_RATIO=d_small;

}

} else if(po_er

}

else if(po_er

{ kp_l=p_25+0.002*(po_er-2500)*(p_30-p_25); D_DIRECTION_RATIO=d_big;

}

else

{ kp_l=p_30;

} return kp_l; 当电磁传感器检测到的信号过小时,我们就认为这组数据无效,并认为此时小车偏离中线较远,将舵机逐渐打到最大。 速度控制中,我们根据舵机打角的绝对量和和连续二十次舵机打角的方差来进行速度控制。

速度控制的思路为:入弯减速,弯道加速出弯再加速,直道或者曲率很小的弯拼命加速。 控制方法为:若舵机打角方差较小,则认为小车处于直道或者弯道而不是入弯状态,这个时候速度有舵机打角的绝对值来控制。

若方差很大:则说明小车正在入弯,若此时速度很快则需要进行减速。

if(steer_gyh_fangcha-50)

//

{ if(pwm_steer_gyh_abs

if(zd_flag>10)

{

speed_set_l=s_z1;

zd_flag=21;

}

} else if(pwm_steer_gyh_abs

zd2_flag++ ;

zd_flag=0;

if(zd2_flag>10)

{

speed_set_l=s_z1-0.0025*pwm_steer_gyh_abs*(s_z1-s_z2);

zd2_flag=21;

} } else {

speed_set_l=s_w1-0.001667*(pwm_steer_gyh_abs-400)*(s_w1-s_w2);

speed_set_l+=get_speed_change();

zd_flag=0;

zd2_flag=0;

} } else if(steer_gyh_fangcha>50)

{

speed_set_l=s_s1-0.001*pwm_steer_gyh_abs*(s_s1-s_s2); zd2_flag=0 ; zd_flag=0; } else { speed_set_l=s_w1; } 控制函数写在另外一个定时器中断中,每5ms触发一次。

三、驱动及车体结构

电机和舵机均采用PWM控制,其中舵机直接连接到单片机中的一个PWM信号输出,而电机则采用通过两路PWM信号控制由两片BTN组成组成的全桥电路来驱动电机

其中电机PWM频率为1500Hz,舵机PWM频率为50Hz,舵机的低频率导致舵机控制会有20ms的延时,这会是5ms的控制周期有些力不从心。

小车采取前轮转向,后轮驱动,车体设计以质量轻,转动惯量小,重心底为原则。

汽车的转向车轮、转向节和前轴三者之间的安装具有一定的相对位置,这种具有一定相对位置的安装叫做转向车轮定位,也称前轮定位。前轮定位包括主销后倾(角)、主销内倾(角)、前轮外倾(角)和前轮前束四个内容。这是对两个转向前轮而言,对两个后轮来说也同样存在与后轴之间安装的相对位置,称后轮定位。后轮定位包括车轮外倾(角)和逐个后轮前束。这样前轮定位和后轮定位总起来说叫四轮定位。 a.主销后倾角(caster)的调整

图2.2 主销后倾角

从侧面看车轮,转向主销(车轮转向时的旋转中心)向后倾倒,称为主销后倾角。设置主销后倾角后,主销中心线的接地点与车轮中心的地面投影点之间产生距离(称做主销纵倾移距,与自行车的前轮叉梁向后倾斜的原理相同),使车轮的接地点位于转向主销延长线的后端,车轮就靠行驶中的滚动阻力被向后拉,使车轮的方向自然朝向行驶方向。设定很大的主销后倾角可提高直线行驶性能,同时主销纵倾移距也增大。主销纵倾移距过大,会使转向盘沉重,而且由于路面干扰而加剧车轮的前后颠簸,在调节的时候我们将小车前后垫片(初始为2:2)调整为1:3,即前一后三,使其倾角为负。这样可以减少回力矩的作用,使转向更为灵活。

b.前轮外倾角(camber)的调整

图2.3 前轮外倾角

从前后方向看车轮时,轮胎并非垂直安装,而是稍微倾倒呈现“八”字形张开,称为负外倾,而朝反方向张开时称正外倾。使用斜线轮胎的鼎盛时期,由于使轮胎倾斜触地便于方向盘的操作,所以外倾角设得比较大。如果车轮垂直地面一旦满载就易产生变形,可能引起车轮上部向内倾侧,导致车轮联接件损坏。所以事先将车轮校偏一个外八字角度,这个角度约在 1°左右。 c.前轮前束

图2.4 前轮前束

脚尖向内,所谓“内八字脚”的意思,指的是左右前轮分别向内。采用这种结构目的是修正上述前轮外倾角引起的车轮向外侧转动。如前所述,由于有外倾,转向变得容易。另一方面,由于车轮倾斜,左右前轮分别向外侧转动,为了修正这个问题,如果左右两轮带有向内的角度,则正负为零,左右两轮可保持直线行进,减少轮胎磨损,在调试中,我们发现将这个角调整为1度左右,配合主销后倾,可让小车既能转向灵活,又能获得直线良好的沿线能力。

附上小车图片一张

四、辅助部分

主要的辅助部分由按键OLED模块和蓝牙上位机模块 a.按键OLED主要用于参数修改,测量,标定等

大体上,我们采用6个按键来控制OLED,一个用于打开或关闭OLED,一个用于翻页,另外一个用于上下左右4个方向移动光标。通过OLED修改参数的方法是:先将需要修改的参数显示到OLED上;然后通过按键和编码器修改显示在OLED上的参数的值;最后再将修改后的值赋给参数对应的变量。

在具体实现上,我们需要做到以下三点:1.可以扫描到按键按下;2.可以将变量显示到OLED上;3.可以修改OLED上显示的数字;4.可以将OLED上显示的数字赋值给变量。 1.扫描按键:

硬件上:将按键、电阻和电源串联的电路中合适的点连接到GPIO上,使按键按下与否可在相应的GPIO端口产生高低电平。

软件上:先初始化与按键相连的GPIO端口,配置成合适的输入输出模式。然后调用MK60_PORT_GPIO_READ(PORTA,key_pin[x])函数来读取对应GPIO端口的高低电平。 2.显示变量:

硬件上:将OLED按照接口规范与单片机连好。

软件上:1.先将需要显示的变量乘上合适的倍数转化为整数;2.在把整数每一位按照顺序存储到一个数组中;3.把存储数据的数组中的每个元素加上’0’便于显示,然后把对应的参数名接到这个数组的后面;4.调用OLED中提供的显示字符的函数将这个数组显示出来。 3.修改变量:

硬件上:将编码器接好。 软件上:按下上下左右按键时可以选择所要修改的位置,转动后轮带动编码器计数来修改对应的值,修改的是存储数据的数组 4.变量重新复制:

将存储数据的数组中的数按位加权求和赋值给变量。

至此,我们实现了按键OLED的基本功能,实现参数的显示和修改。此外我们还实现了利用按键来实现传感器最大值的标定和速度档位的控制,实现方式很简单,就是先读取按键的值,然后见机行事。同时我们利用 MK60_FTFL_FLASH_WriteRecords()和MK60_FTFL_FLASH_ReadsRecords();函数将参数存储于dataFlash中,便于使用。

b.蓝牙上位机模块主要用于信号的动态观测。

我们利用蓝牙和串口将程序中需要观测的变量发送到上位机,上位机中绘制出折线图,便于观察。 。

五、总结

和一切智能系统一样,智能车的智能体现在在反馈信息,对环境的识别和处理。我们采用电磁传感器进行路径识别,实用性不广,很难应用与真实环境。所以我们有两方面可以为之努力:一是考虑电磁环境的可行性,二是改用其他传感器。二者留给日后研究。

智能车摄像头组技术报告

智能仪器实习报告

智能小车实习报告

智能车竞赛感想

上届智能车主持稿

智能车志愿者心得体会

智能车编程总结

智能车志愿者心得体会

智能台灯设计报告

智能小车设计报告

实习报告——智能车设计
《实习报告——智能车设计.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档