飞思卡尔智能车的数据采集(CCD摄像头)程序,舵机,电机控制程序

合集下载

飞思卡尔智能车技术报告

飞思卡尔智能车技术报告

第六届“飞思卡尔”杯全国大学生智能汽车邀请赛技术报告学校:队伍名称:参赛队员:带队教师:关于技术报告和研究论文使用授权的说明本人完全了解第六届“飞思卡尔”杯全国大学生智能汽车邀请赛关保留、使用技术报告和研究论文的规定,即:参赛作品著作权归参赛者本人,比赛组委会和飞思卡尔半导体公司可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。

参赛队员签名:带队教师签名:日期:摘要随着现代科技的飞速发展,人们对智能化的要求已越来越高,而智能化在汽车相关产业上的应用最典型的例子就是汽车电子行业,汽车的电子化程度则被看作是衡量现代汽车水平的重要标志。

同时,汽车生产商推出越来越智能的汽车,来满足各种各样的市场需求。

本文以第六届全国大学生智能车竞赛为背景,主要介绍了智能车控制系统的机械及硬软件结构和开发流程。

机械硬件方面,采用组委会规定的标准 A 车模,以飞思卡尔半导体公司生产的80管脚16 位单片机MC9S12XS128MAA 为控制核心,其他功能模块进行辅助,包括:摄像头数据采集模块、电源管理模块、电机驱动模块、测速模块以及无线调试模块等,来完成智能车的硬件设计。

软件方面,我们在CodeWarrior IDE 开发环境中进行系统编程,使用增量式PD 算法控制舵机,使用位置式PID 算法控制电机,从而达到控制小车自主行驶的目的。

另外文章对滤波去噪算法,黑线提取算法,起止线识别等也进行了介绍。

关键字:智能车摄像头图像处理简单算法闭环控制无线调试第一章引言飞思卡尔公司作为全球最大的汽车电子半导体供应商,一直致力于为汽车电子系统提供全范围应用的单片机、模拟器件和传感器等器件产品和解决方案。

飞思卡尔公司在汽车电子的半导体器件市场拥有领先的地位并不断赢得客户的认可和信任。

其中在8 位、16 位及32 位汽车微控制器的市场占有率居于全球第一。

飞思卡尔公司生产的S12 是一个非常成功的芯片系列,在全球以及中国范围内被广泛应用于各种汽车电子应用中。

飞思卡尔智能车摄像头组新手指南(5)--让车跑起来篇

飞思卡尔智能车摄像头组新手指南(5)--让车跑起来篇

飞思卡尔智能车摄像头组新⼿指南(5)--让车跑起来篇舵机、电机控制策略让车跑起来彭岸辉控制器设置了快速的控制周期,在每个运算周期内,控制器即时地得到智能车车速以及传感器采样来的道路信号,经过控制算法的计算后,控制单元输出相应的前轮控制转⾓以及电机占空⽐的值,其输出值再经过函数映射关系转换为 PWM 脉宽信号传⾄前轮舵机以及驱动电机,从⽽实现⼀个周期的控制。

由于摄像头的信号是具有周期性的,可以直接采⽤摄像头采集⼀幅图像的周期作为控制周期。

舵机控制采⽤ PD 控制,控制跟随性较好,P可以及时对赛道的变化作出反应,当然舵机的 P 项值也是跟随赛道情况变化的,直道和较⼩的弯道时控制较弱,90 度弯道或 270 度⼤弯道控制量较强,D有预测道路类型的作⽤,也就是能使舵机提前打⾓。

电机控制采⽤ PID 控制,可以减⼩动态误差并且跟随性能较好。

当然也可以使⽤其他控制,很多⼈舵机采⽤P控制,电机采⽤PD或PI控制。

对⽐他们的优缺点⾃⼰选择适合⾃⼰⼩车的PID。

这⾥不进⾏深⼊讲解。

前⾯的⼯作完成后懂得基本的图像处理算法就差不多可以使⼩车跑起来了!要使⼩车跑起来其实不难的,很多初学者最希望的就是看⾃⼰的车跑起来,因为当初我也是这样的,很理解师弟师妹们此刻的想法!最基本的图像处理算法就是:图像中间往两边搜索⿊线注意:初学者在初学时不知道偏差是怎样计算的。

这⾥就提⼀下:偏差就是计算出的中线即图中赛道中的⿊线与摄像头所看到的中线即图中赛道中的竖直红线(例如采集到的图像是100列的,那么摄像头看到的中线就是50)做差得到的值就是偏差。

它表⽰车当前位置与期望位置的偏离程度。

再看个图吧:⽤两⾏来说明,其他的⼀样。

第⼀⾏左边坐标(0,1)右边坐标(0,99),得出的中线就是(0,50),那么50所在的那⼀列就是摄像头所看到的中线(就是图中竖直的红线)。

这⾥再提⼀下,很多⼈提出中线后发现上位机上或LCD上没显⽰出中线,其实显⽰出中线很简单的:根据RGB,⼀个像素点的像素值为255时显⽰出来的是⽩⾊,像素值为0时显⽰出来的是⿊⾊。

飞思卡尔智能车信息采集

飞思卡尔智能车信息采集

飞思卡尔智能车信息采集摘要本文首先对智能车的硬件进行设计,达到了低重心、大前瞻、高稳定性。

其次对系统的软件部分进行设计,利用阀值对赛道进行判断,从而得到智能车的偏航角。

综合偏航角控制量实现舵机控制,入弯道切内道,大大提高了智能车的弯道运行速度。

用光电编码盘检测智能车的运行速度,再根据赛道信息给定智能车的运行速度,运用一些算法调节驱动电机转速,实现了电机的快速响应。

经过大量测试,最终确定系统结构和各项控制参数。

关键词:单片机;舵机控制;速度控制【中图分类号】u293.2+50 引言智能车有着极为广泛的应用前景。

结合传感器技术和自动驾驶技术可以实现汽车的自适巡航并把车开得开得又快又稳、安全可靠;汽车夜间行驶时,如果装上红外摄像头,就能实现夜晚汽车的安全辅助驾驶;他也可以工作在仓库、码头、工厂或危险、有毒、有害的工作环境里,此外他还能担当起无人值守的巡逻监视、物料的运输、消防灭火等任务。

在普通家庭轿车消费中,智能车的研发也是有价值的,比如雾天能见度差,人工驾驶经常发生碰撞,如果用上这种设备,激光雷达会自动探测前方的障碍物,电脑会控制车辆自动停下来撞车就不会发生了。

提高安全性和系统效率。

这种新型车辆控制方法的核心,就是实现车辆的智能化。

1 智能车机械结构设计机械结构是控制算法和软件程序的执行机构,对机械结构性能的了解和改造有利于对控制算法和软件程序的实现。

因此对车体机械结构的调整是非常必要的。

1.1 车体机械参数调整前轮参数的调整包括前轮主销后倾角,主销内倾角,前轮外倾角,前轮前束。

这几个参数对车体直线行驶的平稳性和转弯的灵活性有很重要的影响[1]。

1.2 舵机的安装舵机转向是整个控制系统中延迟较大的一个环节,在相同的舵机转向条件下,转向连杆在舵机一端的连接点离舵机轴心距离越远,转向轮转向变化越快。

这样安装的优点是:改变了舵机的力臂,使转向更灵敏;舵机安装在正中央,使左右的转向基本一致;重心相对来说靠后,减轻舵机的负载[2]。

飞思卡尔摄像头智能车及无人驾驶车辆设想

飞思卡尔摄像头智能车及无人驾驶车辆设想

TECHNOLOGY WIND[摘要]在我们摄像头组硬软件的互相配合中,我们对未来机车实现无人驾驶有了很多想法。

智能车以freescale16位的单片机XS128作为核心控制处理器,相当于人脑;CCD 摄像头识别黑白俩色图像进行赛道边沿采集图像智能循迹,相当于人眼;采用PID 控制策略实现对采集回的图像类型即黑线的走势来判断从而调整舵机的打向和电机的转速,以实现智能车快速而平稳的寻线行驶,相当于人脑对于真实路径的方向处理和速度调整产生的策略;摄像头识别终止线并立刻做出停止反应,相当于真实机车通行时遇到必要的停止信号如红绿灯或行人等障碍物做出的即时反应。

[关键词]智能车;PID 算法;CCD 摄像头;XS128;无人驾驶飞思卡尔摄像头智能车及无人驾驶车辆设想付辉韩国宏赵皓(西南科技大学信息工程学院,四川绵阳621000)1布局架构1.1布局关键点如下摄像头置于车模后方,采用强度高质量轻的支架,并将摄像头置于距离车模底板30厘米左右处,与水平线的倾角约为47.57度,尽量减少赛车前方盲区,使舵机架高并直立安装,延长力臂以提高舵机的灵敏度,将主板,电池,电机置于同一平面放于车模,降低车底板的重心。

1.2车体构造原则在硬件安装上本着降低中心为基本原则,在摄像头和传感器的安装上本着视野范围宽而车体的距离短。

在一些小的机械细节上可以产生失之毫厘谬以千里的影响,如我们对车轮螺丝的松紧程度做了一定的调整,电机高速运转是产生的噪音就没有之前的强烈。

2硬件系统2.1摄像头摄像头作为智能车单片机、电机、舵机、电源、轮胎并驾齐驱的五宝之一,它的存在就是车子的灵魂可谓神来之笔。

车体的控制方法都基于摄像头对于赛道黑线的提取,而摄像头正是图像信息的唯一入口,对采集到的道路信息进行分析处理,利用PID 算法实现对小车行进的控制。

本队采用CCD 摄像头,灵敏度和动态图像显示较CMOS 数字摄像头更为理想,但功耗大,工作电压电流高。

飞思卡尔智能车摄像头组技术报告 (2)

飞思卡尔智能车摄像头组技术报告 (2)

第十届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告摘要本文设计的智能车系统以K60微控制器为核心控制单元,基于CCD摄像头的图像采样获取赛道图像信息,提取赛道中心线,计算出小车与黑线间的位置偏差,采用PD方式对舵机转向进行反馈控制。

使用PID控制算法调节驱动电机的转速,结合特定算法分析出前方赛道信息实现对模型车运动速度的闭环控制。

为了提高模型车的速度和稳定性,我们用C++开发了仿真平台、蓝牙串口模块、SD卡模块、键盘液晶模块等调试工具,通过一系列的调试,证明该系统设计方案是确实可行的。

关键词:K60,CCD摄像头,二值化,PID控制,C++仿真,SD卡AbstractIn this paper, we will design a intelligent vehicle system based on MC56F8366 as the micro-controller unit. using the CCD image sensor sampling to the track image information to extract the track line center, to calculate the positional deviation between the car with the black line, the use of PD on the rudder. The machine turned to the feedback control. We use PID control algorithm to adjust the speed of the drive motor, combined with specific algorithms to achieve closed-loop control of the movement speed of the model car in front of the track. In order to improve the speed and stability of the model car, we use the C++ to develop a simulation platform, Bluetooth serial module, SD card module, keyboard, LCD modules, debugging tools. Through a series of debugging, the system design is feasible.Key words: K60,CCD_camera, binaryzation, PID control, C++ simulation, SD card目录第1章引言................................................................................... - 1 - 第2章系统总体设计................................................................ - 2 - 2.1 系统分析..................................................................................... - 2 - 2.2 车模整体布局............................................................................. - 3 - 2.3 本章小结....................................................................................... - 4 - 第3章系统机械设计及实现................................................... - 5 - 3.1 前轮定位的调整......................................................................... - 5 -3.1.1主销内倾..............................................................................- 6 -3.1.2 后倾角.................................................................................- 6 -3.1.3 内倾角.................................................................................- 7 - 3.2 舵机安装....................................................................................... - 8 -3.2.1 左右不对称问题的发现与解决........................................- 10 - 3.3 编码器的安装............................................................................ - 10 - 3.4 摄像头安装.................................................................................- 11 -3.4.1 偏振镜的使用......................................................................- 12 -3.4.2 摄像头的标定......................................................................- 12 - 3.5 摄像头的选用.............................................................................- 13 - 3.6 红外接收装置.............................................................................- 14 -3.7 防止静电复位.............................................................................- 15 - 3.8 本章小结.......................................................................................- 15 - 第4章硬件电路系统设计及实现 ...................................... - 16 -4.1 硬件设计方案............................................................................- 16 - 4.2 电源稳压......................................................................................- 17 - 4.3 电机驱动......................................................................................- 18 - 4.4 图像处理部分............................................................................- 19 -4.4.1 摄像头升压电路.............................................................- 19 -4.4.2 视频分离电路.................................................................- 19 -4.4.3 硬件二值化.....................................................................- 19 - 4.5 灯塔电路......................................................................................- 21 - 4.6 本章小结......................................................................................- 21 -第5章系统软件设计.............................................................. - 22 -5.1 软件流程图...............................................................................- 22 - 5.2 算法新思路...............................................................................- 23 -5.2.1中心线提取.......................................................................- 23 -5.2.2 直角检测........................................................................... - 24 -5.2.3 单线检测......................................................................... - 24 - 5.3 舵机控制.....................................................................................- 25 - 5.4 速度控制.....................................................................................- 26 - 5.5 PID算法....................................................................................- 26 - 5.6 路径优化.....................................................................................- 31 -第6章系统联调...................................................................... - 33 - 6.1 开发工具.................................................................................... - 33 - 6.2 无线调试蓝牙模块及蓝牙上位机..........................................- 33 - 6.3 键盘加液晶调试......................................................................- 34 - 6.4 TF卡调试模块.........................................................................- 34 -6.4.1 TF卡.............................................................................- 34-6.4.2 SDCH卡 .........................................................................- 35 -6.4.3 软件实现.......................................................................- 36 - 6.5 C++上位机设计........................................................................- 36 - 6.6 电源放电模块...........................................................................- 38-6.6.1 镍镉电池记忆效应…………………………………….. - 39-6.6.2 放电及电池性能检测设备…………………………….. - 39- 6.7 本章小结....................................................................................- 40 - 第7章模型车技术参数........................................................ - 41 - 第8章总结............................................................................... - 42 - 参考文献...................................................................................... - 44 -第1章引言在半导体技术日渐发展的今天,电子技术在汽车中的应用越来广泛,汽车智能化已成为行业发展的必然趋势。

飞卡知识竞赛题目

飞卡知识竞赛题目

山东大学(威海)飞思卡尔知识竞赛初赛试题(样题)姓名:年级:学号:手机号:一填空题(每空2分,共22分)(1)HCS12微控制的工作电压为()(2)飞思卡尔智能车竞赛最初起源于哪个国家()(3)摄像头组一般使用的摄像头是CCD和()(4)第七届全国飞思卡尔智能车山东赛区在哪个学校举办()(5)飞思卡尔智能车赛要求使用的传感器不能超过()个(6)伺服电机不超过几个()(7)PWM即()(8)第八届全国飞思卡尔智能车赛中电磁组中如果选用陀螺仪,则必须选择()公司的()系列的陀螺仪。

(两空可选答一空,如果两空均答对则得4分但本题最多不超过20分)(9)AD转换中A表示的是()信号,D表示的是()信号。

(10)如果有一车模通过连续扫描赛道反射点的方式进行路径检测的属于()组车模。

二选择题(每题2分,共20分)(请勿在A、B、C、D上打勾否则不得分)1、以下学校中哪所学校是第七届飞思卡尔智能车全国总决赛举办地()A.南京师范大学B.北京科技大学C.常熟理工学院D.杭州电子科技大学2、请问CCD摄像头的额定工作电压是()A.3.3VB.5VC.7.2VD.12V3、程序的灵魂是()A.算法B.函数C.数据结构D.表达式4、以下哪种软件是用来绘制PCB(电路板)的?()A. KeilB.ProteusC.Visual C++D.Altium Designer5、请问二进制数100101011110011110是()A.奇数B.偶数6、请把十六进制数5A1D转化为二进制()A.1000100011000110B.110101********* C101101001011101 D.1011010000111017、飞思卡尔是()制造商。

A.汽车B.半导体C.汽车芯片D.手机8、第六届与第七届比赛规则变动最大的是以下哪个组()A.摄像头组B.光电组C.电磁组D.光电平衡组9、第七届比赛规则中要求摄像头组用()车模,光电组用()车模,电磁组用()车模。

飞思卡尔智能车原理

飞思卡尔智能车原理

飞思卡尔智能车原理飞思卡尔智能车是一种基于嵌入式系统和人工智能技术的智能交通工具。

它通过搭载各种传感器、控制器和算法,在无人驾驶、自动泊车等场景下发挥重要作用。

本文将介绍飞思卡尔智能车的原理,并分析其在实际应用中的优势和挑战。

一、飞思卡尔智能车的硬件组成飞思卡尔智能车的硬件组成主要包括以下几个方面:1. 主控单元:主控单元是飞思卡尔智能车的核心组件,通常采用高性能的嵌入式处理器。

它负责接收来自各种传感器的信息,并根据预设的算法进行数据处理和决策。

2. 传感器:飞思卡尔智能车搭载多种传感器,如摄像头、激光雷达、超声波传感器等。

这些传感器可以实时感知周围环境的信息,包括道路状况、障碍物位置等,为智能车提供必要的数据支持。

3. 电机与驱动系统:飞思卡尔智能车搭载电机和对应的驱动系统,用于控制车辆的行驶和转向。

这些系统通常采用先进的电子控制技术,能够实现精确的转向和速度控制。

4. 通信模块:飞思卡尔智能车通过通信模块与其他车辆、交通基础设施等进行信息交互。

这种通信方式可以实现车辆之间的协同工作,提高交通系统的整体效率。

二、飞思卡尔智能车的工作原理飞思卡尔智能车的工作原理可以归结为以下几个关键步骤:1. 环境感知:飞思卡尔智能车通过搭载的传感器对周围环境进行感知。

摄像头可以捕捉到道路状况、交通标志和其他车辆的信息;激光雷达可以检测到障碍物的位置和距离;超声波传感器可以测量车辆与前方障碍物的距离等。

通过这些传感器获取到的数据,智能车可以对周围环境做出准确判断。

2. 数据处理与决策:主控单元接收传感器传来的数据,并根据预设的算法进行数据处理和决策。

它会将传感器的信息与事先建立的模型进行比对,进而判断车辆应该采取何种动作,如加速、刹车、转向等。

3. 控制指令生成:基于数据处理与决策的结果,主控单元生成相应的控制指令,通过驱动系统控制车辆的行驶和转向。

这些控制指令可以通过电机和驱动系统精确地控制车辆的运动。

4. 数据通信与协同:飞思卡尔智能车通过通信模块与其他车辆以及交通基础设施进行信息交互。

基于CCD图像识别的HCS12单片机智能车控制系统_刘建刚

基于CCD图像识别的HCS12单片机智能车控制系统_刘建刚
第 22 卷第 6 期 2007 年 12 月
光电 技术 应用
ELECT R O- OPT IC T ECHN OL OGY A PPL ICA T ION
Vol. 22, No. 6 December . 2007
文章编号: 1673- 1255( 2007) 06- 0052- 04
基于 CCD 图像识别的 H CS12 单片机智能车控制系统
的光电传感器识别路径方案, 该摄像头传感器 可以获取更多的路径信息, 使智能 车按任意 给定的黑色 引导线更 能以较快的 速
度平稳地运行.
关键词: 图像识别; 智能车; HCS12 单片机; CCD
中图分类号: TP212. 9
文献标识码: A
Design of Smartcar. s HCS12 MCU Control System Based on CCD Image Recognition
1 检测前瞻距离远 2 检测范围宽
3 检测道路参数多 4 占用 M CU 端口 资源少
1 电路相对设计复杂 2 检测信息更新速度慢 3 软件处理数据较多
2 主要电路模块设计
2. 1 CCD 路径识别电路
摄像 头的 主要 工作 原理 是[ 2] : 按一 定 的分 辨 率, 以隔行扫描的方式采样图像上的点, 当扫描到某 点时, 就通过图像传感芯片将该点处图像的灰度转 换成与灰度成一一对应关系的电压值, 然后将此电 压值通过视频信号端输出. 具体参见图 1. 当摄像头 扫描完一行, 视频信号端就输出有一个电压/ 凹槽0, 并保持一段时间, 此/ 凹槽0叫做行同步脉冲, 它是扫 描换行的标志. 然后, 跳过一行后, 开始扫描新的一 行, 如此下去, 直到扫描完该场的视频信号, 接着就 会出现一段场消隐区. 在这若干个消隐脉冲中, 有个 脉冲远宽于其他的消隐脉冲, 该消隐脉冲即称为场 同步脉冲, 它是扫描换 场的标志. 摄像头每秒 扫描 25 幅图像, 每幅又分奇、偶 2 场, 先奇场后偶场, 故 每秒扫描 50 场图像. 即扫描周期为 20 ms.

飞思卡尔智能车程序代码

飞思卡尔智能车程序代码
#define sciflag 1;
#define flag 1;
extern uchar cflag;
extern int i,j,m,n;
extern byte cs[40][60];
/*-----------------------*/
/*-------初始化----------*/
void InputInit(){
#pragma TRAP_PROC
void IRQ_ISR()
{
TIE_C1I=1; ;
//DDRB=0XFF;
//PORTB=0XF0;
//while(1);
i=0;
j=0;
}
#pragma CODE_SEG DEFAULT
#pragma CODE_SEG NON_BANKED
#pragma TRAP_PROC
TIE_C1I=0 ; //channel 0 interrupt DISable
TIOS_IOS1=0 ; //channel 0 input capture
TCTL4_EDG1A=1;
TCTL4_EDG1B=0;
}
/*-----------------------*/
/*--中断初始化--------------------*/
void init_IRQ() {
INTCR_IRQE=1; // IRQ select edge sensitive only
INTCR_IRQEN=1; // external IRQ enable
}
/*------ADT初始化--------------*/
void ADCInit(void)
void linenihe(void);

飞思卡尔智能车完整程序

飞思卡尔智能车完整程序

#include <hidef.h> /* common defines and macros */#include <mc9s12dg128.h> /* derivative information */ #include "lib.c"#include "funtion.h"#pragma LINK_INFO DERIV ATIVE "mc9s12dg128b"void s_ini(void) //系统初始化{uchar tmp;SYNR=3;REFDV=1;PLLCTL=0x50;delay(100);CLKSEL|=0x80; //超频到48M, 总线24M// INITRG = 0x00; /* lock registers block to 0x0000 */// INITRM = 0x39; /* lock Ram to end at 0x3FFF */// INITEE = 0x09; /* lock EEPROM block to end at 0x0fff */ delay(100);PORTB=0xff;DDRB=0xff;DDRA=0x00; //A口设置为输入PTH=0x00;DDRH=0x68; //PH1=inputPERH=0x97; //enable pullPPSH=0x80; //PH7,PH6,PH5 pull up, PH4 pull down PIEH=0x00; //使能遥控中断PH7PTP =0x00;DDRP=0x30; //PP4,PP5 outputDDRA=0x00;PUCR=0x01; //Port A enable pull upPTJ=0x00;DDRJ=0x00;PERJ=0x00; //diable pullPPSJ=0x80;PIEJ=0xc0; //enable PJ interruptPTT=0x00;DDRT=0x00; //PT7-PT4 =inputPERT=0x40; //enable pull for PT6// PACN3=0x00;// PACN2=0x00;// PACTL=0x40; //enable pulse couter B// DL YCT=0x00; //TIOS=0x80; //ch 7 compare modeOC7M=0x00;OC7D=0x00;// PACTL=0x74;TSCR2=0x0f; //when ch7 compare rst pre div =128 TC7=50000; //timer for 200mS //*/TSCR1=0x80; //enable timerTCTL1=0x00;TCTL2=0x00;TCTL3=0x20;TCTL4=0x00; //通道6下降沿输入捕捉TIE =0xC0; //中断使能ini_at45(); //初始化SPI0PWME=0xc3; //enable ch1, ch7PWMPOL=0xc3; //high level effectPWMDTY6=(uchar)(3000>>8);PWMDTY7=(uchar)(3000&0x00ff); //占空比PWMPER6=(uchar)(40000>>8); // 舵机PWMPER7=(uchar)(40000&0x00ff); //周期PWMDTY0=(uchar)(0>>8);PWMDTY1=(uchar)(0&0x00ff); //占空比// PWMPER0=(uchar)(2000>>8); //电机PWMPER1=(uchar)(2000&0x00ff); //周期PWMCLK=0x00;PWMPRCLK=0x40; //SB=Fck/1 SA=Fck/8PWMCTL=0x90; //4_16 bit PWM //*/SCI0BDH=0; //串口0初始化SCI0BDL=35; //set bandrate=57600bpsSCI0CR1=0x00;SCI0CR2=0x2c; //enable to sent and receivetmp=SCI0SR1;A TD0CTL2=0xc0; //enable ATD, interruptA TD0CTL3=0x08;A TD0CTL4=0x80; //8bit,A TD1CTL2=0xc0; //enable ATD, interruptA TD1CTL3=0x08;A TD1CTL4=0x80; //8bit,A TD0DIEN=0x00; //AD口数字输入使能,使能CCD输入A TD1DIEN=0x80; //CCD二元输入ECLKDIV=0x5C; //EEPROM时钟分频器INTCR=0xc0; //行同步中断, 下降沿触发,delay(10);SE_s; //舵机供电}interrupt 20 void sci0(void) //SCI0 interrupt{uchar sta,das;sta=SCI0SR1; //read the statedas=SCI0DRL;if(sta&0x40) //sent finish{}if(sta&0x20) //receve a data{speed(das*8);SCI0DRL=das;}}interrupt 15 void ch7(void) //ch7 interrupt 266mS {TFLG1=0x80; //clr flagif(m_en) //LED falshPORTB^=0xf0;}void choice(void) //choice a funtion{uchar kv;uchar pp=0;uchar tmp=0;V1: kv=0;wu(CN1[0],CN1[1],CN1[2],CN1[3]); //displayset(2);go(0,pp); //flashfor(;;) //loop{kv=key();if(kv==5&&pp) //lastpp--,go(0,pp);else if(kv==6&&pp<3) //nextpp++,go(0,pp);if(kv==8||kv==10) //enter{if(pp==0) //进入比赛{match();goto V1;}else if(pp==1) //传感受器测方式{text();goto V1;}else if(pp==2) //CCD 测试{t_ccd();goto V1;}else if(pp==3) //参数设定{setting();goto V1;}} //*/}}void main(void) {/* put your own code here */volatile uint t1=0;s_ini(); //系统初始化EnableInterrupts;get_s(); //获取设定参数choice(); //shoicefor(;;) {} /* wait forever *//* please make sure that you never leave this function */ }/****************************************************************************** FILE : datapage.cPURPOSE : paged data access runtime routinesMACHINE : Freescale 68HC12 (Target)LANGUAGE : ANSI-CHISTORY : 21.7.96 first version created******************************************************************************/#include "hidef.h"#include "non_bank.sgm"#include "runtime.sgm"#ifndef __HCS12X__ /* it's different for the HCS12X. See the text below at the #else // __HCS12X__ *//*According to the -Cp option of the compiler the__DPAGE__, __PPAGE__ and __EPAGE__ macros are defined.If none of them is given as argument, then no page accesses should occur andthis runtime routine should not be used !To be on the save side, the runtime routines are created anyway.If some of the -Cp options are given an adapted versions which only covers theneeded cases is produced.*//* if no compiler option -Cp is given, it is assumed that all possible are given : *//* Compile with option -DHCS12 to activate this code */#if defined(HCS12) || defined(_HCS12) || defined(__HCS12__) /* HCS12 family has PPAGE register only at 0x30 */#define PPAGE_ADDR (0x30+REGISTER_BASE)#ifndef __PPAGE__ /* may be set already by option -CPPPAGE */#define __PPAGE__#endif/* Compile with option -DDG128 to activate this code */#elif defined DG128 /* HC912DG128 derivative has PPAGE register only at 0xFF */#define PPAGE_ADDR (0xFF+REGISTER_BASE)#ifndef __PPAGE__ /* may be set already by option -CPPPAGE */#define __PPAGE__#endif#elif defined(HC812A4)/* all setting default to A4 already */#endif#if !defined(__EPAGE__) && !defined(__PPAGE__) && !defined(__DPAGE__)/* as default use all page registers */#define __DPAGE__#define __EPAGE__#define __PPAGE__#endif/* modify the following defines to your memory configuration */#define EPAGE_LOW_BOUND 0x400u#define EPAGE_HIGH_BOUND 0x7ffu#define DPAGE_LOW_BOUND 0x7000u#define DPAGE_HIGH_BOUND 0x7fffu#define PPAGE_LOW_BOUND (DPAGE_HIGH_BOUND+1)#define PPAGE_HIGH_BOUND 0xBFFFu#define REGISTER_BASE 0x0u#ifndef DPAGE_ADDR#define DPAGE_ADDR (0x34u+REGISTER_BASE)#endif#ifndef EPAGE_ADDR#define EPAGE_ADDR (0x36u+REGISTER_BASE)#endif#ifndef PPAGE_ADDR#define PPAGE_ADDR (0x35u+REGISTER_BASE)#endif/*The following parts about the defines are assumed in the code of _GET_PAGE_REG :- the memory region controlled by DPAGE is above the area controlled by the EPAGE andbelow the area controlled by the PPAGE.- the lower bound of the PPAGE area is equal to be the higher bound of the DPAGE area + 1*/#if EPAGE_LOW_BOUND >= EPAGE_HIGH_BOUND || EPAGE_HIGH_BOUND >= DPAGE_LOW_BOUND || DPAGE_LOW_BOUND >= DPAGE_HIGH_BOUND || DPAGE_HIGH_BOUND >= PPAGE_LOW_BOUND || PPAGE_LOW_BOUND >= PPAGE_HIGH_BOUND#error /* please adapt _GET_PAGE_REG for this non default page configuration */#endif#if DPAGE_HIGH_BOUND+1 != PPAGE_LOW_BOUND#error /* please adapt _GET_PAGE_REG for this non default page configuration */#endif/* this module does either control if any access is in the bounds of the specified page or *//* ,if only one page is specified, just use this page. *//* This behavior is controlled by the define USE_SEVERAL_PAGES. *//* If !USE_SEVERAL_PAGES does increase the performance significantly *//* NOTE : When !USE_SEVERAL_PAGES, the page is also set for accesses outside of the area controlled *//* by this single page. But this is should not cause problems because the page is restored to the old value before any other access could occur */#if !defined(__DPAGE__) && !defined(__EPAGE__) && !defined(__PPAGE__)/* no page at all is specified *//* only specifying the right pages will speed up these functions a lot */#define USE_SEVERAL_PAGES 1#elif defined(__DPAGE__) && defined(__EPAGE__) || defined(__DPAGE__) && defined(__PPAGE__) || defined(__EPAGE__) && defined(__PPAGE__)/* more than one page register is used */#define USE_SEVERAL_PAGES 1#else#define USE_SEVERAL_PAGES 0#if defined(__DPAGE__) /* check which pages are used */#define PAGE_ADDR PPAGE_ADDR#elif defined(__EPAGE__)#define PAGE_ADDR EPAGE_ADDR#elif defined(__PPAGE__)#define PAGE_ADDR PPAGE_ADDR#else /* we do not know which page, decide it at runtime */#error /* must not happen */#endif#endif#if USE_SEVERAL_PAGES /* only needed for several pages support *//*--------------------------- _GET_PAGE_REG --------------------------------Runtime routine to detect the right register depending on the 16 bit offset partof an address.This function is only used by the functions below.Depending on the compiler options -Cp different versions of _GET_PAGE_REG are produced.Arguments :- Y : offset part of an addressResult :if address Y is controlled by a page register :- X : address of page register if Y is controlled by an page register- Zero flag cleared- all other registers remain unchangedif address Y is not controlled by a page register :- Zero flag is set- all registers remain unchanged--------------------------- _GET_PAGE_REG ----------------------------------*/#if defined(__DPAGE__)#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEstatic void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */__asm {L_DPAGE:CPY #DPAGE_LOW_BOUND ;// test of lower bound of DPAGE#if defined(__EPAGE__)BLO L_EPAGE ;// EPAGE accesses are possible#elseBLO L_NOPAGE ;// no paged memory below accesses#endifCPY #DPAGE_HIGH_BOUND ;// test of higher bound DPAGE/lower bound PPAGE#if defined(__PPAGE__)BHI L_PPAGE ;// EPAGE accesses are possible#elseBHI L_NOPAGE ;// no paged memory above accesses#endifFOUND_DPAGE:LDX #DPAGE_ADDR ;// load page register address and clear zero flagRTS#if defined(__PPAGE__)L_PPAGE:CPY #PPAGE_HIGH_BOUND ;// test of higher bound of PPAGEBHI L_NOPAGEFOUND_PPAGE:LDX #PPAGE_ADDR ;// load page register address and clear zero flagRTS#endif#if defined(__EPAGE__)L_EPAGE:CPY #EPAGE_LOW_BOUND ;// test of lower bound of EPAGEBLO L_NOPAGECPY #EPAGE_HIGH_BOUND ;// test of higher bound of EPAGEBHI L_NOPAGEFOUND_EPAGE:LDX #EPAGE_ADDR ;// load page register address and clear zero flagRTS#endifL_NOPAGE:ORCC #0x04 ;// sets zero flagRTS}}#else /* !defined(__DPAGE__) */#if defined( __PPAGE__ )#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEstatic void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */__asm {L_PPAGE:CPY #PPAGE_LOW_BOUND ;// test of lower bound of PPAGE#if defined( __EPAGE__ )BLO L_EPAGE#elseBLO L_NOPAGE ;// no paged memory below#endifCPY #PPAGE_HIGH_BOUND ;// test of higher bound PPAGEBHI L_NOPAGEFOUND_PPAGE:LDX #PPAGE_ADDR ;// load page register address and clear zero flagRTS#if defined( __EPAGE__ )L_EPAGE:CPY #EPAGE_LOW_BOUND ;// test of lower bound of EPAGEBLO L_NOPAGECPY #EPAGE_HIGH_BOUND ;// test of higher bound of EPAGEBHI L_NOPAGEFOUND_EPAGE:LDX #EPAGE_ADDR ;// load page register address and clear zero flagRTS#endifL_NOPAGE: ;// not in any allowed page area;// its a far access to a non paged variableORCC #0x04 ;// sets zero flagRTS}}#else /* !defined(__DPAGE__ ) && !defined( __PPAGE__) */#if defined(__EPAGE__)#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEstatic void NEAR _GET_PAGE_REG(void) { /*lint -esym(528, _GET_PAGE_REG) used in asm code */__asm {L_EPAGE:CPY #EPAGE_LOW_BOUND ;// test of lower bound of EPAGEBLO L_NOPAGECPY #EPAGE_HIGH_BOUND ;// test of higher bound of EPAGEBHI L_NOPAGEFOUND_EPAGE:LDX #EPAGE_ADDR ;// load page register address and clear zero flagRTSL_NOPAGE: ;// not in any allowed page area;// its a far access to a non paged variableORCC #0x04 ;// sets zero flagRTS}}#endif /* defined(__EPAGE__) */#endif /* defined(__PPAGE__) */#endif /* defined(__DPAGE__) */#endif /* USE_SEVERAL_PAGES *//*--------------------------- _SET_PAGE --------------------------------Runtime routine to set the right page register. This routine is used if the compilerdoes not know the right page register, i.e. if the option -Cp is used for more thanone pageregister or if the runtime option is used for one of the -Cp options.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- page part written into the correct page register.- the old page register content is destroyed- all processor registers remains unchanged--------------------------- _SET_PAGE ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _SET_PAGE(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGESTAB 0,X ;// set page registerL_NOPAGE:PULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {STAB PAGE_ADDR ;// set page registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_8 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- value to be read in the B register- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_8 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_8(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHA ;// save A registerLDAA 0,X ;// save page registerSTAB 0,X ;// set page registerLDAB 0,Y ;// actual load, overwrites pageSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:LDAB 0,Y ;// actual load, overwrites pagePULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerLDAB 0,Y ;// actual load, overwrites pageSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_16 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- value to be read in the Y register- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_16 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_16(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHA ;// save A registerLDAA 0,X ;// save page registerSTAB 0,X ;// set page registerLDY 0,Y ;// actual load, overwrites addressSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:LDY 0,Y ;// actual load, overwrites addressPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerLDY 0,Y ;// actual load, overwrites addressSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_24 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument. Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- value to be read in the Y:B registers- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_24 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_24(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHA ;// save A registerLDAA 0,X ;// save page registerSTAB 0,X ;// set page registerLDAB 0,Y ;// actual load, overwrites page of addressLDY 1,Y ;// actual load, overwrites offset of addressSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:LDAB 0,Y ;// actual load, overwrites page of addressLDY 1,Y ;// actual load, overwrites offset of addressPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerLDAB 0,Y ;// actual load, overwrites page of addressLDY 1,Y ;// actual load, overwrites offset of addressSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _LOAD_FAR_32 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B registerResult :- low 16 bit of value to be read in the D registers- high 16 bit of value to be read in the Y registers- all other registers remains unchanged- all page register still contain the same value--------------------------- _LOAD_FAR_32 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _LOAD_FAR_32(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGELDAA 0,X ;// save page registerPSHA ;// put it onto the stackSTAB 0,X ;// set page registerLDD 2,Y ;// actual load, low wordLDY 0,Y ;// actual load, high wordMOVB 1,SP+,0,X ;// restore page registerPULX ;// restore X registerRTSL_NOPAGE:LDD 2,Y ;// actual load, low wordLDY 0,Y ;// actual load, high wordPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {LDAA PAGE_ADDR ;// save page registerPSHA ;// put it onto the stackSTAB PAGE_ADDR ;// set page registerLDD 2,Y ;// actual load, low wordLDY 0,Y ;// actual load, high wordMOVB 1,SP+,PAGE_ADDR ;// restore page registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_8 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B register- value to be stored in the B registerResult :- value stored at the address- all registers remains unchanged- all page register still contain the same value--------------------------- _STORE_FAR_8 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_8(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHB ;// save B registerLDAB 0,X ;// save page registerMOVB 0,SP, 0,X ;// set page registerSTAA 0,Y ;// store the value passed in ASTAB 0,X ;// restore page registerPULB ;// restore B registerPULX ;// restore X registerRTSL_NOPAGE:STAA 0,Y ;// store the value passed in APULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHB ;// save A registerLDAB PAGE_ADDR ;// save page registerMOVB 0,SP,PAGE_ADDR ;// set page registerSTAA 0,Y ;// store the value passed in ASTAB PAGE_ADDR ;// restore page registerPULB ;// restore B registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_16 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B register- value to be stored in the X registerResult :- value stored at the address- all registers remains unchanged- all page register still contain the same value--------------------------- _STORE_FAR_16 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_16(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHALDAA 0,X ;// save page registerSTAB 0,X ;// set page registerMOVW 1,SP,0,Y ;// store the value passed in XSTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:STX 0,Y ;// store the value passed in XPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerSTX 0,Y ;// store the value passed in XSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_24 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address in the B register- value to be stored in the X:A registers (X : low 16 bit, A : high 8 bit)Result :- value stored at the address- all registers remains unchanged- all page register still contain the same value--------------------------- _STORE_FAR_24 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_24(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHALDAA 0,X ;// save page registerSTAB 0,X ;// set page registerMOVW 1,SP, 1,Y ;// store the value passed in XMOVB 0,SP, 0,Y ;// store the value passed in ASTAA 0,X ;// restore page registerPULA ;// restore A registerPULX ;// restore X registerRTSL_NOPAGE:STX 1,Y ;// store the value passed in XSTAA 0,Y ;// store the value passed in XPULX ;// restore X registerRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHA ;// save A registerLDAA PAGE_ADDR ;// save page registerSTAB PAGE_ADDR ;// set page registerMOVB 0,SP, 0,Y ;// store the value passed in ASTX 1,Y ;// store the value passed in XSTAA PAGE_ADDR ;// restore page registerPULA ;// restore A registerRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _STORE_FAR_32 --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of an address in the Y register- page part of an address is on the stack at 3,SP (just below the return address)- value to be stored in the X:D registers (D : low 16 bit, X : high 16 bit)Result :- value stored at the address- all registers remains unchanged- the page part is removed from the stack- all page register still contain the same value--------------------------- _STORE_FAR_32 ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _STORE_FAR_32(void) {#if USE_SEVERAL_PAGES__asm {PSHX ;// save X register__PIC_JSR(_GET_PAGE_REG)BEQ L_NOPAGEPSHDLDAA 0,X ;// save page registerMOVB 6,SP, 0,X ;// set page registerMOVW 2,SP, 0,Y ;// store the value passed in X (high word)MOVW 0,SP, 2,Y ;// store the value passed in D (low word)STAA 0,X ;// restore page registerPULD ;// restore A registerBRA doneL_NOPAGE:MOVW 0,SP, 0,Y ;// store the value passed in X (high word)STD 2,Y ;// store the value passed in D (low word) done:PULX ;// restore X registerMOVW 0,SP, 1,+SP ;// move return addressRTS}#else /* USE_SEVERAL_PAGES */__asm {PSHD ;// save D registerLDAA PAGE_ADDR ;// save page registerLDAB 4,SP ;// load page part of addressSTAB PAGE_ADDR ;// set page registerSTX 0,Y ;// store the value passed in XMOVW 0,SP, 2,Y ;// store the value passed in D (low word)STAA PAGE_ADDR ;// restore page registerPULD ;// restore D registerMOVW 0,SP, 1,+SP ;// move return addressRTS}#endif /* USE_SEVERAL_PAGES */}/*--------------------------- _FAR_COPY_RC --------------------------------This runtime routine is used to access paged memory via a runtime function.It may also be used if the compiler option -Cp is not used with the runtime argument.Arguments :- offset part of the source int the X register- page part of the source in the A register- offset part of the dest int the Y register- page part of the dest in the B register- number of bytes to be copied is defined by the next 2 bytes after the return address.Result :- memory area copied- no registers are saved, i.e. all registers may be destroyed- all page register still contain the same value as before the call- the function returns after the constant defining the number of bytes to be copiedstack-structure at the loop-label:0,SP : destination offset2,SP : source page3,SP : destination page4,SP : source offset6,SP : points to length to be copied. This function returns after the sizeA usual call to this function looks like:struct Huge src, dest;; ...LDX #srcLDAA #PAGE(src)LDY #destLDAB #PAGE(dest)JSR _FAR_COPY_RCDC.W sizeof(struct Huge); ...--------------------------- _FAR_COPY_RC ----------------------------------*/#ifdef __cplusplusextern "C"#endif#pragma NO_ENTRY#pragma NO_EXIT#pragma NO_FRAMEvoid NEAR _FAR_COPY_RC(void) {#if USE_SEVERAL_PAGES__asm {DEX ;// source addr-=1, because loop counter ends at 1PSHX ;// save source offsetPSHD ;// save both pagesDEY ;// destination addr-=1, because loop counter ends at 1PSHY ;// save destination offsetLDY 6,SP ;// Load Return addressLDX 2,Y+ ;// Load Size to copySTY 6,SP ;// Store adjusted return addressloop:LDD 4,SP ;// load source offset。

飞思卡尔智能车简介

飞思卡尔智能车简介

智能车制作F R E E S C A L E学院:信息工程学院班级:电气工程及其自动化132 学号:6101113078姓名:李瑞欣目录:1. 整体概述2.单片机介绍3.C语言4.智能车队的三个组5.我对这门课的建议一、整体概述智能车的制作过程包括理论设计、实际制作、整车调试、现场比赛等环节,要求学生组成团队,协同工作。

内容涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多学科多专业。

下面是一个智能车的模块分布:总的来说智能车有六大模块:信号输入模块、控制输出模块、数据处理模块、信息显示模块、信息发送模块、异常处理模块。

1、信号输入模块:智能车通过传感器获知赛道上的路况信息(直道,弯道,山坡,障碍物等),同时也通过传感器获取智能车自身的信息(车速,电磁电量等)。

这些数据构成了智能车软件系统(大脑)的信息来源,软件系统依靠这些数据,改变智能车的运行状态,保证其在最短的时间内按照规定跑完整个赛道。

2、控制输出模块:智能车在赛道上依靠转向机构(舵机)和动力机构(电机)来控制运行状态,这也是智能车最主要的模块,这个模块的好坏直接决定了你的比赛成绩。

电机和舵机都是通过PWM控制的,因此我们的软件系统需要根据已有的信息进行分析计算得到一个合适的输出数据(占空比)来控制电机和舵机。

3数据处理模块:主要是对电感、编码器、干簧管的数据处理。

信号输入模块得到的数据非常原始,有杂波。

基本上是不能直接用来计算的。

因此需要有信号处理模块对采集的数据进行处理,得到可用的数据。

4信息显示模块:智能车调试过程中,用显示器来显示智能车的部分信息,判断智能车是否正常运行。

正式比赛过程中可关闭。

主流的显示器有:Nokia 5110 ,OLED模块等,需要进行驱动移植。

5信息发送模块智能车的调试过程中,我们需要观察智能车的实时状态(采集的信号是否正常,输出是否正常),这个时候就需要用到信息发送模块,将智能车运行时的数据发送到电脑上就行分析处理。

北航计控实验--飞思卡尔小车实验报告

北航计控实验--飞思卡尔小车实验报告

成绩《计算机测控系统》实验报告院(系)名称自动化科学与电气工程学院专业名称自动化学生学号学生姓名指导教师董韶鹏2018年06月同组同学实验编号03组一、实验目的1.了解计算机控制系统的基本构成和具体实现方法。

2.学会使用IAR软件的基本功能,掌握K60单片机的开发和应用过程。

3.学会智能小车实验系统上各个模块的使用,掌握其工作原理。

二、实验内容1、了解各模块工作原理,通过在IAR环境编程,实现和演示各个模块的功能。

2、编写程序组合各个模块的功能,让小车能够沿着赛道自行行使。

三、实验原理小车的主板如下图所示:主板上包括Freescale MK60DN512ZVLQ10核心板,J-Link下载调试接口,编码器接口,电机驱动接口,舵机接口,CCD结构等主要功能模块接口,无线模块接口,蓝牙模块接口,OLED接口等主要功能模块和相应的辅助按键和电路。

在本次实验中我们主要使用的接口为编码器接口,CCD接口,舵机接口,电机驱动接口,OLED接口来控制小车运行,采用7.2V电池为系统供电。

我们采用512线mini 编码器来构成速度闭环控制,采用OV7725来进行赛道扫描,将得到的图像二值化,提取赛道信息,并以此控制舵机来进行转向。

四、实验步骤4.1车架及各模块安装4.1.1小车整体车架结构车模的整体结构如上图所示,包含地盘,电机等,为单电机驱动四轮车。

车模为但电机驱动,电机安装位置如下:4.1.2摄像头的固定和安装摄像头作为最重要的传感器,它的固定和安装对小车的影响是十分巨大的,摄像头的布局和安装取决于系统方案,反过来又会影响系统的稳定性与可靠性以及软件的编写。

我们的车模为四轮车,所以摄像头架在车子的中间部分,介于电池和舵机之间,这样节省空间而且也不会让重心偏移太大,而摄像头的角度也很有讲究,角度低的时候能看到很远的赛道信息,但是图像较为模糊,不适合图像处理的编写,角度较高是,能看到的图像信息较少,但是分辨率明显更好,在程序的编写中,我们发现摄像头视野的宽广往往直接影响赛道信息提取的精准度。

【精品】飞思卡尔全国大学生智能车竞赛杭州电子科技大学创意赛

【精品】飞思卡尔全国大学生智能车竞赛杭州电子科技大学创意赛

第四届“飞思卡尔"杯全国大学生智能汽车竞赛作品简介物流货物自主调度车本作品采用MC9S12XS128作为主控单元,模拟现代物流业,实现货物自主运输管理。

作品主要功能包括:根据预先设定的步骤,有效的完成“找货物”、“搬运货物”、“放置货物"三大步骤。

系统在运行过程中只需要接收一次“计划表”,货物搬运模块则根据上位机的调度命令自动完成对货物的操作.在系统的运行期间实现安全、稳定、有效,是该系统所追求的目标。

一、作品实现方案作品主要包括:货物识别模块、货物搬运模块及仓库调度管理PC端上位机等。

图1即为物流货物自主调度车的主要系统组成。

图1作品系统组成其中PC端上位机由QT程序编写,采用无线串口与车载系统进行通信。

PC端上位机将反馈的数据显示与PC端上,并根据预先设定的步骤程序向搬运模块下达命令。

1)货物识别模块实现思路货物识别模块采用CCD摄像头(图2)作为传感器识别货物.此CCD摄像头传感器模块既作为路径识别传感器,又作为货物识别模块的条形码传感器.货物识别模块根据CCD采集类条形码数据通过无线传输向上位机数据库查询该货物需要处理的情况。

查询完毕,由上位机的无线传输模块再次向搬运模块发送指令。

搬运模块接收上位机的调度,自动拾取货物,并根据预定的路径搬运货物到指定地点。

图2CCD摄像头2)货物搬运模块实现思路货物搬运系统主要实现运输车自动寻线及自动定位功能。

为了使搬运模块更加容易调整姿态,即让搬运模块有很好的转向能力,我们选择了二驱差速车作为搬运动力模块。

图3和图4为两种不同的二驱差速车的车体,两辆车协调工作实现货物顺利搬运到指定位置,图3车体自动找到所需货物后,通过自制升降平台将货物托起,并运送到指定地点A;图4车体推动该货物到指定地点B。

二驱差速车可以达到绕车体中心轴作360度大旋转,因为不需要使用舵机转向,大大降低了车体的控制成本,却没有降低车体的转向能力.图3搬运模块使用的车体之一图4搬运模块使用的车体之二3)上位机实现思路上位机软件采用QT软件设计界面调试终端,主要包括无线串口调试窗体和参数设置窗体。

飞思卡尔智能车各模块原理及元器件

飞思卡尔智能车各模块原理及元器件

飞思卡尔智能车各模块原理及元器件在准备比赛的过程中,我们小组成员经过分析讨论,对智能车各模块的元器件使用方面做如下说明:1、传感器模块:路径识别模块是智能车系统的关键模块之一,目前能够用于智能车辆路径识别的传感器主要有光电传感器和CCD/CMOS传感器。

光电传感器寻迹方案的优点是电路简单、信号处理速度快,但是其前瞻距离有限;CCD 摄像头寻迹方案的优点则是可以更远更早地感知赛道的变化,但是信号处理却比较复杂,如何对摄像头记录的图像进行处理和识别,加快处理速度是摄像头方案的难点之一。

在比较了两种传感器优劣之后,考虑到CCD传感器图像处理的困难后,决定选用应用广泛的光电传感器,相信通过选用大前瞻的光电传感器,加之精简的程序控制和较快的信息处理速度,光电传感器还是可以极好的控制效果的,我们使用11个TK-20型号的光电传感器。

2、驱动模块:驱动电路的性能很大程度上影响整个系统的工作性能。

电机驱动电路可以用MC33886驱动芯片或者用MOS管搭建H桥驱动电路。

MC33886体积小巧,使用简单,但由于是贴片的封装,散热面积比较小,长时间大电流工作时,温升较高,如果长时间工作必须外加散热器,而且MC33886的工作内阻比较大,又有高温保护回路,使用不方便。

采用MOS管构成的H桥电路,控制直流电机紧急制动。

用单片机控制MOS管使之工作在占空比可调的开关状态,精确调整电动机转速。

这种电路由于MOS管工作在饱和截止状态,而且还可以选择内阻很小的MOS管,所以效率可以非常高,并且H桥电路可以快速实现转速和方向控制。

MOS管开关速度高,所以非常适合采用PWM调制技术。

所以我们选择了用MOS管搭建H桥驱动电路。

3、电源模块:比赛使用智能车竞赛统一配发的标准车模用7.2V 供电,而单片机系统、路径识别的光电传感器、光电码编码器等均需要5V电源,伺服电机工作电压范围4V到6V(为提高伺服电机响应速度,采用7.2V 供电),直流电机可以使用7.2V 蓄电池直接供电,我们采用的电源有串联型线性稳压电源(LM2940、7805等)和开关型稳压电源(LM2596)两大类。

飞思卡尔智能车摄像头组入门指南

飞思卡尔智能车摄像头组入门指南

飞思卡尔智能车摄像头组入门指南摄像头摄像头的组成主要分为三部分:镜头、含传感器的处理芯片、外围电路板。

镜头主要就是一个凸透镜,透镜焦距越小越广角,同时桶形失真越严重;焦距越大,视角越窄,透镜越接近理想的“薄透镜”则可忽略桶形失真。

处理芯片将传感器上的电压信号按照已定义的协议输出。

外围电路主要提供电源、稳压、时钟等功能。

摄像头按照信号类型可分为模拟摄像头、数字摄像头两种。

由于单片机普通IO口只能读取数字信号,故对于模拟摄像头要设计模数转换(ATD)。

数字摄像头数据可以直接进单片机。

用模拟摄像头的缺点是要自己设计模数转换电路,同步信号分离电路。

优点是可以自行加入硬件二值化电路,即对某一个像素点只用1、0来表示黑、白。

摄像头按照传感器,可分为CCD、CMOS。

CCD成像质量好,贵。

CMOS 成像质量略差,便宜。

摄像头的选取从尽快实现,缩短开发时间的方面考虑,应购买数字摄像头。

典型的型号是OV7620(该型号是指处理芯片的型号)。

OV7620是CMOS数字摄像头,采用PAL制式,默认隔行扫描,默认YUV颜色空间输出(详见后文)。

长远考虑,应选取CCD模拟摄像头。

一来可以避免高速状态下的运动模糊,二来可以自行设计硬件二值化电路,FIFO电路等,大大降低CPU 运算压力。

摄像头信号协议介绍每秒超过24帧的连续图片即可形成动态的视频。

考虑到我国采用50Hz交流电,为了实现方便,摄像头被设计为每秒25帧,每帧耗时两个周期。

还是为了实现方便,每一帧图片被分为两半,每半帧耗时一个周期。

半帧的划分方式为:奇数行和偶数行各组成半帧。

即通常的电视机,每20ms奇数行的信息刷新一次,接下来20ms偶数行刷新一次,再20ms奇数行刷新一次……。

欧美采用60Hz交流电,摄像头每16.6ms刷新一次,被称为PAL制式。

摄像头拍摄的一帧画面被称为“一场”(field),一场又分为“奇场”和“偶场”,各称“半场”,合称“全场”。

像这样分奇偶场分别刷新的扫描方式被称作“隔行扫描”(interlace),某些摄像头支持“逐行扫描”(progressive),其意自见。

飞思卡尔智能车黑线提取算法与行驶控制

飞思卡尔智能车黑线提取算法与行驶控制

飞思卡尔智能车黑线提取算法与行驶控制(摄像头组)引言按照第一届全国大学生“飞思卡尔”智能车大赛比赛规则要求:使用大赛组委会统一提供的竞赛车模,采用飞思卡尔16位微控制器MC9S12DG128作为核心控制单元,自主构思控制方案及系统设计,包括传感器信号采集处理、控制算法及执行、动力电机驱动、转向舵机控制等,以比赛完成时间短者为优胜者。

其中赛道为在白色底板上铺设黑色引导线。

根据赛道特点,主要有两种寻线设计方案:。

本文是在摄像头方案的实时图像数据已经获得的基础上,对图像进行数据处理,提取赛道中的引导黑线位置,从而以此作为舵机和驱动电机的控制依据。

图像数据信息特点摄像头的主要工作原理是:按一定的分辨率,以隔行扫描的方式采集图像上的点,当扫描到某点时,就通过图像传感芯片将该点处图像的灰度转换成与灰度成一一对应关系的电压值,然后将此电压值通过视频信号端输出。

具体而言(参见图1),摄像头连续地扫描图像上的一行,则输出就是一段连续的电压视频信号,该电压信号的高低起伏正反映了该行图像的灰度变化情况。

当扫描完一行,视频信号端就输出低于最低视频信号电压的电平(如0.3V),并保持一段时间。

这样相当于,紧接着每行图像对应的电压信号之后会有一个电压“凹槽”,此“凹槽”叫做行同步脉冲,它是扫描换行的标志。

然后,跳过一行后(因为摄像头是隔行扫描的方式),开始扫描新的一行,如此下去,直到扫描完该场的视频信号,接着就会出现一段场消隐区。

此区中有若干个复合消隐脉冲(简称消隐脉冲),在这些消隐脉冲中,有个脉冲,它远宽于(即持续时间长于)其他的消隐脉冲,该消隐脉冲又称为场同步脉冲,它是扫描换场的标志。

场同步脉冲标志着新的一场的到来,不过,场消隐区恰好跨在上一场的结尾部分和下一场的开始部分,得等场消隐区过去,下一场的视频信号才真正到来。

摄像头每秒扫描25幅图像,每幅又分奇、偶两场,先奇场后偶场,故每秒扫描50场图像。

奇场时只扫描图像中的奇数行,偶场时则只扫描偶数行。

EN-FSROB 飞思卡尔智能车各模块调试指南

EN-FSROB 飞思卡尔智能车各模块调试指南

EN-FSROB飞思卡尔智能车各模块调试指南1、下载Motor文件夹下面的程序,测试电机驱动模块,系统控制底板:蜂鸣器、按键、OLED 接口及XS128最小系统;步骤:(1)连线:系统底板P11插针P7、P5、P3、P1/2接电机驱动模块的排针7、5、3、1/2;(2)连接电机,调节4、3按键,可发现电机转速及转向发生变化;(3)分别按下1、2按键,可关闭、打开蜂鸣器,并可观察OLED液晶显示数据是否正常;2、下载A_CarTest文件夹下面的程序,测试XS128核心板串口排针及系统控制底板舵机控制电路:步骤:(1)上电,调节电位器,万用表测试P10舵机插接排针的6V、GND引脚电压调整至6V;(2)XS128核心板UART排针通过杜邦线插上蓝牙模块,注意插线顺序;(3)手机安装蓝牙串口测试工具,并打开,通过摇动手机左右晃动可发现舵机旋转;3、CC2500模块测试:1)将T103模块插入电脑,打开《CC2500无线串口数据传输下载软件》文件夹下的下载软件;给T103模块下载程序2)给XS128下载CC2500测试程序;3)插上CC2500模块到底板,把另外一块CC2500模块通过转接座插入到T103模块,并打开串口调试助手,并按照下图进行配置:4)此时,通过串口调试助手发送数据可在底板OLED模块的R_Buff区显示出来发送的数据,然后按下地板上的四个按键中的其中一个,可在OLED模块的S_Buff区显示所按下的按键号并通过CC2500模块传送到串口调试助手;4、CCD测试;1)下载CCD测试程序;2)连接CCD传感器到智能车底板的P3或P4接口;3)电脑安装PL2303驱动,插入USB-TTL小板,并且用杜邦线将USB-TTL小板与XS128核心板连接;4)打开智能车调试助手,按如下方法配置,配置好打开串口可发现数据上传到调试助手上面;5、摄像头测试;1)下载OV7620测试程序;2)正确连接摄像头到底板上的P7OV7620转接接口;3)电脑安装PL2303驱动,插入USB-TTL小板,并且用杜邦线将USB-TTL小板与XS128核心板连接;4)打开智能车调试助手,按如下方法配置,配置好打开串口可发现摄像头所拍照片上传到调试助手上面;6、编码器测试;编码器改装,褐色——VCC;蓝色——GND;白色——IN;。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

************************************************************************************ Test.c* Description: This file includes I/ O function for test, the PWM outputs function for test, function* testing sensors.* (c) Copyright 2006,Zhao Cheng* All Rights Reserved** By : Zhao Cheng* Note : Don't change this file if possible.**********************************************************************************/#include <hidef.h>#include <mc9s12dg128.h>#define HIGHSPEED 8000#define LOWSPEED 11000 /* 速度变量,0-24000 数值越大,速度越慢*/void PWMout(int, int);/* 24000-20000 */void IOtest(void){static unsigned char i=0,j=0x01,k;DDRB = DDRA = 0xFF;PORTB = 0xf0;for(;;){k=(~j)&0x7f;PORTA = PORTB = k; while (TCNT != 0x0000); while (TCNT == 0x0000) {if(i>9){j=j<<1;i=0;}i++;}if(j>=0x80)j=0x01;}}void PWMtest(void) {int counter=-4500;DDRB = 0xff;PORTB = 0xff;TSCR1 = 0x80; /* enable timer TCNT */ TSCR2 = 0x00; /* TCNT prescaler setup */ for(;;){while (TCNT != 0x0000);while (TCNT == 0x0000);counter=counter+30;if(counter >= 3000){counter = 0;PWMout(4500, LOWSPEED);}if(counter == 1500){PWMout(-4500, LOWSPEED);}PORTB = (char)(counter/100);}}void SignalTest(void){unsigned char signal;int Direction, Velocity; Direction = 0;Velocity = LOWSPEED; DDRA = 0x00;DDRB = 0xff;signal = PORTA;PORTB = ~signal;switch(signal){case 0x08: /* 0001 1000 */ case 0x10:Direction = 800;Velocity = HIGHSPEED; break;case 0x04: /* 0010 0100 */ case 0x20:Direction = 1500; Velocity = HIGHSPEED;break;case 0x02: /* 0100 0010 */case 0x40:Direction = 2800;Velocity = HIGHSPEED;break;case 0x01: /* 1000 0001 */case 0x80:Direction = 4000;Velocity = LOWSPEED;break;case 0x3c: /* 0011 1100 over start line */case 0xff: /* 1111 1111 over crossing line */case 0x00: /* 0000 0000 go straight not need changed state */ default:break;}if(signal > 0x0f)Direction = -Direction;PWMout(Direction, LOWSPEED);}/************************************************************************************ * LCD1620.c* ICC-AVR application builder : 2006-1-8 21:43:48* Target : M8* Crystal: 4.0000Mhz** Note : Don't change this file if possible.**********************************************************************************/ #define CMD_CLEAR 0x01#define CMD_RESET 0x02#include <iom8v.h>#include <macros.h>#define LCD_DATA 0xff#define LCD_EN 0x01 //PORTC 0#define LCD_RS 0x02 //PORTC 1#define LCD_RW 0x04 //PORTC 2#define LCD_DATAPORT PORTB#define LCD_ENPORT PORTA#define LCD_RSPORT PORTA#define LCD_RWPORT PORTAvoid lcd_init(void);void lcd_write_cmd(unsigned cmd,unsigned data);void lcd_setxy(unsigned char x,unsigned char y);void lcd_write_string(unsigned char X,unsigned char Y,unsigned char *str); void delay_nus(unsigned int n);void delay_nms(unsigned int n);void lcd_init(void){DDRB |= LCD_DATA;DDRA |= LCD_EN | LCD_RS | LCD_RW;LCD_RWPORT&=~LCD_RW;LCD_DATAPORT=0x30; //控制字规则:5:8bit,4:16x2,3:5x7LCD_ENPORT|=LCD_EN;delay_nus(1);LCD_ENPORT&=~LCD_EN;delay_nus(40);lcd_write_cmd(0,0x38); //8bit testlcd_write_cmd(0,0x0c); //显示开lcd_write_cmd(0,0x01); //显示清屏lcd_write_cmd(0,0x06); //显示光标移动设置}void lcd_write_cmd(unsigned cmd,unsigned data) {if(cmd==0)LCD_RSPORT&=~LCD_RS;elseLCD_RSPORT|=LCD_RS;LCD_DATAPORT&=0x00;LCD_DATAPORT=data;LCD_ENPORT|=LCD_EN;delay_nus(10);LCD_ENPORT&=~LCD_EN;delay_nus(10);}void lcd_setxy(unsigned char x,unsigned char y) {unsigned char addr;if(y==0)addr=x+0x80;elseaddr=x+0xc0;lcd_write_cmd(0,addr);}void lcd_write_string(unsigned char X,unsigned char Y,unsigned char *str) {lcd_setxy(X,Y);while(*str){lcd_write_cmd(1,*str);str++;}}void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}//call this routine to initialize all peripheralsvoid main(void){lcd_init();while(1){lcd_write_cmd(0,0x01); //清屏delay_nms(2);lcd_write_string(0,0,"happy new year");delay_nms(100);lcd_write_string(0,1,"LCD successful!");delay_nms(100);}}/******************************* 程序结束*********************************/。

相关文档
最新文档