遥控智能小车课程设计.doc_第1页
遥控智能小车课程设计.doc_第2页
遥控智能小车课程设计.doc_第3页
遥控智能小车课程设计.doc_第4页
遥控智能小车课程设计.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统原理 课程设计说明书题 目: 遥控智能小车 院 (系): 计算机与电子系 专业班级: 电子科学与技术0902班 学生姓名: 嵌入式系统原理 课程设计任务书一、设计题目遥控智能小车二、设计主要内容(1) 广泛查找文献资料,认真研究,反复论证,精心设计技术方案。(2) 严格遵守各项纪律,勤奋学习,认真思考,敢于挑战困难并勇于创新。(3) 较为深入的掌握arm处理器的体系结构、指令系统、编程方法,初步了解arm应用系统的软硬件开发方法及手段,较熟练地掌握arm处理器几种重要的片内外设(定时器、pll、i2c、rtc等)的基本原理及编程方法,初步掌握arm处理器外围电路的扩展方法。(4) 在现有车模的基础上,以嵌入式arm微处理器构成小车控制核心,同时加装声光电、红外线、超声波传感器、led显示等外围设备,实现对小车的速度、位置、运行状况的实时测量,并将测量数据传送至处理器进行处理,然后由处理器根据所检测的各种数据实现对电动车的智能控制;(5) 设计的智能小车应该能够实时显示时间、速度、里程,具有自动寻迹、寻光、避障功能,可程控行驶速度、准确定位停车。并有相应的声光电设备发出相关的提示或警示信息。(6) 遥控方式可自选,系统通过遥控器可以控制小车的行驶方向、速度、起停等运行状态,要求要达到一定的控制精度、距离及范围,小车行驶速度应达到3m/s以上。(7) 分析结果,独立撰写设计总结报告陈述自己的观点,格式应严格遵守学校规范。内容尽量翔实,其中必须要有自己独立的见解和认识。三、原始资料硬件资源:四驱小车车模、stm32系统板、用于arm处理器的jtag仿真器、pc机pentium100以上。设计指导书:stm32系统板配套光盘四、要求的设计成果(1)在现有车模的基础上,以嵌入式arm微处理器构成小车控制核心,同时加装声光电、红外线、超声波传感器、led显示等外围设备,实现对小车的速度、位置、运行状况的实时测量,并将测量数据传送至处理器进行处理,然后由处理器根据所检测的各种数据实现对电动车的智能控制。(2)撰写课程设计说明书,要求简洁、通顺,格式规范,设计方案正确,实现技术路线明确,论述内容完整、清楚、规范,数据、资料真实可靠,软件程序运行良好。(3)要求有完整的电路设计原理图及软件源代码。五、进程安排(1)第 1 天:任务布置及相关知识讲解(2)第2-3天:资料查阅与方案制定(3)第4-8天:硬件设计、程序编制与调试阶段(4)第 9 天:撰写设计报告(5)第 10 天:答辩与考核阶段六、主要参考资料1 田泽. 嵌入式系统开发与应用实验教程. 北京航空航天工业大学出版社,2005.2 郭荣佐,王霖. 嵌入式系统原理.北京航空航天大学出版社,.2008.3 周根林.嵌入式系统原理与应用.南京大学出版社, 2006.4 谭浩强. c语言程序设计(第2版).清华大学出版社,20085 丁峰. arm系统开发从实践到提高. 中国电力出版社,2007.6 游雨云. 单片机pwm信号控制智能小车的实现方法.技术与市场, 2009,(12)7 袁新娜,余红英,超声波传感器在智能小车避障系统中的应用. 大众商务教育版(民办教育研究),2009,(8)指导教师(签名): 20 年 月 日目 录1. 总体思想12. 电机驱动22.1 简介22.2 具体实现22.3 功能函数设计23 遥控系统73.1 遥控器简介73.2 接收探头与解码73.3 红外控制 84. 超声波 124.1 简介124.2 超声波测距具体实现124.3 超声波程序设计125. 红外寻迹145.1 反射式红外传感器145.2 具体实现方法145.3 寻迹程序设计156. 总结171.总体思想图 1.1 设计全局图本次课程设计,我们小组采用stm32作为主控芯片,l298n模块作为电机驱动芯片。在小车车头放置三个反射式红外传感器,由于红外光易于被黑线吸收,利用这个原理,来检测黑线,当检测到黑线时,发射出去的红外光被吸收,红外传感器接受不到反射信号,通过输出信号反馈给stm32,产生中断,作出相应的调整,详细介绍见下文第12页。车头部分采用一个us-100超声波模块,用于检测前方障碍物,我们小组设置的安全距离为25cm,当小车与前方障碍之间的距离小于25cm时,小车蜂鸣器报警,stm32控制电机,作出相应的调整。关于超声波工作详情,请见下文第11页。小车尾部安装一枚hs0038红外接收探头,配合一块遥控器,实现遥控小车的功能。我们小组选用的遥控器编码为nec协议。红外遥控功能详情,请见下文第7页。我们在小车的车身上放置一块3.2寸tft液晶显示器。用于显示时间,车速。车速通过霍尔元件测得。2.电机驱动2.1简介电机运转需要大电流,而stm32驱动能力达不到电机正常运转的要求,故我们小组采用l298n模块驱动电机,l298n拥有4个输入端口,由stm32直接输入,4个输出端,可以驱动两个直流电机。stm32输出端口的电平变换,可以控制电机的方向。pwm脉宽调制信号,可以控制电机的转速。实现加速减速的功能。2.2 具体实现通过stm32的pa0,pa1,根据tim2产生的不同占空比的pwm波,控制电机的速度,以及正反转。pa3,pa4控制小车前轮,前轮采用舵机控制,在转向方面,不能大幅度转弯,所以,在小车转弯上,我们采用转一段时间,然后倒退一段距离,然后再转,如此反复几次。通过这种方式实现小车的900c转弯。2.3 功能函数设计1.void front() gpiod-brr = 0x03; gpioa_conf(); /配置a端口 gpioa-brr = 0x0f;gpioa-bsrr = 0x01;调用这个函数,实现小车全速向前形式。pd端口的d0,d1位,是控制小车后面两个尾灯。当小车前进时,尾灯关闭。2.void back() gpiod-bsrr = 0x03;gpioa_conf();gpioa-brr = 0x0f;gpioa-bsrr = 0x02;调用这个函数,实现小车全速后退。同时开启车身后面的尾灯。 3 . void leftslidefront() gpiod-bsrr = 0x01; gpiod-brr = 0x02; gpioa-brr = 0x04; gpioa-bsrr = 0x08; time_configuration(350,0,500,7199);调用此函数,实现小车前进,左转弯。同时开启尾部左边的尾灯,关闭右边的尾灯。time_configuration(350,0,500,7199)为占空比调制函数。通过输入不同的值,改变电机的转速。4.void time_configuration(uint16_t ccr1_val,uint16_t ccr2_val,uint16_t periodvalue,uint16_t prescalervalue)/*开启tm2定时器时钟*/rcc_apb1periphclockcmd(rcc_apb1periph_tim2, enable);/*tim2定时器复用管脚pa0,pa1,pa2,pa3*/gpio_initstructure.gpio_pin = gpio_pin_0 | gpio_pin_1;gpio_initstructure.gpio_mode = gpio_mode_af_pp;gpio_initstructure.gpio_speed = gpio_speed_50mhz;gpio_init(gpioa, &gpio_initstructure); /*配置定时器时基*/ tim_timebasestructure.tim_period = periodvalue; tim_timebasestructure.tim_prescaler = prescalervalue; tim_timebasestructure.tim_clockdivision = 0; tim_timebasestructure.tim_countermode = tim_countermode_up; tim_timebaseinit(tim2, &tim_timebasestructure); /*配置定时器各通道情况*/ tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm1; tim_ocinitstructure.tim_outputstate = tim_outputstate_enable; tim_ocinitstructure.tim_pulse = ccr1_val; tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high; tim_oc1init(tim2, &tim_ocinitstructure); tim_oc1preloadconfig(tim2, tim_ocpreload_enable); tim_ocinitstructure.tim_outputstate = tim_outputstate_enable; tim_ocinitstructure.tim_pulse = ccr2_val; tim_oc2init(tim2, &tim_ocinitstructure); tim_oc2preloadconfig(tim2, tim_ocpreload_enable); tim_arrpreloadconfig(tim2, enable); tim_cmd(tim2, enable);pwm脉宽调制波形输出,是stm32定时器功能的一大亮点,以往8位单片机输出pwm波形,均为模拟,或者借助外围芯片,而stm32内部定时器,实现了精确的pwm波形直接输出。上面功能函数,为tim2定时器的配置情况。我在使用时,开启了tim2定时器的通道1和通道2。分别为pa0,pa1,这两个端口控制小车的后轮电机。由于前轮为舵机。所以,没有采用pwm波形。而是直接给高低电平调整小车的方向。stm32定时器采用预分频处理,即将系统时钟分频后给定时器,这个预分频值,由传入的参数prescalervalue决定。系统时钟为72mhz,设分频后的频率为f,则:f = 72mhz/(prescalervalue+1)定时器的计数周期为传入参数periodvalue的值决定。pwm占空比值由传入参数ccr1_val和ccr2_val决定,分别控制pa0,pa1的占空比值。占空比 = ccr1_val/periodvalue。4. void leftslidebehind() gpiod-bsrr = 0x01;gpiod-brr = 0x02;gpioa-brr = 0x04;gpioa-bsrr = 0x08;time_configuration(0,350,500,7199);调用此函数,控制小车后退并左转弯。同时开启左边尾灯,关闭右边尾灯。5void rightslidefront() gpiod-bsrr = 0x02;gpiod-brr = 0x01;gpioa-brr = 0x08;gpioa-bsrr = 0x04;time_configuration(350,0,500,7199); 调用此函数,控制小车前进并右转弯。同时关闭左边尾灯,开启右边尾灯。6. void rightslidebehind() /后退,右转弯gpiod-bsrr = 0x02;gpiod-brr = 0x01;gpioa-brr = 0x08;gpioa-bsrr = 0x04;time_configuration(0,350,500,7199); 调用此函数,控制小车后退并右转弯。同时关闭左边尾灯,开启右边尾灯。7. void upshift() uint16_t i;gpiod-brr = 0x03;for(i = 100;i = 180;i = i + 10)delay(200);time_configuration(i,0,500,7199);while(i bsrr = 0x03;while(i 200)time_configuration(i,0,500,7199);i = i-50;delay(70);for(;i 170; i = i - 5)time_configuration(i,0,500,7199); delay(80);调用此函数,实现小车的减速,减速过程,我们也分为两级。第一级为快速减速,第二级为慢速减速。使小车平稳减速。9void brake() gpiod-bsrr = 0x03;gpioa_conf();gpioa-bsrr = 0x0f;调用该函数,小车将停止。同时后面尾灯开启。3.遥控系统3.1 遥控器简介我们小组使用的遥控器发射编码为nec协议,nec编码协议中,遥控器每发送一个8位数据,可以分为5个部分:图 3.1 nec协议编码规则当按下遥控器上的任意一个键时,遥控器将发送一个38khz的载波信号,根据nec编码协议,如果发送数据位为1,则向外发送38khz的载波信号,持续发送0.56ms.然后停止发送1.685ms后继续发送下一位。如果发送数据位为0,则红外遥控向外发送38khz的载波信号,持续发送0.56ms,然后停止发送0.565ms后继续发送下一位。3.2 接收探头与解码接受红外信号部分,我们采用hs0038接收探头,hs0038共三个引脚,分别为,out、vcc、gnd。通电后,当没有收到红外信号时,out端口默认为高电平。接受端口信号与红外遥控发送信号电平相反。在解码方面,接收探头接受到38khz的载波后,输出端out电平拉低。由于nec发射编码中,采用的是38khz载波表示高,无发射表示低。所以在接受探头部分的电平高低,与发射部分刚好相反。解码部分,数据1,0的电平宽度为别是:图 3.2 nec协议1、0电平宽度由于每个数据位开始低电平均为0.56ms,所以,我们使用tim3定时器,准确捕获到每位数据高电平持续时间。通过捕获到的值,来确认1和0.通过软件解码时,首先接受到引导码,9ms的低电平和4.5ms的高电平,然后是地址码和地址反码,最后是数据码和数据反码。在程序设计上,我们定义个unsigned char型数组,分别记录下地址码、地址反码、数据码、数据反码。取出数组下标为2和3的值,将下标为3的数组数据取反,判断是否相等,如果不相等,表示解码数据有误;如果相等,表示解码正确。3.3 红外控制将stm32的外部中断3端口与红外探头的输出端相连,捕捉红外遥控发射来的信号。外部中断端口程序配置如下:1.void exti3_configration()/*配置pc3端口,作为外部中断触发端口*/ rcc_apb2periphclockcmd(rcc_apb2periph_gpioc, enable); gpio_initstructure.gpio_pin = gpio_pin_3;gpio_initstructure.gpio_mode = gpio_mode_in_floating;gpio_init(gpioc, &gpio_initstructure);rcc_apb2periphclockcmd(rcc_apb2periph_afio, enable);gpio_extilineconfig(gpio_portsourcegpioc, gpio_pinsource3);/*外部中断线配置,设置为上升沿触发*/ exti_initstructure.exti_line = exti_line3;exti_initstructure.exti_mode = exti_mode_interrupt;exti_initstructure.exti_trigger = exti_trigger_falling; exti_initstructure.exti_linecmd = enable;exti_init(&exti_initstructure);/*中断向量表配置*/nvic_initstructure.nvic_irqchannel = exti3_irqn;nvic_initstructure.nvic_irqchannelpreemptionpriority = 0x01;nvic_initstructure.nvic_irqchannelsubpriority = 0x01;nvic_initstructure.nvic_irqchannelcmd = enable;nvic_init(&nvic_initstructure);配置好外部中断后,当stm32上电后,便会实时监控pc3端口,当接受到红外信号后,便产生一个中断信号,调用中断处理函数,处理该事件,下面为中断处理函数,主要是解码红外信号:2.void exti3_irqhandler(void)int i,j,counter = 0;char ir4 = 0;char ch1=0,ch2=0;if(exti_getitstatus(exti_line3) != reset) tim3-cnt = 0;tim_cmd(tim3,enable);while(tim_getcounter(tim3) cnt = 0;if(gpio_readinputdatabit(gpioc,gpio_pin_3) = 0)while(!gpio_readinputdatabit(gpioc,gpio_pin_3);tim3-cnt = 0;tim_cmd(tim3,enable);while(tim_getcounter(tim3) 3500);tim_cmd(tim3,disable);if(gpio_readinputdatabit(gpioc,gpio_pin_3) = 1)while(gpio_readinputdatabit(gpioc,gpio_pin_3);for(i = 0; i 4; i+)for(j = 0; j cnt = 0;tim_cmd(tim3,enable);while(gpio_readinputdatabit(gpioc,gpio_pin_3);counter = tim_getcounter(tim3);tim_cmd(tim3,disable);ch1 = ch11;if(counter 840)ch1 = ch1|0x80;else ch1 = ch1|0;counter = 0;iri = ch1;ch1 = ir2;ch2 = ir3;ch2 = ch2;if(ch1 = ch2)switch(ch1)case 0x07:leftslidefront();break;case 0x09:rightslidefront();break;case 0x40:front();break;case 0x19:back();break;case 0x16:leftslidebehind();break;case 0x0d:rightslidebehind();break; case 0x0c:upshift();break;case 0x5e:slowdown();break;case 0x15:brake();break;default :brake();break; delay(500); exti_clearitpendingbit(exti_line3); 这个函数为中断处理函数,在中断处理函数中,我们又用到了一个tim3定时器,该定时器主要是解码红外信号,根据上文所述的0,1编码规则,用tim3定时器,所捕获到的值,来判断信号0,1,实现软件解码红外信号。下面为tim3定时器的配置:3. void tim3_configuration() tim_deinit(tim3);rcc_apb1periphclockcmd(rcc_apb1periph_tim3,enable);tim_timebasestructure.tim_period = 50000; tim_timebasestructure.tim_prescaler = 0; tim_timebasestructure.tim_clockdivision = 0; tim_timebasestructure.tim_countermode = tim_countermode_up; tim_timebaseinit(tim3,&tim_timebasestructure); tim_prescalerconfig(tim3,71,tim_pscreloadmode_immediate); tim_arrpreloadconfig(tim3,disable); tim_cmd(tim3,disable);设置预分频值为71,经过分频后,计数器的频率为1mhz。周期为50000.计数方式为向上计数。虽然stm32普通定时器的时钟为36mhz,如果将tim_clockdivision的值设置为0,则采用预分频时,时钟值应选72mhz进行分频。4.超声波4.1 简介 通过超声波发射装置发出超声波,根据接收器接到超声波时的时间差就可以知道距离了。超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。(超声波在空气中的传播速度为340m/s,根据计数器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2)4.2 超声波测距具体实现我们在小车的前端放置一个超声波模块,采用查询法,每隔1s,发射一个10us以上的脉冲信号,超声波模块便自动发送8个40khz的信号。当模块接收到返回信号时,输出端会输出一个高电平,这个高电平的持续时间,就是超声波模块到达障碍物,声速的来回时间。如果测得前方障碍物距离小于设置距离,则小车后退,并发出报警蜂鸣声。4.3 超声波程序设计1. float distance()float distance;int time;tim3-cnt = 0; /非常重要,不清零,没结果gpiob-bsrr = 0x01;while(gpio_readinputdatabit(gpiob,gpio_pin_1) = 0);/等待接收到反回信号gpiob-brr = 0x01; tim_cmd(tim3,enable); /开启定时器,记下电平持续时间while(gpio_readinputdatabit(gpiob,gpio_pin_1) = 1);tim_cmd(tim3,disable);time = tim_getcounter(tim3);distance = (float)time*0.017; /cm数量级return distance;程序中的tim3定时器,在上文3.3.3已经详细的描述。我们将stm32的pb0作为发送10us以上高电平的端口,将pb1作为接受超声波模块馈送的时间信号电平端口。该高电平的时间,为超声波来回障碍物的时间。该函数返回值,即为小车到障碍物的距离。2. void keepdistance() /超声波测距,距离控制函数 gpiob-brr = 0x100;if(distance() bsrr = 0x100;rightslidebehind(); delay(200);gpiob-brr = 0x100;delay(700); gpioa-bsrr = 0x0c;time_configuration(70,0,100,71);调用这个函数,当小车查询到前方距离小于25cm时,便进行一些列的调整,如蜂鸣器想起,小车向右后转。5.红外寻迹5.1 反射式红外传感器 图5.1 反射式红外传感器如图5.1所示,当红外发射管发射信号,经地面反射到接收管时,接收管部位电阻值很小;当红外传感器与地面距离拉大,接收管接收不到反射信号时,接收管部位电阻值很大。采用一个电压比较器lm393,lm393为两端输入,一端输出,比较两个输入信号的大小。我们将红外传感器接收管在接收到信号和没有接收到信号时,电阻两端的电压与一个固定的值相比,接收到信号时,lm393输出低电平;没有接受到信号时,lm393输出高电平。通过高低电平,判断红外管发出的信号是否被黑线吸收。5.2 具体实现方法小车上的黑线检测设备,采用的中断触发方式是,下降沿。由于电机在转动过程中,不可避免的会发生突然变向,减速等。这样会干扰电源电压,由于我我们组采用的stm32为3.3v供电,该电压有6个电池串联,经过稳压芯片稳压后,输出3.3v给stm32,当点击由于突然变向,加速减速才生大电流,对电池电压产生较大的冲击,稳压芯片输出截止。黑线检测的模块与stm32并联,当稳压芯片输出的3.3v电压突然截止时,寻迹模块输出电压为0.如果采用下降沿触发,这时,由于电压的不稳定而导致了一个有害的触发中断。通过修改硬件电路,采用上升沿触发,当红外对管检测到黑线时,输出信号为0,当小车没有检测到黑线时,输出信号为1。当稳压芯片突然截止时,输出也0,这样可以有效的解决电机对寻迹模块的干扰。我们小组采用3个寻迹模块,stm32采用3个外部触发端口分别与3个寻迹模块相连。左右两边寻迹模块用于检测跑到边沿,防止小车冲出跑到。中间寻迹模块用于检测小车转弯线。stm32分枪占式优先级和响应式优先级。如果抢占式优先级相同,则不能发生中断嵌套。小车经过转弯线时,三个寻迹模块均会检测到黑线。所以,我们设置中间寻迹模块的抢占式优先级最高,两边抢占式等级低于中间,当小车经过转弯线时,三个中断同时,或一次来临。中间中断等级打断两边,保证中间的中断执行程序能顺利执行。5.3 寻迹程序设计我们采用三个外部中断,分别为pc0,pc1,pc3三个端口,分别监控三个寻迹模块。下面以外部中断0为例:1.void exti0_configration() /*配置pc0端口,作为外部中断触发端口*/ rcc_apb2periphclockcmd(rcc_apb2periph_gpioc, enable); gpio_initstructure.gpio_pin = gpio_pin_0; gpio_initstructure.gpio_mode = gpio_mode_in_floating; gpio_init(gpioc, &gpio_initstructure); rcc_apb2periphclockcmd(rcc_apb2periph_afio, enable); gpio_extilineconfig(gpio_portsourcegpioc, gpio_pinsource0); /*外部中断线配置,设置为下降沿触发*/ exti_initstructure.exti_line = exti_line0; exti_initstructure.exti_mode = exti_mode_interrupt; exti_initstructure.exti_trigger = exti_trigger_rising; exti_initstructure.exti_linecmd = enable; exti_init(&exti_initstructure); /*中断向量表配置*/ nvic_initstructure.n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论