汽车自适应前照灯系统的设计

汽车自适应前照灯系统的设计

  • 适用:本科,大专,自考
  • 更新时间2024年
  • 原价: ¥300
  • 活动价: ¥200 (活动截止日期:2024-04-20)
  • (到期后自动恢复原价)

 

汽车自适应前照灯系统的设计

 

摘  要

 

传统的汽车照明系统主要由前照灯系统,信号照明系统,车内照明系统三大部分组成。随着科技的进步,传统照明系统也经历了长足的发展,但是实际的使用中,传统的前照灯系统依然存在着诸多问题,在面对复杂的道路条件和行车状况时,交通安全仍然存在巨大的隐患。因此,如何使传统汽车照明智能化,驾车更安全,更舒适就成为一个十分紧迫而又有重大现实意义的课题。

针对传统的汽车照明灯夜间行驶在弯道时无法调节照明角度、在弯道内侧易出现盲区,在坡道无法调节照明角度等情况,提出了一种前照灯弯道自适应照明控制系统,以提高夜间行车安全性。本文主要介绍了一种以单片机STC90C51为核心设计的汽车自适应前照灯计算机控制系统。简要的介绍汽车自适应前照灯的产生的背景、当今国内外发展现状及趋势。分析了该系统的组成、功能和工作原理。在文章硬件部分,详细设计了汽车自适应前照灯左右转向计算机控制系统的主控制器及外围电路。在软件部分,设计了系统软件的整体流程,算法程序,实现了一个可根据道路以及方向盘转角信号随动转向的控制系统。

通过最后的系统调试,保证了车辆在弯道行驶时,前照灯能根据路况调整到合适的位置给驾驶者提供照明。表明了本设计方案的可行性和正确性。

在论文的最后,对本次毕业设计进行了总结,提出了一些尚待解决的问题,为今后的进一步完善提出了参考意见。

关 键 词:自适应照明,随动转向,安全驾驶,STC90C51

 

 

 

 

 

   A Project of Automotive Adaptive Front Lighting System

 

ABSTRACT

 

Traditional automotive lighting system consists of three major components: headlamp system, signal lighting and interior lighting system. As technology advances, the traditional lighting system also continues to develop, but in practice, there are still many problems in the traditional headlamp system. Facing complex road conditions and driving conditions, there are colossal security bungles in the traffic safety. Therefore, how to make the traditional  automotive lighting intelligent, and how to make the driving more secure and more comfortable have become a very urgent and  great practically significant issue.

The traditional automotive lighting drive at night may be faced some conditions, for example, inability of adjusting illumination angels at the curve, the appearance of blind section at the clip, inability of adjusting illumination angels at the ramp, based on which, a headlamp adaptive lighting control system at the curve is put forward in order to improve the driving safety at night. This paper introduces a Computer control system of the automotive adaptive headlamps with STC90C51 microcontroller core design. The paper will briefly introduce the background of the appearance of auto-adaptive headlamps, and its current development situations and trends at home and abroad. It will also analyze the composition, function and working theory of the system. The hardware part in the paper detailed designs the host controller and peripheral circuits of the auto adaptive headlamps left and right tuning computer control system. The software part projects the overall process of system software, algorithms program, finishing a control system that can optional turn according to vehicle speed and steering angle signals. The final system debugging ensures that when the vehicles are driving at the curve, the headlamps can adjust itsel according to road conditions to a suitable position to light for the drivers. The project is of feasibility and correctness.

At the end of the paper, a conclusion of the project is drawn to put forward some problems waiting for solving and to come up with some idea about the later improvement.

 

 Key words: adaptive lighting, tracking turning, safe driving,STC90C5

目  录

第1章 绪论 1

§1.1 课题背景 1

§1.2 国内外发展现状及发展趋势 3

§1.3本课题的研究意义与主要内容 5

第2章 系统整体方案设计 6

§2.1 系统的功能及构成 6

§2.2 系统基本功能 8

§2.3 系统的工作原理 8

§2.3.1 随动转弯角度 9

§2.3.2 车身纵倾调光 10

§2.4本章小结 10

第3章 系统硬件设计 11

§3.1 AFS主控制器设计 11

§3.1.1 微控制芯片的选型 11

§3.1.2 信号处理电路设计 13

§3.1.3 电源电路设计 15

§3.1.4 电机控制电路设计 15

§3.2 执行器选择 17

§3.3 传感器模块选择 17

§3.4本章小结 19

第4章 系统软件设计 20

§4.1程序思路 20

§4.2系统分块程序设计 21

§4.2.1 随动转弯程序 22

§4.2.2 倾角转动程序 23

§4.3 本章小结 24

第5章 系统调试 25

§5.1 系统硬件调试 25

§5.1.1 常见的硬件故障 25

§5.1.2 硬件调试方法 25

§5.2 系统软件调试 26

§5.3 基于PROE的运动建模 27

§5.4 本章小结 28

结 论 29

参考文献 30

致 谢 31

附 录 32

附 录1原理图 32

附 录2 PCB 33

附 录3 实物图 34

附 录4程序代码 35


第1章 绪论

§1.1 课题背景

自19世纪汽车诞生以来,已经历了一个多世纪的风雨。想当初,卡尔.本茨造出的三轮汽车每小时的时速仅为18公里/时,而现在已经诞生了时速600公里的超级跑车。随着社会的不断进步发展,汽车已成为现代人生活中不可或缺的交通工具。然而,随着汽车技术的不断进步以及车辆数目的增加,汽车也给现代社会带来了新的问题。频繁发生的交通事故已经成为不得不严肃对待的世界性问题。据统计,在各种意外事故中,以车祸占首位,占意外死亡总数的50%以上。仅以汽车交通事故为例,全世界因交通事故而死亡的人数已超过3000万人,比世界大战所死亡的人数还多。而其中以青少年与老年人的死亡率最高。

值得注意的是:儿童青少年一直都是交通事故导致伤亡的高危人群。据估计,近年来全世界每年在车祸中丧生的人数约为30万人,受伤者约3000万人,其中终身残疾者约为300万人。我国城市每万辆车死亡率为50—10.8人左右,与国外相比较,为日本的26.5倍、美国的17.8倍。若以万辆车的死亡率作比较,我国车祸的发生率和死亡率皆居世界之首位。据公安部交通管理局的统计:2005年,全国共发生道路交通事故450254起,造成98738人死亡、469911人受伤,直接财产损失18.8亿元。自2001年以来全国交通事故死亡人数首次回落到10万人以下。中国由于交通事故每年死亡超过10万人,死者大多是年轻人,占全球交通事故死亡人数的五分之一,居世界各国之首。中国每5分钟有一人因车祸死亡,每一分钟有一人因车祸伤残,每天死亡280多人,每年死亡10万多人,中国的汽车数量仅占世界的1.9%,而车祸死亡人数占世界15%,且每年增加4.5%。如何提高汽车的安全性、减少交通事故的发生已经成为全世界的迫切要求。汽车安全性分为三大部分:主动安全性、被动安全性和防火安全性。所谓主动安全性,是指汽车设计者在汽车的配置中,采取一系列技术措施,以预防和减少安全事故的发生。其中包括汽车夜间照明、各种指示信号、驾驶员视野、制动以及轮胎等;所谓被动安全性,是指在汽车中采取一系列技术措施,使得安全事故一旦发生时,可最大限度地防止或减少对人员造成的伤害。其中包括车身结构、安全玻璃、座椅、头枕、内外部凸出物以及安全气囊等。汽车照明系统作为汽车最主要的主动安全装置之一,主要负责前方路况的照明,提供给驾驶者前方的路况信息,使驾驶员能够及时看清障碍物并做出反应,是保证汽车在夜间或能见度较低的环境下安全行驶的关键。

传统的汽车照明系统主要包括照明装置(照明灯)和信号装置。其中照明灯的功能是在黑暗环境中照亮汽车行驶前方的路面(倒车灯照亮汽车后方,在倒车时也是照亮行驶方向)。照明灯主要是指前照灯、前雾灯、倒车灯和牌照灯。其次像室内灯、仪表等和行李箱灯也属照明灯用。信号装置包括汽车信号灯和回复反射器。信号灯中又包括转向指示灯、制动灯、后雾灯和位置灯等。信号灯的功能,是向其他道路使用者表明本车的存在,以及本车将要转向某一方向或正在制动减速等,以引起对其的特别关注。事实上,前雾灯兼有照明和信号的两种功能,它是在雾、雪、雨或尘埃蔓延等有碍可见度的情况下,为改善车辆前方道路照明和使迎面来车易于发现车辆的灯具。但是在实际的使用中,传统的前照灯系统存在着许多的安全隐患。特别是在交通事故多发和高致死率的夜间,传统的照明系统难以对汽车提供有效的安全保护。世界汽车安全事故统计资料表明:夜间发生的交通事故是白天的三倍,照明状况不良时的事故率又是照明良好时的三倍。我国交通事故统计资料显示,仅1994年因灯光问题酿成的安全事故就有近千起,造成三百多人死亡。而造成夜间事故平频发的主要原因是在晚上驾驶员的可视度与白天相比大幅度的下降,同时雨雾和空气中的一些污染物在前窗玻璃上形成的水滴和污物也会让驾驶员的距离感产生失真,严重影响了驾驶员对前方弯道障碍物的判断,而依靠传统的照明系统即使将近光灯、远光灯和前雾灯全部开启也依然会存在着照明盲区,从而导致事故的发生。上述这些问题的存在,就使得研制出一种具有多种照明功能的新型照明系统成为必然的趋势,并且这些功能的切换,出于安全上的考虑,应该是无需驾驶员手动控制全智能实现的。

与此同时,随着科学进步的发展,越来越多的高新技术开始运用在汽车工业上。汽车虽然本是主要偏向于机械配合的一项技术,不过近几十年随着电子技术的迅猛发展,各行各业都开始提倡机电一体化,汽车也不例外。安全、节能、环保以及智能化和信息化是未来汽车的发展趋势。与这些要求相适应,汽车电子化的趋势越来越明显,各类电器元件在汽车成本中所占比例也越来越高,如今的汽车上都是动辄数百个电子元件,数以捆计的汽车线路控制着汽车多个部门的协调工作,国外专家预测未来3-5年内汽车上装用的电子装置成本将占汽车整车成本的25%以上,汽车将由单纯的机械产品向高级的机电一体化产品方向发展,成为所谓的“电子汽车”。可以说汽车电子化已经成为现代汽车发展的重要标志。在现代汽车制造工艺中引入电子技术不仅提高了汽车的动力性、经济性和安全性,使汽车产业进入一个新的纪元,而且还开拓了电子产品的市场,推动了电子产业的发展。

将汽车电子技术运用到汽车照明领域,将微控制器、传感器、车载网络系统、自动控制理论与传统的汽车前照明机械系统结构相结合,开发出能够解决由于传统照明系统带来的安全问题的新型智能车灯,将是未来汽车前照明系统的发展方向。

§1.2 国内外发展现状及发展趋势

在欧、美、日等发达地区和国家,从上个世纪几时年代中叶就已经开始投入研究。在2003年初,一种具有“左顾右盼”功能的Pre-AFS(初级 AFS-Adaptive Front lighting System)系统诞生了。时至今天,AFS前照灯系统的研究在国外已经取得了很大的进展,日趋成熟。日本、欧洲等国的知名汽车制造商都纷纷推出自己的AFS系统。在其高档轿车中标配AFS系统的同时,讲AFS系统在中档甚至中低档轿车车型作为选配列出,比如宝马5系,奥迪A8,梅赛德斯CLS、M系、E系,雷克萨斯R系,大众B6等。

虽然AFS系统已经投入使用,而且效果良好,但致力于行车安全的专家们并不满足于已经取得的成绩。以德国海拉公司为首的汽车灯具巨头们正在考虑如何让车灯在多种复杂的道路状况下司机们提供更好的照明。一种被称作VARILIS(多功能可变智能灯光系统)的新技术已诞生,除了本课题研究的随动转弯功能之外,它将根据车速在不同范围产生不同的光型,如乡村灯光、城市灯光、高速灯光、远光等。在VARILIS系统中,光源和透镜之间不是双疝气前照灯中的遮光罩,而是一种可旋转的柱体,改柱体表面有很多不同的形状,根据智能控制器对更累传感器信号的处理,使转到不同的角度产生不同的光型。

国内关于汽车自适应照明系统的研究起步较晚,目前仅有上海小系车灯有限公司,沈阳北方汽车大灯自动转向器厂、天津欧华汽车研发中心等少数机构在进行自主研发。据报道,沈阳北方汽车大灯自动转向器厂在2007年初研发成功汽车自动转向前照灯,该产品打破了国外公司在此方面的垄断,在汽车照明领域取得突破,但与自适应的前照灯还有一定差距。可以说自适应照明系统是近年国际国内在汽车智能照明系统方面研究的热点,也是汽车主动式安全系统研究有所突破的领域。

目前,己经有很多车辆具备了AFS的部分功能,比如全新宝马530i、奔驰新E级、东风日产新天籁、东风雪铁龙凯旋、广州丰田凯美瑞、雷克萨斯LS460L以及一汽丰田锐志3.0L等。随着科技的进步和人们对于汽车观念的提升,AFS有着更安全,更环保的发展趋势。

随着科技日新月异的进步和人们对汽车安全的追求越来越高,汽车自适应前照灯系统越来越有着更安全、更环保、更人性化的发展趋势。

自适应智能照明系统在汽车主动安全领域的重大突破和显著成效使其成为未来国内外汽车生产厂商在汽车智能照明系统方面的热门研究方向之一。随着汽车工业的发展,使用者在考虑车载高新技术的同时,对汽车的安全性也越来越重视。为满足市场的需求,安全、舒适、节能将是未来自适应前照灯系统的发展方向。首先,在未来的汽车智能前照明系统中将会集成图像识别功能以检测行人、车辆和路边障碍物,为驾驶员提供更加安全的行驶环境;其次,未来的自适应照明系统将与自适应巡航控制(ACC)和车道偏离警告系统(LDWS)等其他新型汽车主动安全系统相结合,不仅可以更加精确的预测前方的路面状况从而对光型进行更智能化地调节,同时也能使系统变得更加集成化、低成本化;并且随着LED技术的不断发展,LED的性价比不断提高,据专家预测,新一代的汽车自适应照明系统也将采用LED转向灯,由于LED灯具有寿命长、占用空间小等优点,可以使得整个系统的节能性和可靠性明显提高。


§1.3本课题的研究意义与主要内容

随着汽车制造技术的不断进步,汽车的行驶安全成为人们越来越关心的问题。而汽车前照灯作为汽车主动安全的主要组成部分之一,也必须满足使用者越来越高的要求。一个优秀的汽车照明系统应该满足以下标准:能够为驾驶者提供前方路段的景象信息,让驾驶者有充足的时间对可能面对的危险做出反应;给驾驶者提供信息时不会增加驾驶员的疲劳;给本车驾驶员带来方便的同时不会给其它车道使用者的带来麻烦。

汽车自适应前照灯上下左右转向控制系统是综合利用传感技术、计算机技术、控制技术、机电一体化技术设计,使汽车自适应前照灯转向控制系统能够根据车辆的行驶状态、方向盘的转角提供更加合理的照射范围,为驾驶员的行车安全提供了更有利的保障。

本课题借鉴了当前国际和国内在这方面的技术经验及其设计思想,开发了低成本的基于STC90C51单片机的汽车自适应照明系统。论文主要研究内容如下:

第一章简单介绍了本课题的研究背景、研究目的及意义以及国内外的发展现状和发展趋势;

第二章简单介绍了系统的功能及构成、工作原理;

第三章首先根据系统功能需求对AFS主控制器的方案设计进行了介绍,然后对执行器即电机设计进行了介绍,接下来对系统所用传感器的设计和选择做了介绍和说明。

第四章针对系统的特点,设计了系统控制主程序流程图。并分别设计了随动转弯子程序、车身俯仰调整子程序的软件算法流程图。

第五章介绍了系统调试的各项内容,最后做了运动仿真。


第2章 系统整体方案设计

§2.1 系统的功能及构成

在绪论中已经提到夜间是交通事故高发生时间段,而因照明问题引发的交通事故更是占到了夜间事故的50%以上,而且夜问事故的致死率很高,达到了50%,几乎是白天事故致死率的2倍。可以说,自从汽车诞生以来,安全一直是人们关注的首要汽车性能,也永远是汽车制造商首要考虑的问题,基于此,无论是用户还是汽车生产商都希望能开发出一个能够显著减少夜间交通事故发生率的汽车前照明系统,从而自适应照明系统便登上了舞台。因此,综合国内外研究发展状况.系统的功能构成主要包括以下两个个方面:

当因路面崎岖或汽车前后载荷变化导致车身倾斜时,系统能够根据当前车身负载和当前路况来改变汽车前照灯的俯仰照射角度,既提供了更适宜的照明范围,又不会影响对面会车的司机使其眩目,图2-1为车身倾角对照明的影响。

图2-1 车身纵倾对照明产生的影响

随动转弯,车辆进入弯道时,前照灯产生随动的旋转光型,给予前方弯道足够的照明。其中图2-2是弯道传统照明情况,图2-3为在AFS下的照明情况。

图2-2 弯道传统照片

图2-3  AFS的弯道旋转照明

汽车自适应智能照明控制系统主要由获取必要汽车行驶信息的各传感器、信号调理电路、驱动电路、执行电机、故障诊断等部分组成。可分为以下几个模块:

(1)前照灯控制模块,包括调整灯光左右随动和调整高度的步进电机;

(2)AFS主控制器;

(3)传感器模块,包括倾角传感器模块和车灯左右转动处理模块;

系统结构示意图2-4如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

图2-4系统结构示意图

§2.2 系统基本功能

夜晚行驶转弯和坡道行驶时,系统对方向盘的转向信号和车身倾角信号进行运算,再发出控制信号给步进电机,指示电机转动到指定位置,步进电机根据控制信号对车灯转向角度进行调整,完成随向灯光角度控制,从而照亮车辆即将行驶到的前方的路面。

§2.3 系统的工作原理

利用倾角传感器和方向盘传感器确定车辆的行驶状态,把检测到得信号输入到单片机进行判断处理,进而发出相应的指令控制前照灯做出相应的调整,从而实现前照灯的随动转向功能。

在AFS系统下车辆左转弯时,左前照灯有向左转动的动作,右前照灯没有动作保持原有状态。同理,右转弯时右前照灯动作,左前照灯保持原有状态。车辆行驶在起伏路段时,夜晚光束会忽上忽下,在AFS下调整这种光束不平衡,使之适应司机的驾驶行为。


§2.3.1 随动转弯角度

车辆在行驶中发生状况最极端的应对措施就是制动,根据当前的车速和方向盘转角,前照灯需要偏转的角度就是要照亮车辆将要行驶到的路面,保证这个有效的刹车距离内的照明。转弯水平方向偏转模型如图:

 

图2-5转弯时水平方向偏转模型示意图

 

由图中的几何关系和圆弧长公式可得:

                                                  (2-1)

其中:是圆弧长,由转弯时系统的照明要求可得:

                                 (2-2)式中是车速,是反应时间,是制动距离。

转弯半径                                    (2-3)                                         

式中:是车轮转过的角度:是汽车的轴距。

方向盘和车轮转角的关系:

                                              (2-4)

式中:是转向特征系数,是方向盘转角;

由式子得:                               (2-5)                                       

此公式即为计算前照灯转向转角的经验公式。

§2.3.2 车身纵倾调光

车身纵惭调光是采用安装在车体前部的车身倾角传感器,获取车身倾角变化量。车身纵倾角度的变化量,就是前灯光轴角度的变化量,通过调光电机的运作,反向调整此角度变化,使之适应行车变化。

§2.4本章小结

本章首先给出了本系统的总体组成。详细的阐述了本系统的基本功能和工作原理,并建立了汽车自适应前照灯转向控制系统基本控制模型,为系统的进一步研究提供了理论基础。


第3章 系统硬件设计

如前所述,系统的硬件部分设计主要包括:

AFS主控制器设计:包括微控制器,信号处理电路,电机控制电路,指示部分电路及开关电路

执行器设计:包括左右旋转电机总成和车身纵倾调高电机总成,以下分别简称为旋转电机总成和调高电机总成

传感器模块设计:选用车身倾角传感器模块来实现倾角测控。

§3.1 AFS主控制器设计

§3.1.1 微控制芯片的选型

在车载电子系统的设计中,微控制器是整个系统的核心部件,其性能的好坏直接决定整个系统的运行效果。一般来说,选用车载电子系统微控制器时应考虑微控制器应用的类型、I/O接口、主频、功耗、所支持的存储器类型、总线、价格、封装、产品的生命力和厂家的实力、技术支持以及第三方软件的支持等因素,但最重要的是微控制器的稳定性,安全问题应该永远是车载系统首要考虑的因素。由于高度的通用性和出色的稳定性,本系统采用宏晶公司产的低功耗,高性能CMOS 8位单片机的STC90C51作为控制器。片内含4k bytes的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。它集Flash程序存储器既可在线编程(ISP)也可用传统方法进行编程及通用8位微处理器于单片芯片中,可提供许多高性价比的应用场合,可灵活应用于各种控制领域。其主要性能参数:

· 与MCS51产品指令系统完全兼容

· 4k字节在系统编程(ISP)Flash闪速存储器

· 1000次擦写周期

· 4.0-5.5V的工作电压范围

· 全境态工作模式:0Hz-33MHz

· 三级程序加密锁

· 128×8字节内部RAM

· 32个可编程I/O口线

· 2个16位定时器/计数器

· 6个中断源

· 全双工串行UART通道

· 低功耗空闲和掉电模式

· 中断可从空闲模唤醒系统

· 看门狗(WDT)及双数据指针

· 掉电标识和快速编程特性

· 灵活的在线系统编程

STC90C51芯片管脚图3-1

 

图3-1 STC90C51芯片管脚图

 

 

 

 

§3.1.2 信号处理电路设计

如前所述,系统需要采集的信号主要包括:方向盘转角信号。这里用电位器模拟转角信号,模拟信号均为0~5V线形变化电压信号,这就需要进行AD转换,本系统用PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。

PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I²C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I²C总线以串行的方式进行传输。

  PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由I²C总线的最大速率决定。PCF8591 特性如下:

· 单独供电

· PCF8591的操作电压范围2.5V-6V 

· 低待机电流

· 通过I²C总线串行输入/输出

· PCF8591通过3个硬件地址引脚寻址

· PCF8591的采样率由I²C总线速率决定

· 4个模拟输入可编程为单端型或差分输入

· 自动增量频道选择

· PCF8591的模拟电压范围从VSS到VDD 

· PCF8591内置跟踪保持电路

· 8-bit逐次逼近A/D转换器

· 通过1路模拟输出实现DAC增益

· 图3-2为引脚图

 

图3-2 PCF8591引脚

引脚含义如下:

AIN0~AIN3:模拟信号输入端。

A0~A3:引脚地址端。

VDD、VSS:电源端。

SDA、SCL:I2C 总线的数据线、 时钟线。

OSC:外部时钟输入端,内部时钟输出端。

EXT:内部、外部时钟选择线,使用内部时钟时 EXT 接地。

AGND:模拟信号地。

AOUT:D/A 转换输出端。

VREF:基准电源端。

 

图3-3 PCF8591电路图


§3.1.3 电源电路设计

目前轿车使用蓄电池一般都是12V,在车辆使用过程中,发电机电压可以达到13V左右,考虑到车载电源的电压波动,实际ECU的供电电压范围在9-15V。而微控制器及控制芯片供电电压都是5V,因此为了保证系统的工作,需要电源芯片进行电压转换。系统选用三端稳压器MC7805ACT作为电压转换芯片,它能提供固定的输出电压,内含过流、过热和过载保护电路。带散热片时,输出电流可达1A。其主要特点有:

输出电流可达1A

输出电压:5V

过热保护

短路保护

输出晶体管SOA保护

使用一片MC7805ACT即可将车载12V电源转换为5V为系统提供稳压电源,如图3-4所示:

 

图3-4 电源电路

§3.1.4 电机控制电路设计

系统共四个电机,系统选用4相5线步进电机,电压5VDC,电流O.16A。由于旋转和调高在执行动作时分时进行,因此需要分别控制,由于左右电机旋转角度不同,所以P1.0-P1.3发送PWM脉冲给旋转电机,P1.4和P1.7发送PWM脉冲给调高电机。

步进电机的驱动器选用达林顿阵列管ULN2003,ULN2003是高耐压、大电流达林顿陈列,由八个硅NPN达林顿管组成,该芯片特点如下:

每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。

工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V的电压,输出还可以在高负载电流并行运行。

其内部结构如下图所示:

 

图3-5 ULN2003芯片引脚

电机控制电路:

 

 

图3-6 电机驱动电路

§3.2 执行器选择

本系统选用四相六线的24BYJ48型永磁感应式步进电机,其外形尺寸如下图所示:

 

图3-7 电机外形尺寸

§3.3 传感器模块选择

倾角传感器设计

该系统选用ADXL345加速度传感器模块,ADXL345是一款小而薄的超低功耗3轴加速度计,分辨率高(13位),测量范围达± 16g。数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或I2C数字接口访问。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。其高分辨率(3.9mg/LSB),能够测量不到1.0°的倾斜角度变化。

下图为该模块的原理图 3-8

 

图3-8倾角传感器模块原理图

ADXL345加速度计实际是一种机械传感器,为多晶硅表面微加工结构,置于晶圆顶部。由于应用加速度,多晶硅弹簧悬挂于晶圆表面的结构之上,提供力量阻力。差分电容由独立固定板和活动质量连接板组成,能对结构偏转进行测量。加速度使惯性质 量偏转、差分电容失衡,输出的值与加速 度成正比。相敏解调用于确定加速度的幅度和极性。

 

 

 

 

 

 

图3-9 加速度计工作原理示意图

如图3-10所示,物体的翻转和倾斜均可以通过ADXL345三轴加速度数据gx、gy和gz来测量,根据ADXL345的工作原理有g2=gx2+gy2+gz2 , g为重力加速度,gx、gy和gz分别为重力加速度在三轴的分量,并且三轴与重力方向的夹角θx、θy、θz可以表述为:θx=arcsin(gx/g),其他两轴类推。由此可以确定物体在空间的姿态。

 

 

 

 

 

 

 

 

图3-10 物体的翻转和倾斜

§3.4本章小结

本章首先根据系统功能需求对AFS主控制器的方案设计进行了介绍,然后对执行器即电机设计进行了介绍,接下来对系统所用传感器的设计和选择做了介绍和说明。


第4章 系统软件设计

 

在系统的硬件设计完成后,需要编写源代码程序来控制硬件电路完成系统的设计功能。系统性能的高效与否,不仅取决于合理的硬件电路设计,同时也需要优秀的软件程序编写。通常的编程语言有汇编语言和高级语言两种,但是由于使用汇编语言会遇到很多问题,首先它的可读性和可维护性不强,特别是当程序没有很好标注的时候;其次是代码的可重用性不强。为提高程序的可移植性与开发效率,现在很多单片机的开发应用都使用高级语言进行。本系统所使用的C51语言就是高级语言中的一种。应用C51语言进行编写具有以下优点:不需要了解系统的硬件结构;编程时寄存器的分配和寻址由编译器自动完成而不需再考虑存储器的寻址;所使用的操作函数与汇编语言相比更接近人的思维:可直接调用C51语言中库文件的标注函数;通过C语言的模块化编程技术,可直接将已编制好的程序运用到到新的程序之中。

§4.1程序思路

系统的总体构思如下图4-1:

 

图4-1程序总体构思图

主程序是整个汽车自适应前照明系统功能的骨架,它体现了整个系统的逻辑关系。在本系统中,主程序包括系统初始化子程序、前照灯水平偏转子程序、前照灯车身上下垂直调整子程序3个功能模块。系统初始化模块对之后系统所使用的各变量进行定义,同时将内存清零、设置计数器等。前照灯水平偏转子程序、前照灯车身俯仰垂直调整子程序这两个个模块则是在不同的行驶环境中对灯头照射方向进行调整来辅助驾驶员的驾驶任务。

§4.2系统分块程序设计

 

图4-2 系统主程序设计流程图


§4.2.1 随动转弯程序

在汽车驾驶员进行转弯操作时,系统先通过汽车传感器采集的数据判断是否启动此子程序,当采集到转角信号时,启动子程序,否则不启动。再通过转角传感器采集的数据判断是否需要进行前照灯的水平偏转及前照灯水平偏转的方向。当采集到的方向盘转角大于系统设定值时,则需要进行前照灯水平偏转。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

图4-3 随动程序流程图


§4.2.2 倾角转动程序

汽车在直线路况行驶时,系统通过汽车倾角传感器采集的数据来判断是否需要进行车身俯仰前照灯垂直调整以及垂直调整的方向。当采集到的倾角数大于系统设定值时,则需要进行车身俯仰前照灯垂直调整。由于前照灯垂直调整不包含模糊控制器设计,所以只需要根据步进电机的步进角和灯头的偏转关系计算出输出的脉冲数,驱动步进电机使灯头偏转到系统设定的角度即可。如果采集到的车高数据小于系统设定值,则无需进行车身俯仰前照灯垂直调整,只需要将储存在寄存器中上次的脉冲数取反直接作为最后输出的脉冲数,使得前照灯回复到初始位置即可。车身俯仰调整子程序如下图所示

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

图4-4 前照灯倾角流程图


§4.3 本章小结

本章针对系统的特点,设计了系统控制主程序流程图。并分别设计了随动转弯子程序、车身俯仰调整子程序的软件算法流程图。


第5章 系统调试

§5.1 系统硬件调试

§5.1.1 常见的硬件故障

(1)逻辑错误:硬件的逻辑错误是由于设计错误和加工过程中的工艺性错误所造成的,主要包括:错线、开路、短路等,其中短路最为常见,在印刷电路板布线密度高的情况下,极易因工艺原因造成短路。

(2)器件失效:元器件失效主要是因为器件本身已损坏或性能不符合要求,或者是由于组装错误造成的元器件失效,如电解电容、二极管的极性错误,集成块安装方向错误等。

(3)可靠性差:系统不可靠可能受多种因素影响,如金属化孔、接插件接触不良会造成系统时好时坏;内部和外部的干扰、器件负载过大等造成逻辑电平不稳定;另外,走线和布局的不合理等也是系统可靠性差的重要因素之一。

(4)电源故障:若系统中存在电源故障,则加电后将造成器件损坏。

§5.1.2 硬件调试方法

拿到印刷电路板后,用万用表直接检查线路板各处是否有明显短路、断路的地方,尤其是电源是否短路。接着,焊接各元器件及插座,在焊接过程中要对各元件做逐一检查,比如二极管极性、电容容量及耐压、电阻值大小等。在插座、元件焊接完毕后,仔细检查元件面各元件之间裸露部分有无相互接触现象,焊接面的各焊点间、焊点和近邻线有无连接。最后,再给电路板空载上电(未插芯片),检查线路板各管脚及插件上的电位是否正确,特别是单片机管脚上的各点电压。若上述的一切都正常,则硬件调试的准备工作完成。

§5.2 系统软件调试

对系统软件编写完成之后,可以利用Keil C51仿真软件进行仿真运行调试,其调试界面如图5-1所示。

 

图5-1 Keil C51软件调试截面图

在具体的调试过程中,采取以下方法进行调试:在Keil C51编译环境中编写、编译软件模块,进行软件仿真调试,对功能模块的软件仿真。通过Keil C51的调试窗口观察各个寄存器、变量以及并行口输出的结果,监测软件模块运行的状态,在调试过程中不断地调整修改系统的软件程序,使系统实现预定功能。

调试过程中单步运行和断点运行调试只能验证程序正确与否,而不能确定定时精度、CPU的实时响应等问题,故在单步和断点调试之后,又进行了连续调试。待全部完成后,应反复运行调试多次,对系统的稳定性和操作是否符合原始设计要求、安排的操作是否合理等都要进行详细的观察,必要时作适当的修正。在软件调试仿真无误后,即可用编程器烧写到单片机中运行,观察系统运行结果。这样,通过不断烧写、试验,最终完成整个软件,准确实现车灯转动的功能。

§5.3 基于PROE的运动建模

经过系统软件调试,证明设计方案是可行的。为了更加深入了解系统的运动特性,我们对其进行运动的仿真,通过对比选择了使用PROE以达到运动仿真。系统通过接受信号控制电机的转动,再通过减速机构,从而使车灯系统能转动。

机械部分总体建模如下图5-2

 

图5-2 机械总体建模

内支架建模:

 

图5-3 内支架建模

外支架建模:

 

 

图5-4 外支架建模

§5.4 本章小结

本章首先详细描述用Keil C51对软件进行调试的过程以及其方法,通过输入不同的数据对系统进行调试,以确定本设计方案的正确性。其后通过PROE建模,并通过PROE对其进行运动仿真。本章工作内容使得硬件部分能通过机械结构和软件算法实现系统的功能,通过PROE的运动仿真,能更加深入的了解其运动特性。


结 论

汽车自适应照明系统目前正处于迅速发展时期,国内研究尚处于起步阶段,基础理论还不完善,这给研究工作带来很大的机遇和挑战。本论文针对传统汽车照明系统光型单一,无法进行故障预知,安全系数不高的背景,整合了全车灯光系统,设计了一种自适应的照明系统。以最简单的方式实现了汽车的低成本、智能化照明。

课题的研究开发工作经过两个月的不懈努力取得突破性进展,现将所完成的主要工作总结如下:

(1)系统总体设计方案是正确、可行的。创造性的整合了全车灯光系统,通过机电一体化技术实现了汽车照明系统的智能化。

(2)课题设计的灯光控制系统实现了原定的功能要求,且具有较强的抗干扰能力和故障自诊断能力,能够保证驾驶过程的安全、舒适。

(3)采用模块化方法进行了系统的软硬件开发,从原理图,PCB设计到各种传感器的选择、器件采购、软件设计、调试,获得了宝贵的实践经验。

(4)硬件电路采用的元器件经过多方面的选折比较,能够完成系统功能要求,在市场上又容易采购,价格合理。具有良好的性价比,为今后的系统功能扩展打下基础。

(5)软件设计在完成基本功能的基础上,尽量做到程序的优化。


参考文献

[1]世界汽车发展大事记[J].湖南现代道路交通,2002(3):28—30.

[2]2009年下半年全国道路交通情况.[2010.1.20].

[3]2009年全国道路交通事故统计数据情况.[2010.2.23].

[4]2010年全国道路交通安全形势总体平稳.[2011.1.27].

[5]徐大伟.世界汽车安全性技术法规与标准研究[D].武汉:武汉理工大学,2007.

[6]D.Decker,C.Schmidt.Adaptive Systems for Motor Vehicle Front Steps and Future,SAE World Congress,2005 It].USA:Detroit,Michigan.

[7]H.Shadeed,J.Wallschek.Concept of an Intelligent Adaptive Vehicle Front Lighting Assistant System,Proceeding of the 2007 IEEE Intelligent Vehicle Symposium,2007[C].Turkey:Istanbul.

[8]郑乃金.智能灯光系统的发展、功能及技术动向[J].世界汽车,1996(6):18-22.

[9]雷雨海.前照灯智能话控制[J].交通科技与经济,2004(5):42-43.

[10]魏春园,等译.汽车电气与电子[M].北京:北京理工大学出版社,2004.

[11]戎辉,龚进峰,等.AFS系统关键技术研究[J].汽车电器,2008(5):15一18.

[12]谢明志.主动式灯头控制系统之研究[D].台湾:大叶大学,2003.

[13]戎辉,龚进峰,等.自适应前照灯运动学建模及系统开发[J].汽车工程,2008,12(30):1079—1082.

[14] 李礼夫 邓前.汽车自适应前照灯转弯模式的数学模型研究.设计.计算.研究.2010(10):43-45.

 [15] 谭浩强.C程序设计.第三版.清华大学出版社,2005:1-376


致 谢

本论文是在导师任德志老师的悉心指导下完成的。两个多月来,老师渊博的专业知识、严谨的治学态度和平易近人的气质,给我以深深的教诲和启迪,是我今后学习和工作的榜样。同时,老师还在生活上对我无微不至的关怀,并给予良好的学习环境和科研条件,使我能够全身心的投入到学习和工作中。感谢我的父母和家人对我的学业一贯的支持与关心,是他们在背后默默地为我提供了物质保障和不断进取的精神动力,让我顺利的完成学业。感谢教研室各位同学的关心和帮助,感谢你们在学业上不断给予我的支持和帮助,同时也感谢曾经无私帮助过我的其他老师和同学。

限于本人水平,在论文中还存在许多缺陷和不足,真诚希望各位老师对本论文提出宝贵意见。

 

 

 

 

 

 

 

 

 

 

 


附 录

附 录1原理图

 

 

 

附 录2 PCB

 

 

 

 

 

 

 

 

 

 

 

附 录3 实物图

 

 

 

 

 

 

 

 

 

 

 

 

附 录4程序代码

#include  <REG51.H>

#include  <math.h>    

#include  <stdio.h>   

#include  <INTRINS.H>

#define   uchar unsigned char

#define   uint unsigned int

#include  "dianji.h"

#include  "tuoluoyi.h"

#include  "ad.h"

uint  jiaodu=0;

uchar bz=0;

uchar  add=0;

uchar bza1=0;

uchar bza2=0;

//主程序

void main()

{

  uchar devid;

  P1=0X00;

  delay(500);                   //上电延时

  InitLcd();                      //液晶初始化ADXL345

  Init_ADXL345();                 //初始化ADXL345

  devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确

   add=Read_AD(0);  

  if(add<127)   {bza2=0;}

  if(add>=127) { bza2=1;}

  while(1)                         

  {

    //初始化ADXL345

   Init_ADXL345();    

   //连续读出数据,存储在BUF中               

   Multiple_read_ADXL345();    

   //读取xyz

   display_x();

   display_y();

   display_z();

   delay(200);                    

   //延时  

   //0到20;20到40;40到60;

   if((jiaodu1>190)&&(bz==0)){K=2;motor_ffw();bz=1; }

   if((jiaodu1>390)&&(bz==1)){K=2;motor_ffw();bz=2; }

   if((jiaodu1>590)&&(bz==2)){K=2;motor_ffw();bz=3;}

   if((jiaodu1<55)&&(bz==3)){bz=4;K=1;motor_ffw();K=1;motor_ffw();K=1;motor_ffw();}

   if((jiaodu1>190)&&(bz==4)){K=1;motor_ffw();bz=5; }

   if((jiaodu1>390)&&(bz==5)){K=1;motor_ffw();bz=6; }

   if((jiaodu1>590)&&(bz==6)){K=1;motor_ffw();bz=7;}

   if((jiaodu1<55)&&(bz==7)){bz=0;K=2;motor_ffw();K=2;motor_ffw();K=2;motor_ffw();}

 

   //--------

   add=Read_AD(0);  

   if((add<127)&&(bza2==0))   {bza1=1;bza2=1;}

 

   if((add>=127)&&(bza2==1)) { bza1=2;bza2=0;}

 

   if((bza1==1)) { bza1=0;K=1;motor_ffw2(); }

   if((bza1==2)) { bza1=0;K=2;motor_ffw2(); }

 

   }

}

 

 

//**************************************************************************************************

 

 

sbit I2C_SDA=P2^7;          //数据线

sbit I2C_SCK=P2^3;          //时钟线

 

#define uchar unsigned char

#define uint  unsigned int

 

 

void  Delay_10_uS(void)

{

        char i=10;

        while(i--);

}

 

//**************************************************************************************************

//启动(SCL为高,SDA由高变为低是一个开始条件)

//**************************************************************************************************

bit start()  

{

        Delay_10_uS();

        I2C_SDA =1;

        Delay_10_uS();

        I2C_SCK =1;

        Delay_10_uS();

        if ( I2C_SDA == 0) return 0;

        if ( I2C_SCK == 0) return 0;

        I2C_SDA = 0;

        Delay_10_uS();

        I2C_SCK = 0;

        Delay_10_uS();

        return 1;

}

//**************************************************************************************************

//停止(SCL为高,SDA由低变为高是一个结束条件)

//**************************************************************************************************

void stop()   

{

 Delay_10_uS();

        I2C_SDA = 0;

        Delay_10_uS();

        I2C_SCK = 1;

        Delay_10_uS();

        I2C_SDA = 1;

        Delay_10_uS();

}

//**************************************************************************************************

//检测应答(所有的地址和数据字都是以8bit,在第9个时钟周期,从器件发出"0"信号来作为收到一个字的应答信号)

//**************************************************************************************************

//void checkACK()                   //主器件检测从器件是否返回应答

//{

//  Delay_10_uS();

//        I2C_SDA=1;

//        Delay_10_uS();

//        I2C_SCK=1;

//        Delay_10_uS();

//        I2C_SCK=0;

//        Delay_10_uS();

//}

//**************************************************************************************************

//发送应答(发送方为主器件,接收方为从器件,控制器作为从器件接收完1数据时,发送应答信号

//**************************************************************************************************

//void sendACK(bit ACK)                   

//{

//    if(ACK)sda=1;            //如果i位为1则发送1,即发送"非应答信号"

//      else sda=0;            //如果i位为0则发送0,即发送"应答信号"

//    scl=1;                   //时钟线置高,给一个脉冲

//  Delay_10_uS();                //延时

// scl=0;                   //时钟线置低

// _nop_();                 //延时

//}

//**************************************************************************************************

//写一字节

//**************************************************************************************************

bit send_byte(uchar date)       //写一个8位字

{

  uchar s_i = 8;

        bit bit_ack;

        while( s_i-- )

        {

                Delay_10_uS();

                if ( date &0x80 )   I2C_SDA =1;

                else             I2C_SDA =0;

                Delay_10_uS();

                I2C_SCK = 1;

                Delay_10_uS();

                I2C_SCK = 0;

                date = date << 1;

        }

        Delay_10_uS();

        I2C_SDA = 1;

        Delay_10_uS();

        I2C_SCK = 1;

        Delay_10_uS();

        bit_ack = I2C_SDA;

        I2C_SCK =0;

        Delay_10_uS();

        return bit_ack;   //查询是否返回应答信号

}

//**************************************************************************************************

//读一字节

//**************************************************************************************************

uchar receive_byte()         //读一个8位字

{

  uchar ic_i = 8, d;

        Delay_10_uS();

        I2C_SDA = 1;

        while ( ic_i--)

        {

                d = d << 1;

                Delay_10_uS();

                I2C_SCK =1;

                if ( I2C_SDA ) d++;

                Delay_10_uS();

                I2C_SCK =0;

        }

        return d;  //返回读取的8位数据

}

//**************************************************************************************************

//读取AD转换结果数据

//**************************************************************************************************

uchar Read_AD(uchar chn)

 {

   uchar  ad_data;          //定义变量,存放转换结果

   start();                 //启动总线

   send_byte(0x90);         //选择从器件地址,RW位为0,即选择写命令

   send_byte(0x40|chn);     //寄存器设置,0通道

   

   start();                 //启动I2C总线

   send_byte(0x91);         //选择从器件地址,RW位为1,即选择读命令

 

   ad_data=receive_byte();  //读取转换结果

    stop();                  //停止

   return(ad_data);

 }

 

 

 

 

 

#define   DataPort P0    //LCD1602数据端口

sbit   SCL=P2^0;      //IIC时钟引脚定义

sbit   SDA=P2^1;      //IIC数据引脚定义

sbit      LCM_RS=P2^4;   //LCD1602命令端口

sbit      LCM_RW=P2^5;   //LCD1602命令端口

sbit      LCM_EN=P2^6;   //LCD1602命令端口

 

#define SlaveAddress   0xA6   //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改

                              //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A

typedef unsigned char  BYTE;

typedef unsigned short WORD;

 

BYTE BUF[8];                         //接收数据缓存区      

uchar ge,shi,bai,qian,wan;           //显示变量

int  dis_data;                       //变量

int  data_xyz[3];

 

 

void delay(unsigned int k);

void InitLcd();                      //初始化lcd1602

void Init_ADXL345(void);             //初始化ADXL345

 

void WriteDataLCM(uchar dataW);

void WriteCommandLCM(uchar CMD,uchar Attribc);

void DisplayOneChar(uchar X,uchar Y,uchar DData);

void conversion(uint temp_data);

 

void  Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //单个写入数据

uchar Single_Read_ADXL345(uchar REG_Address);                   //单个读取内部寄存器数据

void  Multiple_Read_ADXL345();                                  //连续的读取内部寄存器数据

//------------------------------------

void Delay5us();

void Delay5ms();

void ADXL345_Start();

void ADXL345_Stop();

void ADXL345_SendACK(bit ack);

bit  ADXL345_RecvACK();

void ADXL345_SendByte(BYTE dat);

BYTE ADXL345_RecvByte();

void ADXL345_ReadPage();

void ADXL345_WritePage();

//-----------------------------------

 

//*********************************************************

void conversion(uint temp_data)  

{  

    wan=temp_data/10000+0x30 ;

    temp_data=temp_data%10000;   //取余运算

qian=temp_data/1000+0x30 ;

    temp_data=temp_data%1000;    //取余运算

    bai=temp_data/100+0x30   ;

    temp_data=temp_data%100;     //取余运算

    shi=temp_data/10+0x30    ;

    temp_data=temp_data%10;      //取余运算

    ge=temp_data+0x30;

}

 

/*******************************/

void delay(unsigned int k)

{

unsigned int i,j;

for(i=0;i<k;i++)

{

for(j=0;j<121;j++)

{;}}

}

/*******************************/

void WaitForEnable(void)

{

DataPort=0xff;

LCM_RS=0;LCM_RW=1;_nop_();

LCM_EN=1;_nop_();_nop_();

while(DataPort&0x80);

LCM_EN=0;

}

/*******************************/

void WriteCommandLCM(uchar CMD,uchar Attribc)

{

if(Attribc)WaitForEnable();

LCM_RS=0;LCM_RW=0;_nop_();

DataPort=CMD;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

/*******************************/

void WriteDataLCM(uchar dataW)

{

WaitForEnable();

LCM_RS=1;LCM_RW=0;_nop_();

DataPort=dataW;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

/***********************************/

void InitLcd()

{

WriteCommandLCM(0x38,1);

WriteCommandLCM(0x08,1);

WriteCommandLCM(0x01,1);

WriteCommandLCM(0x06,1);

WriteCommandLCM(0x0c,1);

}

/***********************************/

void DisplayOneChar(uchar X,uchar Y,uchar DData)

{

Y&=1;

X&=15;

if(Y)X|=0x40;

X|=0x80;

WriteCommandLCM(X,0);

WriteDataLCM(DData);

}

 

/**************************************

延时5微秒

不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU时,请调整此延时函数

**************************************/

void Delay5us()

{

    _nop_();_nop_();_nop_();_nop_();

    _nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

}

 

/**************************************

延时5毫秒

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

**************************************/

void Delay5ms()

{

    WORD n = 560;

 

    while (n--);

}

 

/**************************************

起始信号

**************************************/

void ADXL345_Start()

{

    SDA = 1;                    //拉高数据线

    SCL = 1;                    //拉高时钟线

    Delay5us();                 //延时

    SDA = 0;                    //产生下降沿

    Delay5us();                 //延时

    SCL = 0;                    //拉低时钟线

}

 

/**************************************

停止信号

**************************************/

void ADXL345_Stop()

{

    SDA = 0;                    //拉低数据线

    SCL = 1;                    //拉高时钟线

    Delay5us();                 //延时

    SDA = 1;                    //产生上升沿

    Delay5us();                 //延时

}

 

/**************************************

发送应答信号

入口参数:ack (0:ACK 1:NAK)

**************************************/

void ADXL345_SendACK(bit ack)

{

    SDA = ack;                  //写应答信号

    SCL = 1;                    //拉高时钟线

    Delay5us();                 //延时

    SCL = 0;                    //拉低时钟线

    Delay5us();                 //延时

}

 

/**************************************

接收应答信号

**************************************/

bit ADXL345_RecvACK()

{

    SCL = 1;                    //拉高时钟线

    Delay5us();                 //延时

    CY = SDA;                   //读应答信号

    SCL = 0;                    //拉低时钟线

    Delay5us();                 //延时

 

    return CY;

}

 

/**************************************

向IIC总线发送一个字节数据

**************************************/

void ADXL345_SendByte(BYTE dat)

{

    BYTE i;

 

    for (i=0; i<8; i++)         //8位计数器

    {

        dat <<= 1;              //移出数据的最高位

        SDA = CY;               //送数据口

        SCL = 1;                //拉高时钟线

        Delay5us();             //延时

        SCL = 0;                //拉低时钟线

        Delay5us();             //延时

    }

    ADXL345_RecvACK();

}

 

/**************************************

从IIC总线接收一个字节数据

**************************************/

BYTE ADXL345_RecvByte()

{

    BYTE i;

    BYTE dat = 0;

 

    SDA = 1;                    //使能内部上拉,准备读取数据,

    for (i=0; i<8; i++)         //8位计数器

    {

        dat <<= 1;

        SCL = 1;                //拉高时钟线

        Delay5us();             //延时

        dat |= SDA;             //读数据               

        SCL = 0;                //拉低时钟线

        Delay5us();             //延时

    }

    return dat;

}

 

//******单字节写入*******************************************

 

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)

{

    ADXL345_Start();                  //起始信号

    ADXL345_SendByte(SlaveAddress);   //发送设备地址+写信号

    ADXL345_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页

    ADXL345_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页

    ADXL345_Stop();                   //发送停止信号

}

 

//********单字节读取*****************************************

uchar Single_Read_ADXL345(uchar REG_Address)

{  uchar REG_data;

    ADXL345_Start();                          //起始信号

    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号

    ADXL345_SendByte(REG_Address);                   //发送存储单元地址,从0开始

    ADXL345_Start();                          //起始信号

    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号

    REG_data=ADXL345_RecvByte();              //读出寄存器数据

ADXL345_SendACK(1);   

ADXL345_Stop();                           //停止信号

    return REG_data;

}

//*********************************************************

//

//连续读出ADXL345内部加速度数据,地址范围0x32~0x37

//

//*********************************************************

void Multiple_read_ADXL345(void)

{   uchar i;

    ADXL345_Start();                          //起始信号

    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号

    ADXL345_SendByte(0x32);                   //发送存储单元地址,从0x32开始

    ADXL345_Start();                          //起始信号

    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号

 for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF

    {

        BUF[i] = ADXL345_RecvByte();          //BUF[0]存储0x32地址中的数据

        if (i == 5)

        {

           ADXL345_SendACK(1);                //最后一个数据需要回NOACK

        }

        else

        {

          ADXL345_SendACK(0);                //回应ACK

       }

   }

    ADXL345_Stop();                          //停止信号

    Delay5ms();

}

 

 

//*****************************************************************

 

//初始化ADXL345,根据需要请参考pdf进行修改************************

void Init_ADXL345()

{

   Single_Write_ADXL345(0x31,0x0B);   //测量范围,正负16g,13位模式

   Single_Write_ADXL345(0x2C,0x08);   //速率设定为12.5 参考pdf13页

   Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页

   Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中断

   Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页

   Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页

   Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页

}

//***********************************************************************

//显示x轴

 

uint jiaodu1;

void display_x()

{   float temp;

    dis_data=(BUF[1]<<8)+BUF[0];  //合成数据   

if(dis_data<0){

dis_data=-dis_data;

    DisplayOneChar(2,0,'-');      //显示正负符号位

}

else DisplayOneChar(2,0,' '); //显示空格

 

    temp=(float)dis_data*3.9;   //计算数据和显示,查考ADXL345快速入门第4页

jiaodu1=temp;

    conversion(temp);           //转换出显示需要的数据

 

DisplayOneChar(0,0,'X');    //第0行,第0列 显示X

    DisplayOneChar(1,0,':');

    DisplayOneChar(3,0,qian);

DisplayOneChar(4,0,'.');

    DisplayOneChar(5,0,bai);

    DisplayOneChar(6,0,shi);

DisplayOneChar(7,0,ge);

}

 

//***********************************************************************

//显示y轴

void display_y()

{     float temp;

    dis_data=(BUF[3]<<8)+BUF[2];  //合成数据   

if(dis_data<0){

dis_data=-dis_data;

    DisplayOneChar(2,1,'-');      //显示正负符号位

}

else DisplayOneChar(2,1,' '); //显示空格

 

    temp=(float)dis_data*3.9;  //计算数据和显示,查考ADXL345快速入门第4页

    conversion(temp);          //转换出显示需要的数据

DisplayOneChar(0,1,'Y');   //第1行,第0列 显示y

    DisplayOneChar(1,1,':');

    DisplayOneChar(3,1,qian);

DisplayOneChar(4,1,'.');

    DisplayOneChar(5,1,bai);

    DisplayOneChar(6,1,shi);  

DisplayOneChar(7,1,ge);  

}

 

//***********************************************************************

//显示z轴

void display_z()

{      float temp;

    dis_data=(BUF[5]<<8)+BUF[4];    //合成数据   

if(dis_data<0){

dis_data=-dis_data;

    DisplayOneChar(10,1,'-');       //显示负符号位

}

else DisplayOneChar(10,1,' ');  //显示空格

 

    temp=(float)dis_data*3.9;  //计算数据和显示,查考ADXL345快速入门第4页

    conversion(temp);          //转换出显示需要的数据

 

DisplayOneChar(10,0,'Z');  //第0行,第10列 显示Z

    DisplayOneChar(11,0,':');

    DisplayOneChar(11,1,qian);

DisplayOneChar(12,1,'.');

    DisplayOneChar(13,1,bai);

    DisplayOneChar(14,1,shi);

DisplayOneChar(15,1,ge);  

 

}

 

 

 

 

unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转

unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转

unsigned int  K;

/******************************************************

*

*              延时程序

*

********************************************************/

 void delay1(unsigned int t)

{                           

   unsigned int k;

   while(t--)

   {

     for(k=0; k<80; k++)

     { }

   }

}

 

//步进电机驱动1

void  motor_ffw()

 {

   unsigned char i;

   unsigned int  j;

   for (j=0; j<6; j++)         //转1*n圈

    {

 

      for (i=0; i<8; i++)       //一个周期转30度

        {

          if(K==1) P1 = FFW[i]&0x0f;  //取数据

  if(K==2) P1 = FFZ[i]&0x0f;

          delay1(10);                   //调节转速

        }

     }

 }

//步进电机驱动2

void  motor_ffw2()

 {

   unsigned char i;

   unsigned int  j;

   for (j=0; j<72; j++)         //转1*n圈

    {

 

      for (i=0; i<8; i++)       //一个周期转30度

        {

          if(K==1) P1 = (FFW[i]<<4)&0xf0;  //取数据

  if(K==2) P1 = (FFZ[i]<<4)&0xf0;

          delay1(10);                   //调节转速

        }

     }

 }

 

 

 

 

此处开始附录内容。(小四号宋体)若有多项附录,可按顺序编号。

 


  • 关键词 汽车 适应 照灯
  • 上一篇:FAW-A1汽车前照灯光学设计
  • 下一篇:清朝法律婚姻制度问题的研究
  • 暂无购买记录

    暂时没有评论

    真实

    多重认证,精挑细选的优质资源 优质老师。

    安全

    诚实交易,诚信为本。

    保密

    所有交易信息,都为您保密。

    专业

    10年专业经验,10年来帮助无数学子。