第一篇:实习报告——智能车设计
工业项目设计与制作报告
——基于电磁传感器的智能车设计
姓名:王香伟 学号: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 < 5;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<500) { kp_l=p_5; D_DIRECTION_RATIO=d_small; } else if(po_er<1000) { kp_l=p_5+0.002*(po_er-500)*(p_10-p_5); D_DIRECTION_RATIO=d_small; } } else if(po_er<1500){ kp_l=p_10+0.002*(po_er-1000)*(p_15-p_10);D_DIRECTION_RATIO=d_small;} else if(po_er<2000){ kp_l=p_15+0.002*(po_er-1500)*(p_20-p_15);D_DIRECTION_RATIO=d_small;} else if(po_er<2500){ kp_l=p_20+0.002*(po_er-2000)*(p_25-p_20);D_DIRECTION_RATIO=d_big; } else if(po_er<3000) { 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&&steer_gyh_fangcha>-50) // { if(pwm_steer_gyh_abs<200){ zd_flag++;zd2_flag++; if(zd_flag>10) { speed_set_l=s_z1; zd_flag=21; } } else if(pwm_steer_gyh_abs<400){ 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.蓝牙上位机模块主要用于信号的动态观测。 我们利用蓝牙和串口将程序中需要观测的变量发送到上位机,上位机中绘制出折线图,便于观察。 五、总结 和一切智能系统一样,智能车的智能体现在在反馈信息,对环境的识别和处理。我们采用电磁传感器进行路径识别,实用性不广,很难应用与真实环境。所以我们有两方面可以为之努力:一是考虑电磁环境的可行性,二是改用其他传感器。二者留给日后研究。 目录 一.学分认定书 …… …………………………………………XX 二.实验报告 …… ………………………………………………XX 三.智能车制作研究报告 ……………………………………… XX 四.心得体会 ………………………………………………… XX 五.附录:程序源代码………………………………………… … XX (要求:给出一级目录,宋体加粗,四号字,1.5倍行距。) 一.学分认定书(每个队员1份)二.实验报告 实验一.通用输入输出口和定时中断 一、实验目的 1.掌握 MC9S12XS128 汇编语言对通用端口的操作指令。2.掌握程序中指令循环和跳转的方法。 3.学会使用程序延时,并会大概估算延迟时间。 二、实验任务 1.将 PORTA 口接八位DIP 开关,PORTB口接七段数码管显示,PORTK控制四个数码管其中某一个显示。 2.采用定时中断方式,利用八位DIP 开关输入二进制数,数码管显示其十进制数。 三、实验内容 实验中每个通用输入输出端口要用到的寄存器都有两个,端口定义寄存器和端口方向寄存器。以 A 端口为例,端口定义寄存器为PORTA和端口方向寄存器为DDRA。在MC9S12XS128的DATASHEET 上可以查到DDRA的地址是0x00(输入), DDRB的地址是0xFF(输出), DDRK的地址是0xFF(输出)。则初始化端口PORTA、PORTB、PORTK的语句为: void initGPIO(void){ DDRA = 0x00;DDRB = 0xFF;DDRK= 0xFF;} 置0 表示该位为接受输入位,置1 表示该位为输出位。 MC9S12DP256/DG128 中可以使用实时时钟或增强型定时器来完成定时功能,二者是相互独立的。本实验中用实时时钟定时。实时时钟的可以通过对外部晶振分频而得到一个定时中断。RTICTL 是实时时钟控制寄存器,向该寄存器写入内容,通过查表会得到一个分频因子,外部晶振除以分频因子就是中断的频率了。因为外部晶振频率是16MHz,要得到1ms中断一次,需要16000分频。在MC9S12XS128的DATASHEET 上可以查到RTICTL设置为0x8F, 中断允许寄存器CRGINT设置为0x80(开中断)。则初始化中断程序为: void InitRTI(void){ RTICTL = 0x8F;CRGINT = 0x80;} 一但进入中断,即开始读PORTA口的二进制数,并转换为十进制,通过PORTB口显示出来。由于是数码管动态显示,PORTK口控制四个数码管轮流显示。具体程序见开发板例程中——SevenSegmentDigitalTube。 四、思考题 1.如果不用PORTA口做输入,直接让单片机内部从0—9999自动计数,并在PORTB口显示出计数过程,PORTK口控制四个数码管轮流显示,程序该如何改? 对程序的修改如下: void interrupt 7 RTI_INT(void){ time++;if(time >=50){ 2 time=0;Count_Num++;LedData[0] = Count_Num/1000%10;LedData[1] = Count_Num/100%10;LedData[2] = Count_Num/10%10;LedData[3] = Count_Num%10;if(Count_Num >=9999){ Count_Num=0;} } PORTK = 0x01 << LedNum;PORTB = LedCode[LedData[LedNum]];LedNum++;if(LedNum >= 4)LedNum = 0;CRGFLG = 0x80;} 这样便可以在数码管中显示动态显示0000—9999,经试验检测该方法正确。 实验二.A/D转换实验 一、实验目的 了解 S12 单片机ADC 模块的使用方法。 二、实验任务 用 S12 的ADC 模块将一路(或多路)模拟电平转换成数字量,并将转换结果显示在数码管上,或者通过SCI 发送到PC 终端显示出来。 三、实验内容 1、与 S12 的ADC 模块相关的寄存器如下,各寄存器的详细定义可参阅datasheet。ATDCTL2:控制寄存器。主要设置A/D 标志位清除方式、A/D 采样触发方式、是否允许A/D 采样完成中断等。 ATDCTL3:控制寄存器。主要设置每次A/D 转换采样几路电平、采样结果的存储方式等。 ATDCTL4:控制寄存器。主要设置A/D 转换精度、A/D 转换时钟频率等。 ATDCTL5:控制寄存器。主要设置A/D 转换结果的对齐方式和数据类型,以及A/D 的采样模式(连续采样/单词采样,顺序转换/单通道转换等) ATDSTAT0:状态标志寄存器。包括A/D 转换完成标志,出错标志、转换结果存储索引等标志位。 ATDTEST1:测试寄存器。 ATDSTAT1:标志寄存器。标识一次A/D 转换中各通道的完成情况。 以上寄存器的具体内容和其他与 ADC 模块相关的寄存器请参看datasheet 相应章节。 2、本实验采取AN14单通道连续AD转换模式,且结果存放在ATD0DR0L中, 转换序列长度为1,转换精度为8位,在freeze模式下继续转换。通过查看datasheet,得出ATD0初始化程序如下:void ATD0_init(void){ ATD0CTL1=0x0e;//转换精度为8位,从AN14通道转换 ATD0CTL2=0x40;//禁止外部触发, 中断禁止 ATD0CTL2_ASCIE = 1;//允许中断 ATD0CTL3=0x88;//转换序列长度为1,在freeze模式下继续转换 ATD0CTL4=0xFF;ATD0CTL5=0x2E;//单通道连续AD转换模式 } 具体程序见开发板例程中——testAN14。 四、预习要求 (1)参考datasheet 明确ADC 各寄存器的作用,主要思考以下问题: 1.A/D 转换的时钟应该是多少?如何设置分频因子? 答:A/D 转换的时钟应该是如下: 其中PRS为ATDCLT4中的后五位。 2.A/D 转换如何启动?有几种启动方式?分别如何设置相关寄存器? 答:可以用ATD0CLT2去给ATD模块上电,有五种上电(触发方式)分别如下:设置ATD0CLT2中的10~12位。第10位为0时忽略外部触发,为1时则使用内部触发。但第十位为1时,前两位为00,01,10,11,分别对应下降沿触发,上升沿触发,低电平触发,高电平触发。3.每次A/D 转换启动那几路电平采样?采样结果如何存储(注意FIFO 的A/D 转换模式)?采样结果的数据类型(8 位/10 位?左对齐/右对齐?有符号数/无符号数?)? 答: 每次启动那一路转化得看ATD0CTL5中的设置。采样结果的储存也是在该寄存器控制的。采样结果的位数也是该寄存器控制。如ATD0CTL5 = 00110000时该结果为左对齐无符号型数据是连续转化,多通道转化。并且从0通道开始转化。4.如何判断A/D 转换是否结束?如何清标志位? 答:从ATD0START1_CCF0 = 0 时转化完成。(2)如何实现多通道转换? 答:ATD0CTL5中的第四位置1。 五、实验现象 开发板通电后,用起子旋转电位器,发现数码管上数字从0—255连续变化。 实验 三、PWM 模块实验 一、实验目的 1. 学习使用 PWM 模块。 2. 用 PWM 实现小型直流电机调速和舵机转向。 二、实验任务 1、使用单片机内部PWM 模块调制产生不同脉宽的方波,实现小型直流电机调 速和舵机转向。 2、将 PORTA 口接八位DIP 开关,PORTB口接七段数码管显示,PORTK控制 四个数码管其中某一个显示,数码管动态显示原理同实验1。拨码开关高两位控 制舵机,当为00,11代表舵机转到正中央,为10,01代表舵机分别左转右转。拨 码开关低六位控制电机,表示PWM占空比。数码管第一位显示舵机控制方向,后 两位显示电机占空比。 三、实验内容 1.PWM 模块共有28 个寄存器,其中8 个为系统保留寄存器,具体介绍如下: PWM 启动寄存器(PWME) 本寄存器的 8 个bits 分别用来开关8 路PWM 的通道。PWM 极性寄存器(PWMPOL) 本寄存器的 8 位bits 分别用来设定8 路PWM 通道输出波形的起点电平。PWM 预分频寄存器(PWMPRCLK) 本寄存器用来设定 ClockA 和ClockB 的预分频因子。ClockA 分频寄存器(PWMSCLA) 本寄存器提供 PWM 模块操作时的几个控制位。PWM 通道周期寄存器(PWMPERx) 此 8 个寄存器分别为8 个通道设定方波的周期。PWM 通道脉宽寄存器(PWMDTYx)此 8 个寄存器分别为8 个通道设定脉宽。PWM初始化程序如下: void initPWM(void){ PWME=0x00;//关闭所有PWM通道 PWMPOL = 0xFF;//PWM极性选择,选择一个周期开始时为高电平 PWMPRCLK = 0x22;//CLOCK A,B时钟分频,均选择从总线四分频 10M PWMSCLA = 5;//CLOCK SA从CLOCK A十分频,1M PWMSCLB = 5;//CLOCK SB从CLOCK B十分频,1M PWMCTL = 0xF0;//01级联,23级联,45级联,67级联 PWMCLK = 0xFF;//PWM始终选择,选择CLOCK SA SB为PWM时钟 PWMPER01=1000;//电机PWM正转频率1k PWMDTY01=0;PWMPER23=1000;PWMDTY23=0;//电机反转频率为1k PWMPER45=20000;//舵机PWM频率为50Hz PWMDTY45=STEER_CENTER;//舵机占空比 PWME_PWME3=1;PWME_PWME1=1;//电机PWM波开始输出 PWME_PWME5=1;//舵机PWM波开始输出 } 参考程序参见实验例程——motorpwm 四、实验现象 拨码开关高两位控制舵机转向,当为00,11舵机在中央,为10,01舵机分别左转右转。拨码开关低六位控制电机,表示PWM占空比。数码管第一位显示舵机控制方向,后两位显示电机占空比。占空比越大,转速越大。 四、电磁组实验——信号处理 一、实验步骤 1、电磁传感器检测到信号 2、单片机处理这些信号——判断是否需要转向、减速 二、实验内容 1、电磁感器检测处理后为一模拟电平,需用到AD 转换程序。将光信号转换为数字量存在单片机中。接下来由单片机处理这些数,判断是否要转向。最简单的两个传感器布局,当导线在传感器中央时,相应的AD数值相同,导线偏向右边的传感器时,右边传感器的值变大,左边传感器值变小。本实验关键在于如何确定导线位置。 2、输入输出口和ATD 的初始化同前面的实验一和实验二,将程序运行后,打 开Data1 窗口,找出AD 转换后的数字值,应该在0-255 之间。将车子的左边电感对准黑色牵引线,观察两个传感器。理论上应该该电感的值最大,调解好放大器的应在160左右记录该数值(159),再将黑线想又移动,发现右边传感器的值逐渐增大,左边传感器的值逐渐减小。黑线一动到右边电感正下方时,将此电感的值调解到160左右,记录该数值(150)。而黑线偏出两个电感的范围时,两个传感器的值同时减小。 正常情况下小车检测中心线程序如下: //计算Line_center 6 if(ad_data[0]+ad_data[1]<100){ Line_center =(int)(ad_data[0])*160/159-(int)(ad_data[1])*160/150;//归一化,差值计算中心线 Get_Line = 1;} else{ Get_Line = 0;} 根据检测到黑线的位置可以判断行车方向。参考程序见电磁基本程序。 三.智能车制作研究报告 1.原理介绍 可以确定电感相对于导线的位置,或者说可以确定导线相对于小车的分布 2.电磁传感器 1首先由LC回路检测磁场○,输出信号Singal1。 2通过放大电路INA128将信号放大 ○ 3通过○获得负电源。 4因为放大后的电路频率依然为20KHz的周期信号,所以我们通过下面电路转换为稳○定输出。 5在起跑线检测上我们用干簧管电路。○6幅值测量 ○可以不使用检波电路,而直接将上述单管放大电路中,三极管集电极电压接入单片机的AD 端口,使用单片机直接采样交变电压信号 只要保证单片机的 AD 采集速率大于20kHz 的5-10 倍,连续采集5-10 个周期的电压信号(大约100 数据左右),就可以直接从采集的数据中最大值减去最小值获得信号的峰峰值。假设采集了128 个数据: , 1,2, ,128 i x i=,计算信号的峰峰值p p V − 可以有下式计算: 上面计算计算方法由于只用应用了数据的最大值、最小值,所得结果容易受 到噪声的影响,所以还可以通过计算数据交流信号的平均值、有效值反映信号的 幅值: 上面所计算得到的 , ave e x x 等都与信号的峰峰值成单调关系,所以也可以用来 进行计算位置差值信号。 7软件设计 ○程序主要用到 S12 芯片中的PWM 模块,TIM 模块、PIT 模块、AD 模块、I/O 模块 以及 SCI 模块等。PWM 模块主要用来控制舵机和电的运转; TIM 模块主要是用在了测速模块,捕捉中断并计算瞬时度。PIT模块用于设置定时中断; AD 模块主要用于读取传感器信息以判断黑线位置; I/O 模块主要是用来读取按键信息和控制数码管显示; SCI 模块只要用在无线串口传送模块。 源码后附 四.心得体会(每个队员都要提交心得体会) 五.附录:程序源代码 #include #include “derivative.h” /* derivative-specific definitions */ /********************************************************************************* * * * * *********************************************************************************/ #define StrCnr 1500 /**********************************/ //初始化锁相环 //将总线频率调整到40M /**********************************/ void InitPLL(void){ CLKSEL=0x00;//禁止锁相环,时钟由外部晶振提供,总线频率=外部晶振/2 PLLCTL_PLLON=1;//打开锁相环 SYNR=0x49;REFDV=0x43;// pllclock=fvco=2*osc*(1+SYNR)/(1+REFDV)=80MHz;POSTDIV = 0x00;_asm(nop);//BUS CLOCK=40M _asm(nop);while(!(CRGFLG_LOCK==1));// 等待锁相环初始化完成 CLKSEL_PLLSEL =1;// 使用锁相环 2012东南大学智能车竞赛电磁组Demo程序 电感信号分别接0,1口 } /**********************************/ //初始化通用IO口 //A口输入B口和K口输出 /**********************************/ void InitGPIO(void){ DDRA = 0x00;//A口输入 DDRB = 0xFF;//B口输出 DDRK = 0xFF;//K口输出 } /**********************************/ //初始化PWM /**********************************/ void InitPWM(void){ PWME=0x00;PWMPOL = 0xFF;PWMPRCLK = 0x22;PWMCLK = 0xFF;PWMSCLA =5;PWMSCLB =5;PWMCTL = 0xF0;PWMCAE=0;PWMPER01=100;PWMDTY01=0;PWMPER23=100;PWMDTY23=0;PWMPER45=20000;PWMDTY45=StrCnr;PWME_PWME3=1;PWME_PWME1=1;PWME_PWME5=1;} /**********************************/ //初始化AD /**********************************/ void InitATD(void){ ATD0CTL0 = 0x0f;ATD0CTL1_SRES = 2;ATD0CTL1_SMP_DIS=1;ATD0CTL2_AFFC = 1;//ATD0CTL2_ASCIE = 1;//10 //关闭所有PWM通道 每位对应一个端口 //PWM极性选择,选择一个周期开始时为高电平//CLOCK A,B时钟频率为10M //选择CLOCK SA SB为PWM时钟 //CLOCK SA频率为1M //CLOCK SB频率为1M //设定PWM通道两两级联使用 //电机正转频率10k //电机反转频率10k //设定舵机控制线的频率为50Hz //设定舵机初始位置 //电机PWM波开始输出 //舵机PWM波开始输出 //多路转换时转换 //转换精度为12位 //中断标志位自动清零 一个序列传唤结束触发中断 //ATD0CTL3 = 0xC0;//结果寄存器对齐方式右对齐(ATD0CTL3_DJM=1),转换序列长度为8(8路),循环转换,freeze模式下继续转换 ATD0CTL3 = 0x80;ATD0CTL4_SMP = 0;// 采样周期为4个周期 ATD0CTL4_PRS = 19;//atdclk=busclk/(2*(19+1))=1M ATD0CTL5_SCAN = 1;//连续转换模式 ATD0CTL5_MULT = 1;//多通道采样 } /**********************************/ //初始化实时中断 /**********************************/ void InitRTI(void){ RTICTL =0x9F;//2ms中断一次 } void main(void){ /* put your own code here */ InitPLL();InitGPIO();InitPWM(); { _FEED_COP();/* feeds the dog */ } /* loop forever */ /* please make sure that you never leave main */ } float StrP=0.1;float StrD=0.01;float StrPCtl;float StrDCtl;float StrCtl; #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 7 RTI_INT(void){ DisableInterrupts;11 InitRTI();InitATD();EnableInterrupts;CRGINT_RTIE = 1;for(;;)CRGFLG = 0x80; //可以在此加入合适的数码管显示代码,让其中两位显示左边电感的AD值(显示不下可以显示其中 //部分二进制位),让另外两位显示右边电感的AD值,方便调试。注意需要合适的初始化操作。 StrCtl=(ATD0DR1-ATD0DR0)*StrP;//如果需要更加精确可以使用ATD中断,对这两个值进行取平均值,低通滤波等操作。 /* 如果使用PD控制的伪代码: StrPCtl=(Right-Left)*StrP; StrDCtl=((Right-Left)-LastValueOf(Right-Left))*StrD;StrCtl=StrPCtl+StrDCtl;*/ //对舵机控制输出限幅,避免烧坏舵机 if(StrCtl>1800)StrCtl=1800;else if(StrCtl<1200)StrCtl=1200;PWMDTY45=StrCtl; //请加入合适的速度控制 //如果不确定,可以使用拨码控制速度。这时请注意相关初始化操作 EnableInterrupts;} 智能仪器实习报告 课题名称 虚拟数字电压表的设计 院(系)电气工程与控制科学学院专 业 测控技术与仪器 姓 名 _____________ 学 号 _____________ 起止日期 2017/5/10-2017/5/18 指导教师 蒋 书 波 2017 年 5 月 18 日 一、实训要求 在LabVIEW平台下,掌握虚拟数字电压表的前面板设计和框图程序设计。了解被测信号的种类,保证电压测量的精确度。 二、实训目的 1、数字电压表的功能。 2、虚拟数字电压表的前面板设计。 3、虚拟数字电压表的框图程序设计。 4、软件调试及误差分析。 5、电压测量值的存储。 三、实验原理 电压是电路中常用的电信号,通过电压测量,利用基本公式可以导出其他的参数。因此,电压测量是其他许多电参数和非电参数量的基础。测量电压相当普及的一种测量仪表就是电压表,但常用的是模拟电压表。模拟电压表根据检波方式的不同。分为峰值电压表、均值电压表和平均值电压表,它们都各自做成独立的仪表。这样,使用模拟电压表进行交流电压测量时,必须根据测量要求选择仪表。另外,多数电压表的表头是按正弦交流有效值刻度的,而测量非正弦波时,必须经过换算才能得到正确的测量结果,从而给实际工作带来不便。 采用虚拟电压表,可将表征交流电压特征的峰值、平均值和有效值集中显示在一块面板上,测量时可根据波形在面板上选择仪表,用户仅通过面板指示值就能对测量结果进行分析比较,大大简化了测量步骤 四、实验内容及说明 1、前面板的界面友好,操作方便。设计一个数据显示窗口,一个交流/直流选择按钮,一个交流电压测量多选框(PEAK/VIRTUAL VALUE/AVERAGE),一个直流电压输入框,一个启动/停止测量按钮,一个退出系统按钮。 2、显示窗口由三个部分构成,第一个为显示电压值的,第二个是显示AC或DC的,第三个为显示V或mV的。 3、交流/直流选择按钮用于选择测量输入信号的交流成分或者直流成分。 4、交流电压测量多选框在(3)中交流选择情况下可用,分别对应于电压的有效值、峰值和平均值测量,以满足不同场合下测量的需求。 5、直流电压输入值控制器在(3)中直流选择情况下可用,可在其内输入任意直流电压值,单位为V。 6、程序框图由数据采集、数据处理、数据显示和数据存储四个部分组成。作为虚拟数字电压表来说,其交流电压信号由Express VI 仿真信号生成。在数据处理中用到交、直流提取;有效值提取;峰值提取;平均值提取。 7、数据显示主要用于显示数值、AC/DC、V/mV,后面两个布尔型指示器根据测量的不同、数值范围的变化而发生变化。主程序包括一个while循环结构(用于控制启动或者停止测量)和两个case选择结构(一个是进行峰值测量、有效值测量还是平均值测量,另一个是对测量结果是以V还是mV来表示)。 8、数据存储,以文本或数据记录形式,将电压测量日期、测量时间、测量值、测量种类(交流/直流)、交流电压测量选择(若是直流电压,此项为0)、电压值的单位等有效信息,存储到文件中。且此文件用文本处理软件可方便浏览。 9、软件调试中主要由以下几种调试技术: (1)找出错误:利用查看错误清单,点击任何一个所列错误,再选用Find功能,则出错的对象或窗口就会变成高亮。 (2)设置执行程序高亮:这种执行方式一般用于单步模式,来跟踪框图中的数据流动。 (3)VI程序的单步执行:设置单步执行模式,将要执行的节点就会闪烁,指示将被执行。在次点击单步按钮,程序将会变成连续方式。 (4)探针:利用工具模板中的探针工具,放置于某根连线上,用来指示当前数据上流动的数值。 (5)断点:工具模板中的断点工具,用探针或者单步方式查看数据,点击希望设置或者清除断点的地方。 10、对于虚拟数字电压表来说,其误差分析部分就可以省略了。而如果为实际数字电压表的设计,需要多次重复测量某一电压,考虑重复性和精确性。 五、设计思路 1、前面板的设计 前面板模拟真实电压表的前面板,用于设置输入数值和观察输出量。由于虚拟面板直接面向用户,是虚拟电压表控制软件的核心。设计这部分时,主要考虑界面美观、操作简洁,用户能通过面板上的各种按钮、开关等控件来控制虚拟电压表进行测量工作。根据传统电压表面板控件的功能,利用LabVIEW中的控制模板,分别在设计面板上放入模拟实际电压表控件的数据显示窗口,一个交流/直流选择按钮,一个交流电压测量多选框(PEAK/VIRTUAL VALUE/AVERAGE),一个直流电压输入框,一个启动/停止测量按钮,一个退出系统按钮 2、程序框图的设计 (1)、数据采集部分 整个电压表分为交流和直流两个部分,为了方便交直流的选择,此处采用一个case选择结构作为交直流的切换。其中,直流电压的输入采用了一个double型的数值输入控件,交流电压的输入采用了添加均匀噪声的正弦仿真信号,如图: (2)、数据处理部分 数据处理过程中,在交流部分再次使用case选择结构来选择交流电压峰值、平均值和有效值的输出,此外还通过电压值与数值1的比较来选择电压的单位为V还是Mv。 (3)、数据显示部分 由于根据实验要求输出电压值,在数据显示部分只需要输出电压数值,提供单位V或者mV以及交流直流的显示,比较简单。 (4)、数据存储部分 这部分首先创建文件,之后设计了一个连接字符串,将需要存储的电压值,电压单位以及交直流说明连接起来,写入文本。为了使存储的数据简单易懂,添加了存储数据产生时间;为了使产生的文本美观,使用了行结束符、制表符等来换行换列。 六、实训感悟 通过这次实训,我收获了很多,一方面学习到了许多以前没学过的专业知识与知识的应用,另一方面还提高了自己动手做项目的能力。本次实训,是对我能力的进一步锻炼,也是一种考验。从中获得的诸多收获,也是很可贵的,是非常有意义的。在实训中我学到了许多新的知识。是一个让我把书本上的理论知识运用于实践中的好机会,原来,学的时候感叹学的内容太难懂,现在想来,有些其实并不难,关键在于理解。在这次实训中还锻炼了我其他方面的能力,提高了我的综合素质。首先,它锻炼了我做项目的能力,提高了独立思考问题、自己动手操作的能力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等。 实训过程中,我同时也深深的感觉到自己所学的知识的肤浅和在实践运用中知识的匮乏,刚开始的一段时间里,对一些东西无从下手,茫然不知所措,这让我感到非常的难过。在学校总以为自己学的不错,一旦接触到实践,才发现自己知道的是多么少,这才真正领悟到学无止境的含义。平时在学习中不能够透彻理解的知识,通过动手,会有更好的认知。我意识到自己的操作能力的不足,在理论上还存在很多缺陷。所以在以后的学习生活中,我会更加努力地加强理论联系实践的学习,在努力学好专业知识的同时努力加强自己的专业技能方面的能力,使自己的知识在实践中不断增长,在实践中锻炼自己,培养自己各方面的能力,不断提高自己的能力。 智能车编程总结 智能车核心是飞思卡尔xs128芯片,尽可能利用单片机里的硬件资源是程序的核心。程序理应要有漂亮的算法,但由于智能车任务不复杂,合理管理和配置硬件资源才是最重要的。 编程步骤(关键找到程序框架) I.程序第一步:通过配置寄存器来编写单片机资源的底层程序。 A.配置总线时钟频率(通过锁相环电路) B.配置输出PWM(脉宽调制波)功能(占空比) C.配置定时中断功能(PIT定时中断) D.配置输入捕捉功能(脉冲累加器) E.配置基本输入输出端口的电平 II.程序第二步:利用底层程序编写各种其他硬件的驱动程序 A.驱动电机、舵机(通过PWM波) B.驱动传感器发射和接收(通过IO端口和PWM波)。 C.驱动码盘测速装置并接收。(通过输入捕捉功能)。 III.程序第三步:连接各种硬件,顺序完成巡线任务。 IV.程序第四位:利用控制思想,不断调试和优化程序。 编程思想(程序关键要清楚) I.尽量使各种功能都封装成函数。 II.程序分层次,不同层次尽量写在不同文档中(函数层层调用)。 III.主函数中简单明了,思路、层次分明。 IV.各种工具函数同一管理。(延时,绝对值,取最大最小值等) V.重点参数使用全局变量方便调试。 控制方法:使用PID控制方法(关键在调试) I.电机调试PID (以预设速度与实际检测的速度的差值为偏差值error) II.摇头舵机PID (以传感器偏离中心距离为偏差值error) III.转向舵机PID (以摇头舵机偏离中心的角度为偏差值error) 其他一些都是根据实际情况的一些细节处理,比如过十字交叉线,出道检测,起点检测等。 志愿!永恒的志与愿! ------第六届“飞思卡尔”杯全国大学生智能汽车竞赛志愿者心得 当我听到有这样一个机会,可以参与第六届全国大学生智能车竞赛志愿者时,我便毫不犹豫的报上了我自己的名字。这不仅仅是我对智能车充满了兴趣,更是因为我喜欢“志愿者”这三个字,它不仅仅代表着一种责任与荣誉,更是体现着我对生活的理念与追求。 在我心目中,志愿者是一个高大的形象,就像是晨曦中的太阳,蓬勃朝气而又散发着无限的魅力,让人们不由得去亲近。以前我竟没有想过,我也可以成为这位大群体中的一员,在激动的同时,我也察觉到我肩上所担的责任。无论是在制作跑道还是在铺设跑道,我无时无刻不在心里怀揣着一份感激与小心,我不希望这次大赛因为我的过失而有任何差池,我所希望的只是能为这次比赛奉献我微薄的力量,我会因为我的努力而自豪,因为我的汗水而荣耀! 今年,我校荣幸的承办了第六届全国大学生智能车竞赛的任务,作为一名学习自动化的大学生,我觉得这是一次千载难逢的机会,适逢院内正在招收志愿者,我就马上报了名,没想到就这样我荣幸的成为这些优秀志愿者中的一员,从此我便开始了我短暂但却快乐的志愿者时光。 由于志愿者活动,是在暑期进行的,所以我们变比其他人少了许多与家人相聚的机会,少了许多游山玩水的机会。但我们收获的,却是其他人所钦羡的。 在刚放假的时候,我们便被留了下来,来进行一些简单跑道的制作,进行一些培训,以便让我们制作出更优良的赛会跑道。就这样我被分到了直道组,初听到直道组,我高兴地不得了,以为可以轻松的胜任这项工作。但是,我错了,到后来慢慢地才发现知道的工作比别的组别更加的辛苦。不过在这个时候学长的悉心教导让我们越来越投入到工作中去。在短短的三天内就制作出了大量的跑道,但学长说这还差得远呢,于是我明白了这是多么任重而道远的工作啊。 在家中过得了一月悠闲地时光,我们便整装待发回到校园,奔向那个神圣的岗位去了。刚来的那几天,我们继续制作跑道,熟练操作之后,我们便进行了大赛预赛与决赛的跑道制作。比赛的日子越来越近了,在忙完了跑道的制作,我们又开始了迎接参赛选手的服务工作。比赛进行的那几天里,白天,我们要负责引导参赛选手进出场地,并在比赛全程中陪伴选手,为他们解决困难,制止他们比赛的完成,周而复始直到吃饭时间。在晚上,我们便有投入到工作中去,志愿者们耐心的撤去当天的跑道,又铺设了第二天比赛要用的赛会跑道。比赛那几天,往往要工作到凌晨两点左右,更有一些学长要工作到三点。我们没有抱怨,仍坚持不懈得完成自己分内的每一项工作,看到了大赛的圆满落幕,我们甚至比获了奖的比赛选手都要高兴。 时光似乎走的太过焦急,转眼间我就要回到校园生活,结束这充沛的志愿者岁月。坚持,也许是因为在付出的过程中看到了最纯真的笑容;也许是因为彼此间心心相映的一个眼神。虽然,第一天加入这个团队时永不分离决心现在看来是那么幼稚,沙漏容不下我们想做完事;但这已经足够,足够把我们人生的航标稳稳树起。让我们驶向远方,让我向梦想驰骋。或许我们每一个人只是一种单调的色彩,但只要我们紧紧的连在一起,我相信我们可以为彼此绘出灿烂的图画。书博会的成功举办,让我们从心里感到自豪。有一天,也许当我们会再次相聚,会一同回忆起这段青春的故事。 不论我们在哪儿、从事何种职业,我想每个中国人都应抱着一颗真诚慈爱和博大的心去创造未来,创造美好的明天,而每一名志愿者,不论从事哪种志愿服务,都能让世界因为志愿者的微笑更加绚丽多彩。 志愿!是我们永恒的志与愿!第二篇:智能车电磁组报告
第三篇:智能仪器实习报告
第四篇:智能车编程总结
第五篇:智能车志愿者心得体会