文档库 最新最全的文档下载
当前位置:文档库 › 飞思卡尔程序调试技巧

飞思卡尔程序调试技巧

飞思卡尔程序调试技巧
飞思卡尔程序调试技巧

一、前言

调试程序,是软件开发过程中的一个必不可少的环节。这篇帖子,匠人试着来整理一下一些调试的技巧。

说到“技巧”,这个词自从被所长批臭之后,匠人就吓得不敢再提,生怕一不小心就暴露了思想的浅薄和眼光的局限,呵呵。所以咱们不叫“技巧”,干脆低调点,就叫“雕虫小技”吧。

这里所讨论的“调试”技巧,有些是必须结合开发工具本身的功能来实现,而有些可以通过烧录芯片来验证。

各种开发工具,提供的功能多少强弱也不尽相同,这些方法也未必都能套用。仅供参考吧。

最后说明一下,这是没有草稿的帖子,匠人仍然以不定期连载的方式,边写边发边改。可能结构会比较混乱。欢迎大家一起参与讨论。

二、磨刀不误砍柴功

在调试之前,需要掌握以下一些基本功:

1、熟悉当前的开发(调试)环境,比如:设置断点、单步运行、全速运行、终止运行,查看RAM、

查看堆栈、查看IO口状态……总之,要熟练掌握基本操作的方法,并深刻了解其中意义。

2、了解芯片本身的资源和特性。

3、了解一点汇编语言的知识。(本来匠人是准备写“精通”的,但考虑到现状,还是“放低”这方面的要求

罢了)。

4、掌握基本的电路知识和排错能力。(软件调试有时也会牵涉到硬件原因。总不能连三极管的好坏都

不能识别吧?)

5、万用表、示波器、信号发生器……这些工具总该会用吧?

6、搜索、鉴别资料的能力。(内事问百度、外事问古狗、有事没事上21ic网)

7、与人沟通,描述问题的能力。(调试36计的最后一计——就是向他人讨教。当然,你得把话说明

白才行)

差不多了,如果上述7把砍柴刀磨好了,就可以开始调试了。接下来,请调入你的程序……

三、优先调试人机界面

面对程序中的一大堆模块,无从下手是吗?好吧,匠人告诉你,先调显示模块,然后是键盘。

为什么要先调显示模块?道理很简单,我们说“眼睛是心灵的窗户”,同样,“显示是程序的窗户”。一旦把显示模块调试好了,就可以通过这个窗口,偷窥(天呐,这两个居然是敏感字!)程序内部的数据和状态了。

然后紧接着,就是调试键盘模块。有了这个按键,我们就可以人工干预程序的运行了。

——什么,你的程序没有显示和按键?

——这位童鞋,你真不幸,请去检查一下自己的人品和星座运程先。谢谢。

实在是没显示?再看看系统有蜂鸣器吗?如果侥幸有的话,也能凑合着发发提示声音吧?

或者,有串口吗?可以考虑借助PC 端的串口调试软件来收发数据,这也是一个间接的人机交流方法。

总而言之,要尽快建立人机交流界面。

四、慢镜头的威力

2009年春晚捧红了魔术师刘谦(这位老兄名“谦”,其实一点都不谦虚——长的帅不是错,出来拽就是罪过了!),也勾起了大家对魔术的浓厚兴趣,如何识破那些快速的眼花缭乱的魔术手法呢?很简单,用慢镜头回放即可。据说刘谦那个橡皮筋魔术的手法就是被人如此识破的。

回到我们单片机上来。我们知道,单片机的运行速度,一般都是在几M到几十M(当然,也有为了节能而采用几十K的低速)。不管怎么样,这个速度都远远超出了我们人眼能够分辨的速度。眼睛一眨,也许几M条指令已经执行过去了。

比如说数码管显示(假设有4位数码管)。平时我们看到数码管同时点亮着,但是实际上,这4个数码管是逐个扫描的。在任意一个时刻,只有一位数码管被点亮。在微观上,我们可以进一步把每位数码

管的扫描动作细分为以下几个步骤:

1、关闭上一位数码管的位选信号;

2、输出当前位数码管的段选信号;

3、开启当前位数码管的位选信号;

4、启动1ms延时;

5、延时结束后,指针移动到下一位数码管,并重复上述4个步骤,如此周而复始。

你看,这样是不是就像用一个慢镜头在分解显示扫描的动作了?

那么如何实现这个慢镜头呢?方法很多:

1、单步运行(需要仿真器支持);

2、在每一步分动作之后设立断点(需要仿真器支持);

3、在每一步分动作之后插入足够的延时,让我们肉眼可以看清楚这些分动作(不需要仿真器,适合烧

片测试);

通过慢镜头的反复回放,我们就可以发现,到底是哪一个分动作出现了问题。

这个技巧,不仅仅适用于调试显示程序,也适用于按键扫描或其它模块。只要一个功能可以被细分为若干的动作,那么这一招“慢镜头分解法”都是可以使用的。

五、给程序安装个黑匣子

某年某月的某一天,一架飞机以优美的抛物线形状,一头栽到海里去了……几天后,人们找到了飞机的黑匣子,里面记录了飞行员的最后一句话:“天呐,我看到火星人了!……”

以上空难情节我们经常会通过新闻看到吧(当然,最后一句是匠人版的科幻情节)。看看,飞机的黑匣子可以记录并再现现场,多么神奇!欧耶!

我们在调试程序时,也可以借鉴这个方法,给程序按装一个黑匣子。程序中的黑匣子其实就是一个在内存中开辟的队列。队列的原理我们很清楚,先进先出,后进后出(与飞机黑匣子的特性相同)。

比如说吧,假设我们的系统在工作中,某个输入量的采样值经常受到不明原因的扰动。我们要摸清这种扰动的规律,以便对症下药。但是这种扰动稍纵即逝。

我们的困扰是:程序正常运行时看不出规律,单步走又难以捕捉扰动。怎么办?

有没有办法,把扰动记录下来?

当然可以。

我们可以利用系统里剩余的RAM,开辟一块单元,做成队列。并写段测试程序,定时把新采样值压入队列。

然后我们让程序运行,在需要的(任意)时刻,让程序停下来。这时,队列里记录的就是最新一批采样数据。

只要队列的深度足够大,我们就可以找出扰动的规律来。

——什么,你问我什么叫队列?

——匠人曰“天呐,我看到火星人了!……”

六、在程序中设卡伏击,拦截流窜犯

警察抓流窜犯的场面我们都很熟悉了。一般的方法,就是以案发现场为中心,在犯罪分子逃窜的必经路口,设卡盘查。有道是天网恢恢疏而不漏,叫你插翅也飞不过去。

有时,程序中也会出现这样一个“流窜犯”,它就是PC指针。

对于一个未经调试的不成熟的程序来说,导致PC指针跑飞的因素很多,我们逐条列举并分析之:

1、电磁干扰(如果不是在现场,那么这一条可以暂时不考虑。因为在调试环境下一般不会有干扰);

2、程序结构错乱(喜欢用jmp或goto类指令的尤其要注意这点);

3、堆栈溢出或错乱,导致PC指针出错;

4、PC指针被错误改写(有些芯片PC指针存储单元和其它RAM单元的访问方法是一样的,很容易

被误写);

5、数据错误,导致程序没有按照预期路径运行;

6、看门狗溢出(原因一般是因为看门狗设置不当、喂狗不及时、程序堵塞或者程序死循环);

7、中断被意外触发;

8、外部电路问题,比如电源不稳等等;

9、其它……

当我们开始怀疑PC指针时,我们首先要做的是确认PC指针是否跑飞了,其次要找到PC指针跑飞的证据。

我们可以在不同的分支路口,或者在我们怀疑的地方,设立断点,看程序是否走了不该经过的路径。

举个例子,比如我们怀疑程序运行中看门狗发生了溢出复位,那么很简单,我们只需要在初始化入口设立一个断点,让程序运行。正常情况下,程序只会经过一次该断点。如果再次经过该断点被拦截,那么我们就可以初步确诊“看门狗发生了溢出复位”。

再举个例子,比如程序中某个环节有A、B两个分支,正常时只走A分支,不正常时才走B分支。那么我们可以在B分支设立断点,程序一旦异常,走入B分支,就可以被拦截下来。

程序被拦截下来后,我们可以勘察现场,查看RAM区内容和程序刚走过的路径,从中分析导致程序PC指针错乱的原因。

当然,并不是每一次伏击守候都能一举擒获流窜犯(敌人是“狡猾”的,呵呵)。这就需要我们多一份耐心和技巧。通过不断调整断点位置来改变拦截地点。逐渐逼近并找到根源(流窜犯的老巢),然后一举拿下。

七、向猎人学习挖坑设陷阱的技术

上一回说到,在程序中设卡(断点),可以拦截流窜犯(程序流程错误)。实际上,断点的功能可强大了,不但可以拦截程序流程错误,也可以拦截数据错误。当然,这需要一些辅助手段。

还是以前面提到的一个例子来说。比如某个采样值(当然,也不一定是采样值,在这里也可以是RAM 中任意单元中的值)受到未明因素影响,经常“乱跳”。这种数据出错的原因,可能如下:

1、计算错误(比如溢出),导致结果出错;

2、被其它程序段误改写;

3、其它原因……

当数据出错后,我们希望能够在最快时间内,让程序停下来,这样才能有效查出是哪一段程序出了问题。

有些调试环境本身可以捕捉数据错误,并产生断点中断。这当然最好不过。但是如果调试环境本身不提供这种捕捉功能,那么就需要我们自己来制造机关了。

看看猎人是是如何做的:他们会在猎物经过的地方,挖个坑,上面盖上浮土。当小型动物经过时,浮土不会塌陷。而当体重较大的动物经过时,它们的体重就会压垮浮土,掉进猎人的陷阱。

猎人的这个陷阱机关,妙就妙在是它“智能”的,会根据动物的体重进行筛选。

轻巧的小白兔来了——放过,笨重的大狗熊来了——捕获!欧耶!

好了,回到程序中来,假设我们要监控的那个RAM单元,正常值域为0~9;那么我们可以写一段测试代码,判断数值是否>9,根据判断结果执行两个分支,并在那条错误的分支路径上设置断点。

如果数据没有出错,程序会一直运行(小白兔请放心过去);直到数据错误发生,断点会自动停下来(大狗熊给我拿下)。

我们可以把这段测试程序,插入在“狗熊出没”的地方,“守株待兔”(其实“守坑待熊”)。

接下来的事情,就跟上回说的抓流窜犯原理差不多了。

——什么,你喜欢吃兔肉?不喜欢吃熊掌?

——你也太没有爱心了,唉。。。。。

八、在程序中设置窃听器

1、你的定时中断频率是否等于设想的那个值?

2、你的主程序循环一次花了多少时间?

3、你的程序中某一次复杂计算需要耗费多少时间?

4、你的程序里某个动作发生的具体时刻是什么时候?

5、……

——也许你不关心这些时间,那么你就不必看这一回了。

但是——

1、当我们的计时时钟发生偏差时,我们希望知道定时中断是否正常发生了;

2、当我们的程序任务较多,并已经导致任务堵塞时,我们需要知道主程序运行一圈的时间是多少,以

便我们合理分割任务,避免堵塞;

3、同样,为了避免任务堵塞,我们要了解那些复杂计算所消耗的时间,并采取必要的措施(优化算法、

分时间片执行、调整执行频率)来保证系统的实时性;

4、当程序中某些动作与其它动作或状态存在时间上的关联时,我们必须严格控制它的执行时机,确保

它在正确的时刻被执行到;

5、……

我们如何才能从外部,对这些这些发生在程序内部的时间(时刻)进行精准的测量?

我们当然不能钻到芯片里面去监视每一条指令的运行情况。但是,我们可以学习一下克格勃,给程序安装个窃听器。

具体方法:

1、首先,你需要一台示波器。没有的话,可以去偷、去抢、去骗。总之,最终你搞定了这台示波器,

欧耶。

2、其次,你的芯片上要有一个空余的输出口用作测试口。没有的话,就拆东墙补西墙吧,先把不相关

功能的IO口挪用一下啦。总之,最终你搞定了这个测试口,欧耶。

3、接下来,你可以在你要“监听”的程序段中,写一小段程序,对那个测试口取反(或者输出一个脉冲)。

4、最后让程序全速运行起来,你就可以用示波器来监听程序的运行状况了。

以本回开始举的几个例子来分析:

1、如果要测试定时中断频率,只要在中断中对这个测试口取反,即可通过示波器观测中断频率;

2、如果要测试主程序运行周期,只要把取反指令放在主程序循环圈中,即可;

3、如果要测试一次复杂计算(或其它动作)需要消耗多少时间,我们只需在计算之前把测试口变为高

电平,等到计算结束后立即把输出口恢复到低电平,这段高电平的时间长度,即为计算消耗时间;

4、如果想知道两个动作之间的延时时间,我们也可以按照上一条方法一样,在两个动作发生前把测试

口分别取一次反。就可以通过示波器轻松测试出来。

5、根据实际案例的具体情况,我们可以把这种窃听技术变换出更多花样。比如我们可以用两个IO口

做测试口,同步检测两个事件的发生时刻,并测量其相互时间关系。等等……

6、引申开去,这个测试口不仅仅可以检测时间,也可以用来检测内部数据的变化。比如当某个数据的

值发生“越界”时,输出一个高电平(平时为低电平)。

等到我们取得我们想要的测试数据,我们可以把这个临时的测试口功能撤销。同时,那些测试代码也可一并删除或屏蔽。

总结:把程序内在的、不直观的、快速的一些状态变化,通过IO口传递出来,以便我们观测。——这就是我们这一回所讲的“窃听器”调试技巧的精髓。

——警告,请勿把“窃听器”安装在女生宿舍哦!

——那样的话,匠人岂不就成为教唆犯了。罪过,罪过。。。。。

九、九、快镜头加速

前面已经讲过慢镜头,这回再讲快镜头。

慢镜头的作用的把程序的运行节奏降低,以便我们能够“一帧一帧”地观测程序的运行状态。而快镜头的作用,则相反,就是让程序的运行节奏变快,让我们验证一些原本需要消耗较多等待时间的功能。

比如说,一个定时功能,定时范围是可调的,为1~24小时。如果我们要去验证,总不能傻等1~24小时吧?

怎么办呢?快镜头来了。

我们知道程序中的时间,是靠一级一级的计时器累计上来的。比如一个程序中分别有“时、分、秒”三个计时器单元。依次计数,逢60进一。“秒”计满60次了,则“分”+1;“分”计满60次了,则“时”+1;“时”

计数超过设定值了,我们就可以判定定时结束。

那么我们只要修改一下“分”到“时”的进位关系。比如改成:“分”+1;“分”计满1次(原本是60次)了,则“时”+1。这样一来,整个定时系统速度就比原来提高60倍。测试起来就很省时间了。

当然,测试完成后,记得要把刚才做的测试代码改回原样哦。

举一反三,“快镜头”技巧,不仅仅用在定时方面,也可以用在计数方面。通过对数据的变化“加速”,来加快我们的测试速度。

——什么,你喜欢磨洋工,愿意花24小时去测试那个定时功能?

——哈哈,放心,我不会告诉你的老板的——除非他使出美人计来对付我。欧耶!

十、拉闸睡觉!统一管理调试代码

前面介绍的几种方法,需要在程序中增加一些临时性的调试代码。

有些调试代码是无害的,比如只是一些延时指令,或者是在不使用的IO口上有一些输出而已。

但另一些调试代码,与正式要求的程序功能是相冲突的。那么这些代码在完成调试之后就应该被删除或屏蔽掉。

那么会不会出现意外,把本该被删除的代码漏删了?结果埋下祸害?——如果调试代码少,出错的概率比较低,只要认真仔细点还好办;但是如果程序中的调试代码写得比较多,那么确实很担心会发生这种问题。

或者另一种情况,就是前脚把调试代码删除或屏蔽掉,后脚发现还需要再调试,又要重新输入或打开那些代码?

如何管理这些代码呢?这个我们要向宿舍管理员学习了。他们是这么做的,给所有房间安装一个总电闸。到了晚上11点就把总闸一拉,看书的、打牌的、喝酒的、胡侃的、泡妞的、夜游的、Y们都给我老老实实睡觉去吧!

程序中,这样的总闸也是可以通过条件编译的方式来实现的。就像这样:

//#define TEST_MD //调试状态标志(在调试时打开,正式烧录芯片时屏蔽)

//在编写调试代码时,采用下面的形式:

#ifdef TEST_MD //如果是调试状态,则编译这段代码

……

……

#else //如果不是调试状态,则编译这段代码

……

……

#endif

一个总闸,把管理简单化了。欧耶!

十一、十一、删繁就简,从最小系统开始!

这篇手记写到上一节,原本已经结束了,直到今天看到网友问的一个问题:“我的程序调试都通过啦,为什么烧片后没有反应?”

匠人突然发现,这篇手记的一个缺陷,就是过于集中讨论了调试中的软件技巧,却疏忽了硬件方面的问题。所以特意补充这个小节的内容:

当你辛辛苦苦在仿真上完成了所有调试工作,却发现烧片后系统不工作,该怎么办?

到百脑汇去看看电脑修理工是怎么干活的:面对一台故障不明的电脑,修理工会把先不相关的部件拆掉,只留下电源、主板、CPU三样基本核心部件,看能否启动;如果这一步通过了,他们会继续加上内存、显卡、显示器,看能否点亮;如果点亮了,接下来再加上:硬盘、键盘;最后才是鼠标、光驱、网卡、打印机、摄像头之类。

从最小系统开始,有条不紊地排查。这就是有经验的修理工们惯用的“最小系统法”!

所谓的最小系统法,是指构建一个可运行的系统,必不可少的、最基本的硬件和软件环境。而在这里,我们特指硬件方面。

如果要让一个单片机系统正常工作起来,需要哪些硬件条件,我们罗列一下:

1、电源

2、复位信号

3、晶振信号

Ok!无需多说了,这就是我们要优先排查的目标(也许你需要一个示波器!)。暂时忽视那些不相关的

硬件。等单片机能够正常运行了,再去检查其它外围功能电路吧。

如果上述3个方面都排查无误,系统还不能工作,那就是人品问题啦。赶紧找个牧师去忏悔,或者到百脑汇去帮老板干几天活。完了再回来继续查自己的板子上有没有短路、开路等弱智问题。

最后再引申一下:在软件调试时,最小系统法也同样可以使用。先写一个只有最少的代码的系统,让程序跑起来,然后把模块一个个加入调试,不失为一种明智的方法。

飞思卡尔单片机各种问题汇结

飞思卡尔问题汇结 一、flash/EEPROM的操作 Tips: a、HC08系列MCU中,很多Monitor ROM中固化了对flash操作的函数,用户只需调用即可,参考AN2874等应用笔记 b、HCS08系列和HCS12系列MCU对flash的操作十分类似,可以参考 AN2140 1、FLASH操作函数 (HCS08系列) https://www.wendangku.net/doc/182034169.html,/dispbbs.asp?boardID=3&RootID=111907&ID= 111907 2、如何将flash中的程序copy至ram中 https://www.wendangku.net/doc/182034169.html,/dispbbs.asp?boardID=3&RootID=104074&ID= 104074 3、S12内部寄存器的映射

https://www.wendangku.net/doc/182034169.html,/dispbbs.asp?boardID=3&RootID=103261&ID= 103261 4、S12EEPROM的使用、 INITRG,INITRM,INITEE寄存器的说明https://www.wendangku.net/doc/182034169.html,/dispbbs.asp?boardID=3&RootID=102260&ID= 102260 5.INITRM寄存器的使用 https://www.wendangku.net/doc/182034169.html,/dispbbs.asp?boardID=3&RootID=103214&ID= 103214 二、编程技巧 Tips: a、一般Codewarrior用引导生成工程的话,器件的头文件中都定义好了各个位,C语言编程只需找到对应的位进行操作即可 b、用户自定义变量进行位操作,可以参考Codewarrior的格式 1、CW位操作定义结构 https://www.wendangku.net/doc/182034169.html,/dispbbs.asp?boardID=3&RootID=87784&ID=8 7784

飞思卡尔硬件和部分软件部分笔记

常见稳压芯片和电路图 Modified by Taiyou 2011-1-27 硬件部分 一、总体模块框图 1、基本模块包括电源模块、测速模块、驱动模块、道路识别模块等,再加上调试模块部分,调试模块部分可单独设计,调试完后拆下,框图如下: 2、此外,还可以包括车速,车架速度、电池电压和舵机位置检测等电路,增加模型车运行参数检测,提高模型车控制性能,增加调试电路方便现场调试。下面的第二图为硬件模块与上面层的关系。 二、具体电路图 1、电源模块 主要包括以下几个部分的电源:

1)5V电压。主要为单片机、信号调理电路以及部分接口电路提供电源,电压要求稳定、 噪声小,电流容量大于500mA。 补充,一般在输出端并联一个大电容来解决稳定性问题 2)6V电压。主要是为舵机提供工作电压,实际工作时,舵机所需要的工作电流一般在几 十毫安左右,电压无需十分稳定。 3)7.2V电压。这部分直接取自电池两端电压,主要为后轮电机驱动模块提供电源。 4)12V电压。如果采用CCD/CMOS图像传感器来进行道路检测,则需要12V工作电压。 5)2V电压。为红外发光管提供工作电压,可以采用开关电源从电池降压而得,这样可以 提高红外检测电路的电源利用效率。需要根据红外发射管的参数确定该电压值。 补充,此电路为光电组所需电压,我们不需要。 除此之外,如果使用了其的芯片和传感器,它们的工作电压可能不在上述之内,还需要通过专门的稳压电路提供相应的工作电压。例如采用飞思卡尔公司的MC7260加速度传感器进行车轮打滑检测,该传感器需要3.3V的工作电压。 补充,由于今年增加了坡度的控制,我们队考虑了增加坡度检测方面的传感器。 降压稳压电路可以采用可以采用串联稳压可开关稳压两种芯片。开关稳压芯片的工作效率高,但有较高的电源噪声,耗电量比较大的电路适于采用开关稳压电路。例如采用大电流红外检测电路,由于红外发射管数量较多,总的消耗电流很大,采用开关电源将电池电压将至2V左右,作为红外发射管的工作电压,此时每个红外发射管工作时只需串联很小的限流电阻甚至不用串联电阻,采用这种方法,可大大提高电源利用效率。 稳压电路的设计需要简单可靠,在满足电压波动范围的要求下应尽量简化电路设计,例如舵机电源在4.5V~6V的范围内,电流100mA左右,可以从7.2V的电池电压通过串联两只硅二极管获得。此外,通过实验可发现,组委会所提供的舵机可以直接工作在7.2V的电压下,此时舵机的响应速度也会提高,所以可以直接使用电池电压作为舵机的电源。 如果采用CCD或CMOS摄像头作为道路传感器,它们工作电压在9~12V范围内,此工作电压高于电池的电压,需要借助于斩波升压电路获取,可以采用专门升压芯片进行设计,也可以利用单片机PWM输出端口控制大功率晶体管进行斩波升压。有些CMOS摄像头工作电压在6~9V之间,所以也可以直接使用电池电压提供电源,所以选择CMOS摄像头可以简化电源电路的设计。 消除电源中的噪声并减少电压波动,需要在各级电源模块中安装滤波电容,包括容量小的高频滤波电容以及大容量的电解电容。由于存在电机驱动,为了避免电机在启动和制动过程产生的冲击电流对电源的影响,应尽量加大电池两端的电容容量,但不要超过大赛规则允许的电容容量限制。 另一本书上的版本(2.5V、5V、6.5V、7.2V、12V): 1)采用稳压芯片LM2576将电源电压稳压到5V后,给单片机系统电路、车速检测

从飞思卡尔SafeAssure功能安全保障方案看汽车安全设计概要

从飞思卡尔SafeAssure功能安全保障方案看汽车安全设计 就在您阅读完本文不到十分钟的时间内,全球大概有超过二十人已经因为车祸离开这个世界,而其中大约有90%是来自像中国这样的发展中国家(数据参考世界卫生组织统计。汽车造福人类的同时,在全球科技空前发达的今天,因为交通事故带来如此重大的公共安全威胁不啻为人类的一大悲剧。从汽车诞生开始,人们就没有停止过对汽车安全驾驶的追求。最早的安全带以及后来的安全气囊等被动安全措施挽救了数千万人的生命,后来发展起来的ABS(防抱死制动系统、ESP(电子稳定程序、EBD(电子制动力分配系等主动安全功能让汽车安全性再次大大提高。但尽管如此,交通事故依然是最大非自然死伤原因之一。图1 世界卫生组织统计:全球每年因交通事故死亡130万人,并有5000万人受伤“随着系统复杂性的提高,以及软件和机电设备的大量应用,因为系统失效和随机硬件失效导致的交通事故风险也日益增加。因此,近年开始出现了新的汽车安全概念——安全性预测。”在近日召开的“2012产业和技术展望媒体研讨会”上,飞思卡尔亚太区汽车及工业解决方案事业部全球产品市场经理郗蕴侠(Yolanda博士指出,“安全性预测即汽车里的一些系统能实时检测故障,在故障发生之前就能预警防止故障发生,这就是当前大家倡导的汽车功能安全的概念。”为此,飞思卡尔推出了命名为“SafeAssure”的安全保障方案,旨在帮助系统制造商更加轻松地满足汽车和工业市场中的功能安全标准要求,并大大降低开发难度、缩短开发周期。图2 汽车安全系统的演变——基于安全性预测的功能安全出现从IEC61508到ISO 26262,看汽车功能安全演变 2011年11月推出ISO 26262之前,汽车行业遵照的功能安全标准是电子、电气及可编程器件功能安全基本标准IEC 61508。然而,作为一种通用基础安全标准,对于汽车行业的特殊性而言,该标准有很多的不足,特别是近年来汽车系统的复杂性日益增长的条件下。从IEC 61508派生出来的ISO 26262为当前汽车行业量身定制,特别是ISO 26262对于硬件研发、软件研发的要求适合于当前先进的汽车工业的实际现状。 ISO 26262标准根据安全风险程度对系统或系统某组成部分确定划分由A到D的安全需求等级(汽车安全完整性等级——ASIL,其中ASIL D级为最高等级,具有最苛刻的安全要求。对系统供应商而言,必须满足这些因为安全等级提高而提出的更高的设计要求。安全事件总是和通常的功能、质量相关的研发活动以及产品生产伴随在一起。ISO26262强调了研

飞思卡尔MC9S12XS128单片机中断优先级设置简易教程

本教程试图用最少的时间教你飞思卡尔XS128单片机的中断优先级设置方法和中断嵌套的使用,如果是新手请先学习中断的基本使用方法。 先来看看XS128 DataSheet 中介绍的相关知识,只翻译有用的: 七个中断优先级 每一个中断源都有一个可以设置的级别 高优先级中断的可以嵌套低优先级中断 复位后可屏蔽中断默认优先级为1 同一优先级的中断同时触发时,高地址(中断号较小)的中断先响应 注意:高地址中断只能优先响应,但不能嵌套同一优先级低地址的中断 下面直接进入正题,看看怎么设置中断优先级: XS128中包括预留的中断一共有128个中断位,如果为每个中断都分配一个优先级寄存器的话会非常浪费资源,因此飞思卡尔公司想出了这样一种办法:把128个中断分为16个组,每组8个中断。每次设置中断时,先把需要的组别告诉某个寄存器,再设置8个中断优先寄存器的某一个,这样只需9个寄存器即可完成中断的设置。 分组的规则是这样的:中断地址位7到位4相同的中断为一组,比如MC9SX128.h中 这些中断的位7到位3都为D,他们就被分成了一组。0~F正好16个组。

INT_CFADDR就是上面说到的用来设置组别的寄存器: 我们需要设置某个组别的中断时,只要写入最后8位地址就行了,比如设置SCI0的中断优先级,就写入0xD0。 设置好组别之后,我们就要该组中相应的中断进行设置,设置中断的寄存器为 这其实是一组寄存器,一共有8个,每个都代表中断组中的一个中断。对应规则是这样的:中断地址的低四位除以2 比如还是SCI0,低四位是6,除以二就是3,那么我们就需要设置INT_CFDATA3 往INT_CFDATAx中写入0~7就能设置相应的中断优先级了 拿我本次比赛的程序来举个例子:我们的程序中需要3个中断:PIT0,PORTH,SCI0。PIT0定时检测传感器数值,PORTH连接干簧管进行起跑线检测,SCI0接收上位机指令实现急停等功能。因此中断优先级要SCI0>PORTH>PIT0。 我们先要从头文件中找出相应中断的地址: PIT0【7:4】位为7,选择中断组: INT_CFADDR=0x70;

飞思卡尔单片机问题总结

飞思卡尔单片机问题总结 常见问题回答精华列表 为了方便网友查询相关问题,特将常见问题精华帖整理归类 本帖不断更新,欢迎网友们给出建议 另外,在提问时,请在标题中选用具体问题的字眼避免使用请问某某、请教、紧急求助等作为标题。对于具体器件,可以直接把器件类型写上,比如HC08QY4等;对于具体技术,比如CAN/LIN/ZigBee等也直接写明,便于版主分类回答,也便于其他网友查询。 一、flash/EEPROM的操作 Tips: a、HC08系列MCU中,很多Monitor ROM中固化了对flash操作的函数,用户只需调用即可,参考AN2874等应用笔记 b、HCS08系列和HCS12系列MCU对flash的操作十分类似,可以参考 AN2140 1、FLASH操作函数 (HCS08系列)

https://www.wendangku.net/doc/182034169.html,/dispbbs.asp?boardID=3&RootID=111907&ID= 111907 2、如何将flash中的程序copy至ram中 https://www.wendangku.net/doc/182034169.html,/dispbbs.asp?boardID=3&RootID=104074&ID= 104074 3、S12内部寄存器的映射 https://www.wendangku.net/doc/182034169.html,/dispbbs.asp?boardID=3&RootID=103261&ID= 103261 4、S12EEPROM的使用、 INITRG,INITRM,INITEE寄存器的说明https://www.wendangku.net/doc/182034169.html,/dispbbs.asp?boardID=3&RootID=102260&ID= 102260 5.INITRM寄存器的使用 https://www.wendangku.net/doc/182034169.html,/dispbbs.asp?boardID=3&RootID=103214&ID= 103214 二、编程技巧

飞思卡尔单片机复习题

复习题: 1.根据总线时钟频率会计算TCNT计数时钟周期的最大值?最小值?溢出周期最大值? 如:fbus=2.4576MHz,值分别为多少?若fbus=8MHz呢? 2.熟悉LED共阴极共阳字型码的计算。 3.熟悉A W60各输入输出端口功能。 4. 不带缓冲和带缓冲的PWM有什么差异性? 5.为什么要将某些寄存器名和寄存器位在头文件中进行宏定义? 6.简述中断的作用与处理过程。 7.AW60 MCU都有哪些中断源? 8.为了实现对键盘的编程,如何区分按键是否真正地被按下,还是抖动?如何处理重键问题? 9.为了实现对键盘的编程,如何识别键盘上的按键? 10.实现计数与定时的基本方法有哪些?比较它们的优缺点。 11.比较AW60定时器模块实现输出比较功能与PWM功能的异同点。 12.为什么要对采集的数据进行滤波,有哪些滤波方法? 13.什么是输出比较?主要用途是什么? 14.什么是中断?什么是中断向量?什么是中断向量地址?GP32一共有多少个中断源? 15.什么是LED静态扫描、LED动态扫描? 16.请描述键盘逐行逐列扫描法原理。判断是否有键按下通常有哪两种方法?各有何优缺点?17.键盘设计思路中是如何获取按键的行列位置信息的?以3*3键盘为例。 18.LED和LCD各有何特点? 19.什么是脉宽调制波?脉宽调制输出功能主要用途是什么? 20.微控制器的片外晶体振荡器的频率是不是越高越好?为什么? 21.简述定时接口的基本原理。 22.如果系统中需要9个按键,那么矩阵式键盘接口方案应如何设计?并编写键盘初始化子程序及读取键值子程序,键值存入A中,若无键按下,为$FF。 23.设计并编程:仿照本章给出的定时器1通道0输入捕捉中断里程,捕捉两路输入信号,分别用相应的指示灯指示。 24.使用中断方式,对通道0输入的模拟信号连续采样8次,送入缓冲区。 25.用AW60不带缓冲的输出比较功能产生周期约为1S的方波。设内部总线时钟频率为32.768KHz。26.根据P178页码图9-3硬件连接图,编写程序完成在四个8段数码管上显示8字循环的程序。27.根据P178页码图9-3硬件连接图,编写程序完成在四个8段数码管上的4个8段abcdefgh 轮流点亮。 28.编写一个子程序对T1CH0初始化,使T1CH0产生20ms定时中断,并编写T1CH0中断服务程序使PTC0输出周期为1S的方波。设fbus=8MHz。 29.复习所有的实验。 30.复习所有的例题、作业题。 题型:选择题(30分)、问答题(40分)、编程题(30分) 1

飞思卡尔智能车摄像头组freescale程序代码

extern int left,w,top,h; extern HDC m_hdc; CBrush brush3(RGB(0,255,0)); CBrush brush4(RGB(255,0,0)); CBrush brush5(RGB(255,255,0)); #else #include #include "math.h" // #include "LQfun.h" #endif #ifdef ccd #define MAX_VIDEO_LINE 39 #define MAX_VIDEO_POINT 187 #else //#define MAX_VIDEO_LINE 26 // #define MAX_VIDEO_POINT 301 #define MAX_VIDEO_LINE 78 #define MAX_VIDEO_POINT 57 #endif extern unsigned char g_VideoImageDate[MAX_VIDEO_LINE][MAX_VIDEO_POINT]; #define INT8U unsigned char #define INT8S signed char #define INT16U unsigned int #define INT16S int #define INT32S int #define NO_DATA_180 254 //#define INT32U unsigned int unsigned char LIMIT=((MAX_VIDEO_POINT)/2); unsigned char MIDDLE[MAX_VIDEO_LINE]; #define MAX_BLACK_NUM 7 INT8S n;

飞思卡尔单片机LED控制例程详解

我的第一个LED程序 准备工作: 硬件:Freescale MC9S08JM60型单片机一块; 软件:集成开发环境codewarrior IDE; 开发板上有两个LED灯,如下图所示: 实验步骤: 1.首先,确保单片机集成开发环境及USBDM驱动正确安装。其中USBDM的安装步骤如下:?假设之前安装过单片机的集成开发环境6.3版本:CW_MCU_V6_3_SE; ?运行USBDM_4_7_0i_Win,这个程序会在c盘的程序文件夹下增加一个目录C:\Program Files\pgo\USBDM 4.7.0,在这个目录下: 1〉C:\ProgramFiles\pgo\USBDM 4.7.0\FlashImages\JMxx下的文件 USBDM_JMxxCLD_V4.sx是下载器的固件文件; 2〉C:\Program Files\pgo\USBDM 4.7.0\USBDM_Drivers\Drivers下有下载器的usb 驱动 所以在插入usb下载器,电脑提示发现新的usb硬件的时候,选择手动指定驱动 安装位置到以上目录即可。 ?运行USBDM_4_7_0i_Win之后,还会在目录: C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.3\prog\gdi 下增加一些文件,从修改时间上来看,增加了6个文件,这些文件是为了在codewarrior 集成开发环境下对usb下载器的调试、下载的支持。

2.新建一个工程,工程建立过程如下: ?运行单片机集成开发环境codewarrior IDE ?出现如下界面 ●Create New Project :创建一个新项目工程 ●Load Example Project :加载一个示例工程 ●Load Previous Project :加载以前创建过的工程 ●Run Getting started Tutorial:运行CodeWarrior软件帮助文档 ●Start Using CodeWarrior:立刻使用CodeWarrior ?点击Create New project按钮,以创建一个新的工程,出现选择CPU的界面 如下,请选择HCS08/HCS08JM Family/MC9S08JM60,在右边的Connection窗口

飞思卡尔技术报告

K60模块分配 K60的简介,我们本次使用了以下模块。 1. FTM模块:K60中集成3个FTM模块,而今年我们选用两个B车进行追踪循迹。B车模使用单电机、单舵机,另外需要一个编码器。所以对3个FTM模块进行如下配置:FTM0用以产生300Hz PWM信号控制舵机,FMT1用以产生18.5KHz PWM信号控制电机,FTM2用以采集编码器数据。 2. 定时器模块:K60中有多个定时器模块,我们使用了其中2个。其一用以产生5ms 中断,处理相关控制程序。另一个用以超声波模块的计时。 3. SPI模块:我们使用了K60的一个SPI模块,用以和无线射频模块NRF24L01P通信。 4.外部中断:我们使用了三个外部中断。第一个是PORTA的下降沿中断,用以响应干簧管检测到磁铁。第二个是PORTD的跳变沿中断,用以响应超声波模块的输出信号。最后一个是PORTE的下降沿中断,用以响应NRF24L01P模块的相关操作。 数据采集算法 传感器是智能车的眼睛,它们给智能车循迹和追踪提供了必不可少的信息。因此,在智能车软件设计中必须保证数据采集算法的稳定性,同时兼顾其快速性。本车比赛,我们的智能车主要采集以下传感器的数据:电感传感器电路板、编码器、超声波、干簧管。下面主要详述超声波模块、电感传感器电路板的数据采集。 1 .超声波模块数据采集 我们使用的超声波模块的DO引脚输出50Hz的矩形波信号,通过高电平的时间向单片机传递数据。本超声波传感器的高电平时间为声波单程传输的时间,通过这个时间可计算出两车之间的距离。 我们使用外部中断和计时器结合的方式测量高电平时间。首先配置PORTD11为跳变沿中断。中断被触发时,如果PORTD11为高电平则开始计时,如果PORTD11为低电平则停止计时并记录时间间隔。 2. 电感传感器电路板的数据采集 电感传感器电路板通过输出电压的大小反应响应位置和方向的磁场强度。本次比赛中,我们使用了10个电感分布在6个不同位置,因此每个周期都要采集10路ADC数据,每路ADC数据采集32次进行平均滤波。K60芯片中有两路ADC模块,为了最大程度的减少采集数据的时间,我们采用两个ADC模块并行采集的方法。 首先,将10路ADC分为两组,第一组6个使用ADC0模块采集,第二组4个使用ADC1模块采集,两个ADC模块同时采集数据。以第一组为例,依次采集6路ADC 数据,循环32次。当两个ADC模块都完成任务时,ADC转换结束。最后进行平均滤波。 控制算法 1.定位算法 A.两个电感定位算法 在电磁组算法设计中,“差比和”(即用连个电感数据的差除以它们的和)是一个简单易用的定位算法,但是我们测量发现“差比和”算法得出的偏差距离用着较大非线性。如下图所示,其横轴为实际偏差(单位mm),其纵轴为“差比和”得出的偏差。可以发现,在实际偏差较小时,“差比和”算出的偏差变化较快,实际偏差较大时“差比和”算出的偏差变化较缓。

飞思卡尔智能车电磁组信号采集

?пㄖ ???? ??? ? ??? ?? ? ? 1? ? ??? ? 哖 世?? ???? ??? ??? ??? ? ??? ㄎ? ?? ??????仁??20kHz??????⌒ ???仁?VLF? ??⌒???仁仁?? ? 仁 ?仁??⌒????3kHz?30kHz?⌒?? 100km?10km? ?? 3.1?? ??? ? ? ?? ? ? ?а ? ?????? ??? ? ? ? ? ?? ??オ???? ??? ??? ? ? ??? ? ? ???о? ??? ??? ??? ? ? ? ? ?? ? ??? й ?????? ? ? ?? ? ???? ?н ????? ? ? на???? ??? ? ? ?? ? ? ?? а ? ???? ?? ??? ?? ? ??? ? ? ?? ?? ??? ??? ?? ??仁? ??? ?? ???? ??? ?? ?? ????? ?? ? ?? ?????? ↓ ? ?? ?? ↓ ? ?? ?? ??? ???? ? ??? ?? ? ? ?? ? ↓ ?? ?? ? ? ? ? ?? っ ?? ???/& ????? ??? ? ? ??/&? ?? ? ?

?йㄐ ???? ?? ?LC? ?? ? ? ?? ?? ? ?? ??????? ??? ??AD???? 享 ?? 儈?↓? фн?? ?? ???AD? ???? ? ?? ?? 3.3 ?? ?? ???????? ?? 傼 ??н ??? ? ? н ? ?? ?? ?н ? н? ? ? ??? ? ?? ?нっ ???? ?????? ? ф? 儈? ? ?

飞思卡尔S12系列寄存器和中断讲解

S12的输入/输入端口(I/O口) I/O端口功能 可设置为通用I/O口、驱动、内部上拉/下拉、中断输入等功能。 设置I/O口工作方式的寄存器有: DDR、IO、RDR、PE、IE和PS。 DDR:设定I/O口的数据方向。 IO :设定输出电平的高低。 RDR:选择I/O口的驱动能力。 PE:选择上拉/下拉。 IE:允许或禁止端口中断。 PS:1、中断允许位置位时,选择上升沿/下降沿触发中断;2、中断禁止时且PE有效时,用于选择上拉还是下拉。 I/O端口设置 1、A口、B口、E口寄存器 (1)数据方向寄存器DDRA、DDRB、DDRE DDRA、DDRB、DDRE均为8位寄存器,复位后其值均为0。 当DDRA=0、DDRB=0、DDRE=0 时A口、B口和E口均为输入口。 否则,A口、B口、E口为输出口。当DDRA、DDRB、DDRE的任何一 位置1时,则该位对应的引脚被设置为输出。 例如,将A口设置为输出口,则其C语言程序的语句为:DDRA=0xff;(2)A口、B口、E口上拉控制寄存器PUCR PUCR为8位寄存器,复位后的值为0。当PUPAE、PUPBE、PUPEE被设置为1时,A口、B口、E口具有内部上拉功能;为0时,上拉无效。当A口、B口、E口为地址/数据总线时,PUPAE和PUPBE无效。 (3)A口、B口、E口降功率驱动控制寄存器RDRIV RDRIV为8位寄存器,复位后的值为0,此时,A口、B口、E口驱动保持全功率;当RDPA、RDPB、RDPE为1时,A口、B口、E口输出引脚的驱动功率下降 (4)数据寄存器PORTA、PORTB、PORTE PORTA、PORTB、PORTE均为8位寄存器,复位后的值为0,端口引脚输出低电平;要使引脚输出高电平,相应端口对应位应该置1。 由于PE0是/XIRQ、PE1是IRQ,因此,PE0和PE1只能设置为输入。

飞思卡尔智能车比赛个人经验总结

先静下心来看几篇技术报告,可以是几个人一起看,边看边讨论,大致了解智能车制作的过程及所要完成的任务。 看完报告之后,对智能车也有了大概的了解,其实总结起来,要完成的任务也很简单,即输入模块——控制——输出。 (1)输入模块:各种传感器(光电,电磁,摄像头),原理不同,但功能都一样,都是用来采集赛道的信息。这里面就包含各种传感器的原理,选用,传感器电路的连接,还有传感器的安装、传感器的抗干扰等等需要大家去解决的问题。 (2)控制模块:传感器得到了我们想要的信息,进行相应的AD转换后,就把它输入到单片机中,单片机负责对信息的处理,如除噪,筛选合适的点等等,然后对不同的赛道信息做出相应的控制,这也是智能车制作过程中最为艰难的过程,要想出一个可行而又高效的算法,确实不是一件容易的事。这里面就涉及到单片机的知识、C语言知识和一定的控制算法,有时为了更直观地动态控制,还得加入串口发送和接收程序等等。 (3)输出模块:好的算法,只有通过实验证明才能算是真正的好算法。经过分析控制,单片机做出了相应的判断,就得把控制信号输出给电机(控制速度)和舵机(控制方向),所以就得对电机和舵机模块进行学习和掌握,还有实现精确有效地控制,又得加入闭环控制,PID算法。 明确了任务后,也有了较为清晰的控制思路,接下来就着手弄懂每一个模块。虽然看似简单,但实现起来非常得不容易,这里面要求掌握电路的知识,基本的机械硬件结构知识和单片机、编程等计算机知识。最最困难的是,在做的过程中会遇到很多想得到以及想不到的事情发生,一定得细心地发现问题,并想办法解决这些问题。 兴趣是首要的,除此之外,一定要花充足的时间和精力在上面,毕竟,有付出就会有收获,最后要明确分工和规划好进度。

飞思卡尔单片机知识点

1、单片机组成:1> CPU 2> 存储器3>I/O ; 2、存储器包括2大类:ROM , RAM 3、标准ASCII码使用(1)个字节表示字符; 4、BCD码是用()进制表示的()的数据; 5、HCS08QG8的最小系统包括(电源电路,复位电路,下载口,(内部时钟)); 6、QG8管脚数量(16)、只能输入的是(PTA5)、只能输出的是(PTA4)、程序下载的是、接外部时钟的是; 7、QG8的管脚可以作为数字输入输出、也可以作为模拟输入,可以作为模拟输入的有(); 8、QG8管脚复用优先级最低的功能是(I/O); 9、QG8存储器配置中,不同资源的分界线……; 10、CPU寄存器有(A, HX, PC, CCR, SP); 11、可以执行位操作的地址范围(0X0000~0X005F); 12、有地址的寄存器分成了(3)块(0页,高页,非易失); 13、如何在C语言中定义常数(数据类型变量名;),如何指定变量的地址(数据类型变量名@ 地址;); 14、堆栈的管理者是寄存器(SP); 15、SP的复位缺省值是(0X00FF); 16、堆栈对数据的操作特点是(向上生长型:先压后涨、先减后弹); 17、堆栈一般在RAM的高地址区域还是低地址区域?高地址区 18、内部时钟源包括哪4大部分? 19、外部时钟分哪2大类;振荡器,整形外部时钟 20、内部时钟中FLL固定倍频(512倍频); 21、ICS的7种工作模式(FEI, FEE, FBI, FBILP, FBE, FBELP, stop); 22、ICS的内部参考时钟是可以校准、微调的,调整的寄存器名(ICSTRM);该寄存器的数值越大,输出时钟频率越(低); 23、FLASH是按页管理的,页大小(512)字节,每页分(8)行; 24、高页寄存器位于FLASH的最后一页的(第六行/0xFFB0~0xFFBF)位置; 25、FLASH的最后一页最后一行是(中断向量); 26、FLASH块保护寄存器(FPROT);块加密寄存器(FOPT);对应的非易失寄存器分别是(NVOPT, NVPROT); 27、FLASH操作的一般过程是(); 28、FLASH操作的有效命令有(空检查,字节编程,突发模式编程,页擦除,全部ROM 擦除); 29、记录程序运行状态的CPU寄存器是(CCR); 30、指令系统包括6大类指令,分别是(算术运算指令、数据传送指令、数据和位操作、逻辑运算、程序控制、堆栈处理); 31、寻址方式是指(CPU访问操作数和数据的方法); 32、寻址方式包括7大类16种,分别是: INH IMM DTR EXT IX,IX1,IX2,SP1,SP2,IX+,IX1+ REL IMD, DD,IX+D,DIX+ 33、8指令模板和6指令模板分别是(); 34、QG8是高电平复位还是低电平复位?低电平 35、QG8数据存储器RAM的大小为(512)字节; 36、上电复位期间将管脚(A4)设置为(低)电平可以进入调试模式 37、QG8的存储器结构为冯·诺伊曼还是哈佛结构?冯诺依曼

飞思卡尔智能车竞赛光电组技术报告

第九届“飞思卡尔”杯全国大学生智能车竞赛光电组技术报告 学校:中北大学 伍名称:ARES 赛队员:贺彦兴 王志强 雷鸿 队教师:闫晓燕甄国涌

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

摘要 本文介绍了第九届“飞思卡尔杯全国大学生智能车大赛光电组中北大学参赛队伍整个系统核心采用飞思卡尔单片机MC9S12XS128MAA ,利用TSL1401线性CCD 对赛道的行扫描采集信息来引导智能小车的前进方向。机械系统设计包括前轮定位、方向转角调整,重心设计器件布局设计等。硬件系统设计包括线性CCD传感器安装调整,电机驱动电路,电源管理等模块的设计。软件上以经典的PID算法为主,辅以小规Bang-Bang 算法来控制智能车的转向和速度。在智能车系统设计开发过程中使用Altium Designer设计制作pcb电路板,CodeWarriorIDE作为软件开发平台,Nokia5110屏用来显示各实时参数信息并利用蓝牙通信模块和串口模块辅 助调试。关键字:智能车摄像头控制器算法。

目录 1绪论 (1) 1.1 竞赛背景 (1) 1.2国内外智能车辆发展状况 (1) 1.3 智能车大赛简介 (2) 1.4 第九届比赛规则简介 (2) 2智能车系统设计总述 (2) 2.1机械系统概述 (3) 2.2硬件系统概述 (5) 2.3软件系统概述 (6) 3智能车机械系统设计 (7) 3.1智能车的整体结构 (7) 3.2前轮定位 (7) 3.3智能车后轮减速齿轮机构调整 (8) 3.4传感器的安装 (8) 4智能车硬件系统设计 (8) 4.1XS128芯片介绍 (8) 4.2传感器板设计 (8) 4.2.1电磁传感器方案选择 (8) 4.2.2电源管理模 (9) 4.2.3电机驱动模块 (10) 4.2.4编码器 (11) 5智能车软件系统设 (11) 5.1程序概述 (11) 5.2采集传感器信息及处理 (11) 5.3计算赛道信息 (13) 5.4转向控制策略 (17) 5.5速度控制策略 (19) 6总结 (19)

飞思卡尔智能车程序

Main.c #include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12db128b" #include "define.h" #include "init.h" // variable used in video process volatile unsigned char image_data[ROW_MAX][LINE_MAX] ; // data array of picture unsigned char black_x[ROW_MAX] ; // 0ne-dimensional array unsigned char row ; // x-position of the array unsigned char line ; // y-position of the array unsigned int row_count ; // row counter unsigned char line_sample ; // used to counter in AD unsigned char row_image ; unsigned char line_temp ; // temperary variable used in data transfer unsigned char sample_data[LINE_MAX] ; // used to save one-dimension array got in interruption // variables below are used in speed measure Unsigned char pulse[5] ; // used to save data in PA process Unsigned char counter; // temporary counter in Speed detect Unsigned char cur_speed; // current speed short stand; short data; unsigned char curve ; // valve used to decide straight or turn short Bounds(short data); short FuzzyLogic(short stand); /*----------------------------------------------------------------------------*\ receive_sci \*----------------------------------------------------------------------------*/ unsigned char receive_sci(void) // receive data through sci { unsigned char sci_data; while(SCI0SR1_RDRF!=1); sci_data=SCI0DRL; return sci_data; } /*----------------------------------------------------------------------------*\ transmit_sci \*----------------------------------------------------------------------------*/ void transmit_sci(unsigned char transmit_data) // send data through sci { while(SCI0SR1_TC!=1); while(SCI0SR1_TDRE!=1);

飞思卡尔智能车光电组技术报告

第十届全国大学生“飞思卡尔”杯华 北赛 智能汽车竞赛 技术报告 目录 目录 (11) 第一章方案设计 (11) 1.1系统总体方案的选定 (11) 1.2系统总体方案的设计 (11) 1.3 小结 (22) 第二章智能汽车机械结构调整与优化 (33) 2.1智能汽车车体机械建模 (33) 2.2 智能汽车传感器的安装 (44) 2.2.1速度传感器的安装 (44) 1 / 26

2.2.2 线形CCD的安装 (55) 2.2.3车模倾角传感器 (55) 2.3重心高度调整 (55) 2.3.1 电路板的安装 (66) 2.3.2 电池安放 (66) 2.4 其他机械结构的调整 (66) 2.5 小结 (66) 第三章智能汽车硬件电路设计 (77) 3.1主控板设计 (77) 3.1.1电源管理模块 (77) 3.1.2 电机驱动模块 (88) 3.1.3 接口模块 (99) 3.2智能汽车传感器 (1010) 3.2.1 线性CCD传感器 (1010) 3.2.2 陀螺仪 (1010) 3.2.3 加速度传感器 ............................ 错误!未定义书签。错误!未定义书签。 3.2.3 编码器 (1111) 3.3 键盘,数码管....................................... 错误!未定义书签。错误!未定义书签。 3.4液晶屏 (1212) 3.5 小结 (1212) 第四章智能汽车控制软件设计 (1313) 4.1线性CCD传感器路径精确识别技术 (1313) 4.1.1新型传感器路径识别状态分析 (1414)

飞思卡尔智能车电磁组程序员成长之路(未完待续)

飞思卡尔智能车电磁组程序员成长之路 1.飞思卡尔智能车小车入门 智能汽车电磁组简介: 第五届全国大学“飞思卡尔杯”智能汽车竞赛新增加了“电磁组”。根据比赛技术 要求,电磁组竞赛,需要选手设计的智能车能够检测到道路中心线下电线中20KHz 交 变电流产生的磁场来导引小车沿着道路行驶。在平时调试和比赛过程中需要能够满足比 赛技术要求的 20KHz 的交流电源驱动赛道中心线下的线圈。同时参赛选手需要自行设 计合适的电磁传感器来检测赛道信息完成智能寻迹功能。 智能车制作是一个涵盖电子、电气、机械、控制等多个领域和学科的科技创新活动。简单点来说可以将其分为硬件电路(包括电源、MUC 控制部分、电机驱动、传感器)、机械、算法三方面的设计。电磁组在机械方面可以参照光电组的设计方案,这里不再赘述。本设计指导只讲述20KHZ 电源、电磁传感器设计方案以及部分算法。 智能车对单片机模块需求: 飞思卡尔单片机资源:

智能车涉及到IO模块,中断模块,PWM模块,DMA模块,AD模块等。在车模调试中还有必须的模块。如SCI模块、定时器模块,SPI模块等。其中还涉及到一些算法和数据的存储和搬移。一个好程序框架对智能车的制作过程中会达到事半功倍的效果。但是就智能车这样系统来说,如果完全专门移植一个操作系统或者写一个程序的bootload,感觉有一些本末倒置,如果有成熟的,可以借用的,那样会比较好。 2.电磁传感器的使用 20KHz电源参考设计方案: 电源技术指标要求: 根据官网关于电磁组赛道说明,20KHz 电源技术要求如下: 1.驱动赛道中心线下铺设的 0.1-0.3mm 直径的漆包线; 2.频率围:20K±2K; 3.电流围:50-150mA; 图 2.1 是赛道起跑区示意图,在中心 线铺设有漆包线。 首先分析赛道铺设铜线的电抗,从而得 到电源输出的电压围。我们按照普通的练习 赛道总长度 50m,使用直径 0.2mm 漆包线。在30 摄氏度下,铜线的电阻率大约为 0.0185 欧姆平方毫米/米。计算可以得到中心线的电阻大约为 29.4 欧姆。 按照导线电感量计算机公式: 其中 l, d 的单位均为 cm。可以计算出直径为 0.2mm,长度 50 米的铜线电感量为131 微亨。对应 20KHz 下,感抗约为 16.5 欧姆。

飞思卡尔智能车比赛电磁组路径检测设计方案

飞思卡尔智能车比赛电磁组路径检测设计方案电磁组竞赛车模 路径检测设计参考方案 (竞赛秘书处 2010-1,版本 1.0) 一、前言 第五届全国大学生智能汽车竞赛新增加了电磁组比赛。竞赛车模需要能够通 过自动识别赛道中心线位置处由通有 100mA 交变电流的导线所产生的电磁场进行路径检测。除此之外在赛道的起跑线处还有永磁铁标志起跑线的位置。具体要求请参阅《第五届智能汽车竞赛细则》技术文档。 本文给出了一种简便的交变磁场的检测方案,目的是使得部分初次参加比赛 的队伍能够尽快有一个设计方案,开始制作和调试自己的车模。本方案通过微型车模实际运行,证明了它的可行性。微型车模运行录像参见竞赛网站上视频文件。 二、设计原理 1、导线周围的电磁场 根据麦克斯韦电磁场理论,交变电流会在周围产生交变的电磁场。智能汽车 竞赛使用路径导航的交流电流频率为 20kHz,产生的电磁波属于甚低频(VLF) 电磁波。甚低频频率范围处于工频和低频电磁破中间,为 3kHz,30kHz,波长为 100km,10km。如下图所示: 图 1:电流周围的电磁场示意图

导线周围的电场和磁场,按照一定规律分布。通过检测相应的电磁场的强度 和方向可以反过来获得距离导线的空间位置,这正是我们进行电磁导航的目的。 由于赛道导航电线和小车尺寸 l 远远小于电磁波的波长,,电磁场辐射能量很小(如果天线的长度 l 远小于电磁波长,在施加交变电压后,电磁波辐射功率正比于天线长度的四次方),所以能够感应到电磁波的能量非常小。为此,我们将导线周围变化的磁场近似缓变的磁场,按照检测静态磁场的方法获取导线周围的磁场分布,从而进行位置检测。 由毕奥-萨伐尔定律知:通有稳恒电流 I 长度为 L 的直导线周围会产生磁场,距离导线距离为 r 处 P 点的磁感应强度为: 图 2 sin直线电流的磁场 , d, ,(0 , 4 10, 7 TmA 1 ) B , ,, cos,1 2 ,。 (1) ,1 4 r 由此得: B , cos, 4 r 4 r

相关文档
相关文档 最新文档