网站建设十佳,软件外包app,h5建站系统,怎样制作网站一、前言
1.1 项目背景
根据美国玩具协会在一项研究中#xff0c;过去几年全球玩具销售增长与GDP的世界平均水平大致相同。但全球玩具市场的内部结构已经占据了巨大的位置变化#xff1a;传统玩具的市场份额正在下降#xff0c;高科技电子玩具正在蓬勃发展。全球玩具市场的…一、前言
1.1 项目背景
根据美国玩具协会在一项研究中过去几年全球玩具销售增长与GDP的世界平均水平大致相同。但全球玩具市场的内部结构已经占据了巨大的位置变化传统玩具的市场份额正在下降高科技电子玩具正在蓬勃发展。全球玩具市场的高科技电子游戏2010年的年销售额增长了67但传统玩具的年销售额仅增长了1。
2001年十大最受欢迎的圣诞玩具之一有电子玩具。智能系统之前在很多领域如智能工程、IT、集成引擎及行业整合正在讨论就必须变得更聪明。可见传统的控制概念不能满足用户的需求并与这些传统的控制相关的智能控制提高了一般的优势和较好满足人的需求。人工智能和计算机的不断发展智能控制领域取得了很大的创新。因此找到并使用远程控制和智能技术非常重要。而且市场价值超群。
智能汽车是一种识别的多功能智能设备决策的自主水平的机械设计信息技术和人工智能领域的主动管理的环境中。它可分为三个部分一个驱动部件所述检测传感器和所述控制器的一部分。分别在物流运输方面发挥军事安全检查和破坏程度进行评估的应用的作用。 1.2 小车的现状
【1】国内在上世纪80年代末中国开始研究智能车几十年的研究后取得了一些阶段性成果。7B.8智能车辆系统。该系统是由南京理工大学、北京理工大学、浙江大学、国防科技大学、清华大学等多所院校联合硏制,属于军用室外智能车辆,于1995年底通过验收。
【2】国外智能车辆的研发在国外的很多机构都得到了很大的创新尤其是在科学和工业设计等领域,获得了更进一步的扩展研发技术已经达到了很高的水平其中具有代表性的智能车辆包括:
美国卡内基梅隆大学机器人研究所研制的Navlab系列智能车辆系统 该系统的车体采用 Pontiac运动跑车其传感器系统包括视觉、差分GPS系统。
德国 Vamos—P智能车辆系统该传感器系统包括两个有源双筒望远镜系统配置PZSA相机4种颜色三个线性加速度计和角惯性传感器改变状态转速计和发动机的测量装置。驱动方向包括发动机转矩液压制动器和电子节气门。
二、系统设计
2.1 主控系统设计
根据设计要求控制器主要用在控制电机并通过有关的传感器处理通道的轨道信息将处理信号传送给控制器然后通过控制器可以进行相应的处理以此用来实现电机的前进和后退确保在实验范围内能够进行躲避障碍和寻找痕迹还有加速减速等等动作。
供应链管理为核心的系统在汽车的道路的控制以达到他们的目标。 我们的系统进行完整的分析关键要实现自动车辆控制但此刻微控制器已经显示出它的优势是简单方便快捷。
STM32具有低功耗高时钟速度和短中断延迟的特点。 CORTEX-M3是一款32位ARM7系列处理器包括处理器内核内存单元总线接口和跟踪调试单元。本设计中使用的STM32 F103ZET6微控制器直接用于最小的开发板便于学习和使用。STM32F103功能及特点。
功能包含内核ARM 32位的Cortex™-M3 CPU、储存器、时钟、复位和电源管理、 低功耗、 2个12位模数转换器 1μs转换时间(多达16个输入通道)、 DMA、多达80个快速I/O端口、 调试模式、多达7个定时器、多达9个通信接口、CRC计算单元 96位的芯片唯一代码。
特点是集成了强大的硬件系统使其在工作中消耗更少的电力。它是一个16/32位混合编码指令可以与拇指指令兼容。NVIC是CORTEX-M3的紧密耦合部分可配置240个中断并分为256个优先级CORTEX-M3还使用尾链技术使得背对背中断响应仅6个时钟周期因此中断响应更迅速。
MPU是处理器中的存储模块通过定义和检查存储区域的属性来实现存储功能。调试访问接口可以用作串口或串行JTAG调试端口。串口调试端口只能通过时钟和数据两个引脚进行调试以保证低成本。
STM32处理器分为标准化、增强型和最新产品。STM32 F101为标准型频率为36兆赫 STM32 F103是增强型频率为72兆赫STM32 F105和STM32 F107是最新的系列产品增加了USB和以太网接口。
依据如上的分析选择P89C51 RAM单片机为这个设计的主要控制装备使用STM32芯片作为设计的开发芯片。由于其存储性能强功耗小能满足复杂编程功能的要求且成本较低对于这种设计来说是绰绰有余。
2.2 电机驱动模块
2.2.1 供电方式
方案一采用单电源同时提供单片机和直流电机。该方案的优点是减小了机身的重量操作简单。这会让单片机的波动变得很大影响到单片机的性能稳定性变得不高。
方案二采用双电源供电通过两个外界移动电源进行供电该方案的优点是减小了波动稳定性更好可以更好地操作汽车。
方案三多电池串联供电。由于单片机的工作电压在5V左右直流电压也小可以通过电池供电使电池串联连接保证了系统的正常运行。
综合考虑使用第二方案。
2.2.2 驱动电机方式
功率晶体管用作功率放大器的输出信号以驱动DC电动机。 线性控制电路的结构比较简单原理简单加速度强。 方案H桥达林顿配置。 达林顿微处理器控制可调孔隙率操作状态切换时电机速度的更精确的控制。
从电路的管道饱和效率关模式是非常高的。H型桥式电路确保了速度和方向的简单控制。电子管的开关速度非常快稳定性很强。它是一种广泛应用的PWM调速技术。现在市场上有很多芯片。我选择了L298N。该实施例具有优异的特性的头速度平滑控制一个宽的速度范围大的过载可承受频繁的冲击载荷也可以实现无级地频繁很快开始制动和扭转等。 因此我们决定使用的功率晶体管作为发动机功率放大器DC的输出控制。 图2.1.1 H桥式电路 图2.2.2 L298N
2.2.3 电机驱动选择
方案一DC电机的使用具有硬件电路设计简单的优点。当使用额定的直流电压时速度变化不大调速性能很好性价比很高。对于小车它可以很好地控制。
方案二步进电机步进电机可实现精确的转角输出只要应用合适的脉冲序列电机就可以按照人们预定的速度或方向连续旋转控制速度很慢但软件程序的编程是一个比直流电机更复杂。
所以我选择方案一好控制且性价比高。
2.3 循迹模块
方案一这个模块使用了两个红外对管(如图2.3)分别放在小车车前左右两边由光电开关的检测情况可知来控制小车的行驶和转向通过测试表明只要合理的安排两个光电开关的位置就可以达到循迹的功能。
方案二使用三对红外管其中的两个红对外管可以检测到黑线。 在黑线轨道之后汽车将立即调整到中心灯开关的方向再次检测黑线即返回轨道。那么它就会再次沿着黑线行驶。但是现场的观察表明小车在寻机的过程中会左右摇摆虽然可以正确的寻迹但是成本和稳定性都无法和第二方案相比较。
通过比较我选取第二种方案来实现循迹 图2.3 红外对管
2.4 避障模块
2.4.1 红外线避障
方案一在小车的中央使用红外线管。安装容易可以检测障碍物的存在但很难确定汽车是否会在水平方向上与障碍物碰撞不容易使汽车做出准确的转向反应。最终没有采纳这个方案。
方案二车辆的前部的两侧布置了两个红外线管平行于机器方向。 它可以精确地确定车辆和障碍和及时响应的相对距离和方向。缺点是对硬件要求较高且成本比较大。
方案三在小车的右侧使用红外线管。通过对该方案的测试可以避免障碍物充分利用资源而不浪费。但是在右侧会有部分死角不利于小车完美避障。最终没有采纳这个方案。
方案四把一个包括有舵机的红外线管装置在小车的头部。借助旋转的功能可以全方位的了解四周的情况并及时作出反应缺点就是我们需要安装舵机并编写多个程序使它运行这就加大了工作负担。并且需要制作不宜过重的舵机还要是其旋转角度为最佳工作过程过于麻烦故未选择该方案。
所以采用第二种。
2.4.2 超声波避障
方案一串联电阻转速控制系统。
方案二静态可控整流器。V-M系统简称。
方案三脉宽调制系统。
旋转式交流转换系统由交流发电机驱动交流发电机改变直流电动机并由需要速度控制的直流电动机发电机供电。发电机的输出电压可以通过调整发电机励磁电流和通过调节电机的速度被改变。
如果激励变化的侧电流 输出电压的极性是从电机的极性不同。因此G-M系的可逆操作可以是相对简单的。 该系统需要一个可变旋转速度旋转单元其包括具有相同容量的电动机速度控制的至少两个旋转机械。它还需要一个激励发生器。但他的装备很笨重。成本高效率低维护不实用。而且由于技术落后因此不需要搁置。
V-M系统是直流调速系统的主要形式。 有许多类型例如单相三相或更多相位半波交替半控制总控制等它们可以实现平稳的速度控制。 V-M系统的缺点是晶闸管的单向导电性。它不允许反向电流引起系统的可逆操作。另一个缺点是高操作和维护条件。最后如果系统以低速运行其功率将非常低此时产生的高谐波电流将损坏附近的电气设备。
晶闸管与相位无关。当晶闸管跳闸时电源电压会施加到电机上。当晶闸管断开时直流电源与电动机断开。电动机继续在二极管中流动并且通过它的电压接近零。脉冲宽度调制PWM。脉冲具有恒定的周期并且仅改变为晶闸管指定的时间即通过改变脉冲的宽度来调节连续速度。
与V-M系统相比PWM调速系统具有以下优点
1由于PWM速度控制系统的高频开关只能通过发动机电感滤波器获得小的DC纹波电流。由于上述现有的信号系统V-M的系统具有相同的平均电流相对小的热机。
2由于开关频率高如果快速响应匹配到发动机该系统能够是宽带响应速度快因此良好的性能动感较强的抗干扰能力。
根据上述的综合比较和发动机控制能力并在这种设计中的DC马达的速度调节的发展方向该设计依赖于调节PWM输出的速度以一个小的计算机芯片的单MEGA16从而可以实现更好的控制EF。FECT与LM29芯片相结合。在避开障碍物的过程中电机也可以通过直接控制LM29 8芯片来控制。操作方便易于翻转和倒退功能。
所以我选择了方案三。
2.5 遥控变速系统
本课题要求智能小车可以遥控可变速所以加上遥控系统。
在本课题中利用按键和LCD1602结合进而改变小车的速度问题。这样可以减轻负担且更加直接的改变小车的速度。
2.6 LCD1602液晶显示模块
在日常生活中我们对液晶显示器并不陌生。我使用的液晶的显示部许多电子产品如计算器万用表数字时钟和许多消费电子产品数码屏幕基材以及特殊字符和图形的通道。 人与机器在单芯片微型计算机之间的通信接口 一般输出模式如下管发光管LED数字显示屏幕流体。
液晶显示器的好处如下显示质量高由于每个点都保持液晶彩色LCD在接收到信号亮度后产生耐用性不像阴极射线管供电CRT需要不断更新新的亮点。因此液晶显示器画质高且不会闪烁。而且其数字式接口体积小、重量轻功耗低 。
另一方面LCD的功耗主要在其内部电极和驱动器的IC器件上消耗因此比其他监视器消耗更少的能量。
2.6.1 液晶显示简介
液晶显示原理
液晶显示器的原理依赖于液晶的物理特性。通过控制其显示区域中的电压存在电子显示器即可以显示图像。其中适用于LSI直接控制且易于操作的低厚度液晶显示器广泛用于移动通信设备的许多领域例如笔记本电脑数码相机和个人数字助理。
液晶显示器的分类
LCD的分类方法有很多种根据显示的不同可以分为段类型字符类型点阵类型等。除了黑白显示外LCD还具有多级彩色显示屏。如果按行为方式划分则可分为静态静态简单矩阵简单矩阵和有源矩阵有源矩阵。
字符的显示用LCD显示一个字符时比较复杂因为一个字符由6×8或8×8点阵组成既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节还要使每字节的不同位为“1”其它的为“0”为“1”的点亮为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说显示字符就比较简单了可以让控制器工作在文本方式根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址设立光标在此送上该字符对应的代码即可。
1602字符型LCD简介
液晶显示单元是专门用于显示字母数字符号等的点阵LCD显示器。目前常用161162202和402行等的模块。一般1602字符型液晶显示器实物如图2.6.1和2.6.2 图2.6.1 图2.6.2 1602字符型液晶显示器实物图
2.6.2 1602LCD的基本参数及引脚功能
1602LCD主要技术参数
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
引脚功能说明
各引脚接口说明如表1所示:
编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极
表2.6.1 引脚接口说明表
2.6.3 1602LCD的指令说明
1602液晶模块内部的控制器共有11条控制指令如表2所示
序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L**6置功能00001DLNF**7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容
表2.6.2 控制命令表
1602液晶模块通过指令编程来实现读写操作、屏幕和光标的操作。说明1为高电平、0为低电平
2.6.4 1602LCD的RAM地址映射及标准字库表
LCD模块运行缓慢因此在执行每条命令前检查模块的忙标志将其设置为低电平表示它不忙否则命令无效。要显示其指示器模块字符显示的第一个字符输入字符显示地址图2.6.3是1602的内部显示地址。 图2.6.3 1602LCD内部显示地址
当初始化设置在液晶模块其中所述第一显示模式时光标自动地移动到右侧如果液晶显示单元的符号无需人工干预。 前每个命令输入被定义为液晶模块处于繁忙状态。
1602 LCD模块在字符生成存储器CGROM中存储了160个不同的点阵字符如图2.6.4所示。这些字符是日语假名等每一个字符具有固定的代码如英文大写字母“代码”是01000001b41H时模块显示在41H的图矩阵字符。我们就能看到字母“A”。 图2.6.4 字符代码与图形对应图
2.6.5 1602LCD的一般复位过程
延时15mS
写指令38H不检测忙信号
延时5mS
写指令38H不检测忙信号
延时5mS
写指令38H不检测忙信号
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H显示模式设置
写指令08H显示关闭
写指令01H显示清屏
写指令06H显示光标移动设置
写指令0CH显示开及光标设置
2.7 机械系统
本设计要求汽车的机械系统稳定、灵活、简单三轮运动系统具有上述特点。
驱动部分由于玩具车的直流电机功率小车内装有电池、电机和电子设备使电机负荷较重。为了使汽车平稳地起动和平稳地行驶在直流电动机和轮轴之间安装了三个减速齿轮。
电源部分利用两个外接电源。
电机驱动部分主要由单芯片L29 8N和ATMEGA16芯片连接ATMGA16芯片直接与驱动电路相连。M轴承电压7和805电机电压选择12V电源电源电压输入端子。L29 8N可同时驱动两台电机最大输出电流为2A以其性能和价格好选用L29 8N作为电机驱动芯片L29 8N芯片如图2-3所示为了达到控制停止电机的目的。ATMEGA16的两个PB4和PB5端口直接连接到L29 8N的两个启用的ENA和ENB端子。L29 8N的四个输出端子直接连接到两个电机以驱动电机。
三、硬件设计
3.1 总体设计
智能车由后轮驱动后轮由两侧的电机驱动。前两个轮子的速度被制作和停止以控制转向。前轮是万象车轮起支撑作用。跟踪光电管分别安装在车身的左右两侧。如果左传感器从黑线主命令中心接收信息左侧晶圆控制轮上的电机停止工作同时右侧电机继续运行这样使小车左向左行使。当右侧右侧的传感器感受到黑线时主控制芯片控制和左侧相同原理这使小车向右行驶就和向左相同。
避障原理与直线相同。小车按寻迹路线行走3个超声波传感器检测检测前方是否有障碍物当有障碍物停止没有障碍物前进前方有障碍左右两边检测哪边检测距离大往那边走按键设置前方障碍的最小距离在避障模式下按键设置最小转弯半径小于转弯半径视为不能转弯小车原地后退然后停车由此来避免障碍物做到避障功能。
3.2 驱动电路
H桥发动机电路集成在L298上面 因此我们可以借助该集成电路来 驱使发动机该发动机引擎通常使用H桥发动机电路因此L298N能够用于驱动发动机。 图3.2.1 L298N引脚图 图3.2.2原理图
3.3 主控制电路
这个模块主要针对采集到的信号进行了分析并给出PWM波形来控制电机启动、旋转速度和停下。并重新检测障碍物报警等功能。 图3.5.1原理图
四、软件设计
4.1 电机驱动程序
#include stm32f10x.h
#include SZ_STM32F103C8_LIB.h
#include LCD1602.h
#include sys.h
#include delay.h
#include adc.h
#include ultrasonic.h
u16 count 0; //定时器计数u32 juli_up 200; //最小距离
u16 juli_Q 0;
u16 juli_Z 0;
u16 juli_Y 0;
u16 juli 0; //距离设定
u32 temp;u8 start 0; //0手动 1自动//停止
void stop()
{GPIO_SetBits(GPIOA,GPIO_Pin_4); GPIO_SetBits(GPIOA,GPIO_Pin_5); GPIO_SetBits(GPIOA,GPIO_Pin_6);GPIO_SetBits(GPIOA,GPIO_Pin_7);
}//前进
void qianjin()
{GPIO_SetBits(GPIOA,GPIO_Pin_4); GPIO_ResetBits(GPIOA,GPIO_Pin_5); GPIO_SetBits(GPIOA,GPIO_Pin_6);GPIO_ResetBits(GPIOA,GPIO_Pin_7);
}//后退
void houtui()
{GPIO_ResetBits(GPIOA,GPIO_Pin_4); GPIO_SetBits(GPIOA,GPIO_Pin_5); GPIO_ResetBits(GPIOA,GPIO_Pin_6);GPIO_SetBits(GPIOA,GPIO_Pin_7);
}//左转
void zuozhuan()
{GPIO_ResetBits(GPIOA,GPIO_Pin_4); GPIO_SetBits(GPIOA,GPIO_Pin_5); GPIO_SetBits(GPIOA,GPIO_Pin_6);GPIO_ResetBits(GPIOA,GPIO_Pin_7);
}//右转
void youzhuan()
{GPIO_SetBits(GPIOA,GPIO_Pin_4); GPIO_ResetBits(GPIOA,GPIO_Pin_5); GPIO_ResetBits(GPIOA,GPIO_Pin_6);GPIO_SetBits(GPIOA,GPIO_Pin_7);
}
4.2 寻迹程序
void TIM3_IRQHandler(void) //TIM3
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) ! RESET) {TIM_ClearITPendingBit(TIM3, TIM_IT_Update); if(start1){count;//超声波距离判断 低于最小距离if(julijuli_up){stop(); //停止}else {if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)0)(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)0)){if(count%20)qianjin();//前进elsestop(); //停止}else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)1)(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)0)){ if(count%20)zuozhuan(); //左转elsestop(); //停止}else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)0)(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)1)){ if(count%20)youzhuan(); //右转elsestop(); //停止}else{stop(); //停止}}}}
}int main(void)
{delay_init(); //初始化定时器NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);LCD_1602Init(); //初始化lcd1602 GPIO_Configuration(); //GPIO初始化Ultran_Init(); //超声波初始化delay_ms(500);TIM3_Int_Init(20,35999); //10mswhile (1){ if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)0){while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)0);//等待按键抬起set_juli(); //设置距离}if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)0){while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)0);//等待按键抬起start 1; //循迹模式} if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)0){while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)0);//等待按键抬起start 2; //行走} if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)0){while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)0);//等待按键抬起start 0; } Ultra_Ranging1(temp); //获取距离juli_Q temp;if(start2){Ultra_Ranging2(temp); //获取距离juli_Z temp;Ultra_Ranging3(temp); //获取距离juli_Y temp; }display(); //显示界面delay_ms(100);}
} 4.3 避障程序
void TIM3_IRQHandler(void) //TIM3
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) ! RESET) {TIM_ClearITPendingBit(TIM3, TIM_IT_Update); if(start1){count;//超声波距离判断 低于最小距离if(julijuli_up){stop(); //停止}else {if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)0)(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)0)){if(count%20)qianjin();//前进elsestop(); //停止}else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)1)(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)0)){ if(count%20)zuozhuan(); //左转elsestop(); //停止}else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)0)(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)1)){ if(count%20)youzhuan(); //右转elsestop(); //停止}else{stop(); //停止}}}}
}