|
问:单片机系统硬件受干扰的基本要素有哪些?抗干扰设计的基本原则是什么? 答:在电子系统设计中,为了少走弯路和节省时间,应充分考虑并满足抗干扰性的要求,避免在设计完成后再去进行抗干扰的补救措施。形成干扰的基本要素有三个: (1)干扰源,指产生干扰的元件、设备或信号,用数学语言描述如下:du/dt, di/dt大的地方就是干扰源。如雷电、继电器、可控硅、电机、高频时钟等都可能成为干扰源。 (2)传播路径,指干扰从干扰源传播到敏感器件的通路或媒介。典型的干扰传播路径是通过导线的传导和空间的辐射。 (3)敏感器件,指容易被干扰的对象。如:A/D、D/A变换器,单片机,数字IC,弱信号放大器等。 抗干扰设计的基本原则是:抑制干扰源,切断干扰传播路径,提高敏感器件的 抗干扰性能。 1) 抑制干扰源 抑制干扰源就是尽可能的减小干扰源的du/dt,di/dt。这是抗干扰设计中最优先考虑和最重要的原则,常常会起到事半功倍的效果。 减小干扰源的du/dt主要是通过在干扰源两端并联电容来实现。减小干扰源的di/dt则是在干扰源回路串联电感或电阻以及增加续流二极管来实现。 抑制干扰源的常用措施如下: (1)继电器线圈增加续流二极管,消除断开线圈时产生的反电动势干扰。仅加续流二极管会使继电器的断开时间滞后,增加稳压二极管后继电器在单位时间内可动作更多的次数。 (2)在继电器接点两端并接火花抑制电路(一般是RC串联电路,电阻一般选几K到几十K,电容选0.01uF),减小电火花影响。 (3)给电机加滤波电路,注意电容、电感引线要尽量短。 (4)电路板上每个IC要并接一个0.01μF~0.1μF高频电容,以减小IC对电源的影响。注意高频电容的布线,连线应靠近电源端并尽量粗短,否则,等于增大了电容的等效串联电阻,会影响滤波效果。 (5)布线时避免90度折线,减少高频噪声发射。 (6)可控硅两端并接RC抑制电路,减小可控硅产生的噪声(这个噪声严重时可能会把可控硅击穿的)。 2) 按干扰的传播路径可分为传导干扰和辐射干扰两类。 所谓传导干扰是指通过导线传播到敏感器件的干扰。高频干扰噪声和有用信号的频带不同,可以通过在导线上增加滤波器的方法切断高频干扰噪声的传播,有时也可加隔离光耦来解决。电源噪声的危害最大,要特别注意处理。所谓辐射干扰是指通过空间辐射传播到敏感器件的干扰。一般的解决方法是增加干扰源与敏感器件的距离,用地线把它们隔离和在敏感器件上加蔽罩。切断干扰传播路径的常用措施如下: (1)充分考虑电源对单片机的影响。电源做得好,整个电路的抗干扰就解决了一大半。许多单片机对电源噪声很敏感,要给单片机电源加滤波电路或稳压器,以减小电源噪声对单片机的干扰。比如,可以利用磁珠和电容组成π形滤波电路,当然条件要求不高时也可用100Ω电阻代替磁珠。 (2)如果单片机的I/O口用来控制电机等噪声器件,在I/O口与噪声源之间应加隔离(增加π形滤波电路)。 控制电机等噪声器件,在I/O口与噪声源之间应加隔离(增加π形滤波电路)。 (3)注意晶振布线。晶振与单片机引脚尽量靠近,用地线把时钟区隔离起来,晶振外壳接地并固定。此措施可解决许多疑难问题。 (4)电路板合理分区,如强、弱信号,数字、模拟信号。尽可能把干扰源(如电机,继电器)与敏感元件(如单片机)远离。 (5)用地线把数字区与模拟区隔离,数字地与模拟地要分离,最后在一点接于电源地。A/D、D/A芯片布线也以此为原则,厂家分配A/D、D/A芯片引脚排列时已考虑此要求。 (6)单片机和大功率器件的地线要单独接地,以减小相互干扰。 大功率器件尽可能放在电路板边缘。 (7)在单片机I/O口,电源线,电路板连接线等关键地方使用抗干扰元件如磁珠、磁环、电源滤波器,屏蔽罩,可显著提高电路的抗干扰性能。 3) 提高敏感器件的抗干扰性能 提高敏感器件的抗干扰性能是指从敏感器件这边考虑尽量减少对干扰噪声的拾取,以及从不正常状态尽快恢复的方法。 提高敏感器件抗干扰性能的常用措施如下: (1)布线时尽量减少回路环的面积,以降低感应噪声。 (2)布线时,电源线和地线要尽量粗。除减小压降外,更重要的是降低耦合噪声。 (3)对于单片机闲置的I/O口,不要悬空,要接地或接电源。其它IC的闲置端在不改变系统逻辑的情况下接地或接电源。 (4)对单片机使用电源监控及看门狗电路,如:IMP809,IMP706,IMP813,X25043,X25045等,可大幅度提高整个电路的抗干扰性能。 (5)在速度能满足要求的前提下,尽量降低单片机的晶振和选用低速数字电路。 (6)IC器件尽量直接焊在电路板上,少用IC座。
问:何谓RAM冗余技术?
答:1)将重要的数据信息备份2份(或以上)并存放在RAM中不同的区域(指地址不相连)。 2)当平时对这些数据进行修改时,同时也更新备份。 3)当干扰发生并被拦截到“程序错误处理段”中时,将数据与备份做比较,采用表决方式(少数服从多数)选出正确(或可能正确?)的那个。 4)备份越多,效果越好。(当然,你得有足够的存储空间) 5)只备份最原始的数据。中间变量(指那些可以从原始数据重新推导出来的数据)不必备份。
问:当CPU受到外界干扰,有时PC指针会飞到另一段程序中,或跳到空白段去,系统该如何办?如果PC指针飞到另一段程序中去了,系统如何办?
答:如果PC指针飞到空白段去,倒也好处理。只要在空白段设立软件陷阱(拦截指令),将程序拦截到初始化段或程序错误处理段。如果PC指针飞到另一段程序中去了,在这里推荐一种方法——程序口令,思路如下: 1)首先,程序必须模块化。每个模块(子程序)执行一个功能。每个模块只有一个出口(RET)。 2)设立一个模块(子程序)ID寄存器。 3)为每个子程序配置一个唯一的ID号码。 4)每当子程序执行完毕,要返回(RET)之前,先将本子程序的ID号送入ID寄存器。 5)返回到上级程序后,先判断ID寄存器中的ID号。如果正确,则继续执行;如果不正确,则表示PC指针有可能已经跳错了,子程序没有按预计的出口返回,这时将程序拦截到初始化段或程序错误处理段。
问:请介绍一下MCS-51系列单片机的复位指令?
答:有的单片机(如8098)有专门的复位指令,某些增强型MCS-51系统单片机虽然没有复位指令,但片内集成了WATCHDOG电路,故抗干扰也不成问题。而普及型MCS-51系列单片机(如8031和8032)既然无复位指令,又不带硬件WATCHDOG,如果没有外接硬件WATCHDOG电路,就必须采用软件抗干扰技术。常用的软件抗干扰技术有:软件陷阱、指令冗余、软件WATCHDOG等,它们的作用是在系统受干扰时能及时发现,再用软件的方法使系统复位。所谓软件复位就是用一系列指令来模仿复位操作,这就是MCS-51系列单片机所特有的软件复位技术。
问:怎样将N个IO实现的N*N键的设计?
答:设计思想:用N个IO组成——实N行虚N列或虚N行实N列。所谓“虚”就是无实际的IO线,必须用二极管构成虚行(列)。所以在N行N列的对角线上用二极管代替真N行N列中的对角线上的键,这样就组成了N*(N-1)或(N-1)*N键阵列。若要组成真的N*N键阵列,就必须在对角线上的真行(列)上再对地接N个IO键。故N*(N-1)+N=N*N当然,软件需特殊处理才行。即设此N个对角键为优先键!!!若无此N键压下时,才能再检测其他N*(N-1)个键。 问:如果使用了sst89c58想利用它的isp特性来做编程,而可能买来的芯片没有进行预编程(dip的居多),这时候怎么办呢?
答:如果手头的编程器是支持的还好,马上用编程器写一个出来就好了。但是如果你的编程器不支持,我现在用的是top851就不支持,这时有一个替代的办法:把89c58当作一个8031,在片外连接EPROM,在EPROM里面写入一个F51EBLK5.HEX的文件,该文件在SST网站有下载。这是EASYIAP程序就可以和89C58联系上了,这是可以擦除芯片,及编程、加密等操作,我们只需要把F51MBLI5.HEX文件写入到芯片里面,这时SST89C58就具备了ISP引导的功能,剩下的操作就比较容易了。很多人用SST89C58是做软件仿真器,那么把支持ISP的SST89C58用EASYIAP下载一个SOFTICE就可以了。绝大多数自制仿真器的朋友失败的原因都是使用了空白的芯片所至。而SST一再声明后期的芯片都是已经具备ISP的了,这样就把相当多的人引向了误区。554/564还没有发现空白的芯片。
问:有没有可能将编译日期和时间加入我的程序中?
答:可以使用KEIL内置的__DATE__ 和 __TIME__ 宏来实现这个功能,参考范例: unsigned char code DataStr[]=__DATE__; unsigned char code TimeStr[]=__TIME__; 这样,编译后TimeStr的字符串正好是编译的当前时刻,相当于 unsigned char code TimeStr[]="09:12:04" 这在某些时候很有用,比如管理产品版本时。
问:怎样在我的源程序中实现软件复位?
答:您可以使用下面的程序跳到0000H实现软复位,下面的程序实际上是一个函数指针,指针指向了0000H地址。 ((void (code *) (void)) 0x0000) (); 下面的例子将实现软件自复位 void reset (void) { ((void (code *) (void)) 0x0000) (); }
void main (void) { reset (); } 你可能注意到以上的软复位程序并不能清除8051的中断系统和某些8051的外围设备,当您在中断程序中调用上面的软件复位程序后,中断将再不能触发。因此,以上的软复位程序不能在中断子程序中调用。下面的小段汇编函数可以在中断程序或主程序中调用,该函数将0x0000压栈,然后通过“RETI”出栈,这将清除中断环境并让程序从0000H重新开始运行。 ?PR?RESET SEGMENT CODE RSEG ?PR?RESET ; C prototype: void reset (void); PUBLIC reset reset: POP ACC ; pop return address POP ACC CLR A ; push 0 as new PUSH ACC ; return address to stack PUSH ACC RETI ; execute return of interrupt END 以上程序在选择bank 0寄存器组时工作良好,假如选择的不是bank0寄存器组,那么可能无法获得预料的结果。你应该在以上的程序或启动代码中加上“MOV PSW, #0”来选择bank 0寄存器组。
问:软件抗干扰措施包括哪些?
答:软件抗干扰技术所研究的主要内容,其一是采取软件的方法抑制叠加在模拟输入信号上噪声的影响,如数字滤波技术;其二是由于干扰而使运行程序发生混乱,导致程序乱飞或陷入死循环时,采取使程序纳入正规的措施,如软件冗余、软件陷阱、看门狗等技术。 1)波技术,通常使用的方法有:算术平均法、中值法、抑制脉冲算术平均法、一阶惯性滤波法、程序判断滤波法和递推平均滤波法等。 2)主动初始化,这里的“初始化”泛指在各段程序中,对单片机片内外扩展器件的各种功能、端口或者方式、状态等采取的永久性的或者临时的设置。这样不仅保证上电或复位后软件能够正确地实现各种级别的初始化,而在程序中每次使用某种功能前,都要再一次对响应的控制寄存器设定动作模式。实践证明,这一措施可以大大提高系统对于入侵干扰的自恢复性能。 3)NOP的使用,可在双字节指令和3字节指令之后插入两个单字节NOP指令,这可保证其后的指令不被拆散。因为“乱飞”的程序即使落到操作数上,由于两个空操作指令NOP的存在,不会将其后的指令当操作数执行,从而使程序纳入正轨。对程序流向起决定作用的指令和某些对系统工作状态起重要作用的指令之前插入两条NOP指令,可保证乱飞程序迅速纳入轨道,确保这些指令正确执行。 4)重要指令重复执行,对程序流向起决定作用的指令和某些对系统工作状态起重要作用的指令的后面,可重复写上这些指令,以确保这些指令的正确执行。对于频率较低的传感器数据,应在有效时间内多次采集并比较,对于控制外部设备的指令,则需要多次重复执行以确保有关信号的可靠性。为达到此目的,可把重要的指令设计成定时扫描模块,使其在整个程序的循环运行过程中反复执行。 5)添加数据冗余位,为了增加系统中数据传输的可靠性,可给重要的数据添加冗余位,延长数据—代码之间的汉明距离以增强检测和纠正错误的能力。 6)软件陷阱,当乱飞程序进入非程序区或表格区时,采用冗余指令使程序入轨条件不满足,此时可以设定软件陷阱,拦截乱飞程序,将其迅速引向一个指定位置,在那里有一段专门对程序出错处理的程序,使程序纳入正轨。 7)“看门狗”技术, PC受到干扰而失控,引起程序乱飞,也可能使程序进入“死循环”。指令冗余技术、软件陷阱技术不能使失控的程序摆脱“死循环”的困境,通常采用程序监视技术,又称“看门狗”技术,使程序脱离“死循环”。其方法是:采用单片机内的一个定时器单元接收内部时钟提供的稳定脉冲,当定时器溢出时提出中断请求,对应的中断服务程序使PC回到初始化程序的第一行,从而实现强制性“软复位”。程序正常运行时,软件每隔一定的时间(小于定时器的溢出周期)给定时器清零或置数,即可预防溢出中断而引起的误复位。 8)数据的保护与恢复,在编写程序的过程中,对于由指令改变结果性质的数据,可以考虑在每次改变后都尽可能地保护起来,以便必要时恢复。有时计算机在强制复位后,I/O端口和特殊寄存器SFR中的内容都将变成芯片出厂时的设定值,这很有可能引起系统的运行混乱。因此单片机在重新启动后,应当首先执行数据恢复程序,把控制端口等重要寄存器被保护的内容恢复还原。
问:单片机实现与UNIX实现TCP/IP有什么区别?
答:1) 操作系统。不论是WINDOWS、UNIX、LINUX,它们都有一个多任务操作系统,这使得代码编写简单化,而在单片机上,因为资源的原因而无法使用多任务操作系统,这使得代码结构变为顺序执行+硬件中断的方式,而在电脑里却可以并发地执行。对程序执行结构,单片机要考虑更多。 2)内存分配。WINDOWS或UNIX的内存分配是动态的,根据需要随时分配,随时撤消 。我们阅读一些关于LINUX、UNIX的书,它们都是mbuf的存储结构。mbuf是一个存储链,这个链可以动态地增加和减小。比如在数据包很少的情况下,UNIX分配一个2K字节的缓冲区可能就够用了,但如果数据包很多,就有可能要分配64K甚至更多的缓冲区,可分配的内存要根据CPU的可用内存来调整。 但是在单片机却不能够这样做。一个最大的以太网数据包有1500多个字节,分配一包的缓冲区就要1.5K字节,而一般实现TCP/IP的单片机只外接一块32K字节的RAM。而这32K字节的RAM要被各个协议所用,而不仅仅是存放收到的数据包。一般的做法是分配一个256×6=1536个字节的RAM来存放收到的以太网数据包。收到一包就处理一包。而UNIX却可以收很多包才处理。在单片机里,存放收到的以太网数据包的RAM是固定的,而不是动态分配的。所有UNIX关于内存管理、内存分配、mbuf的结构在单片机里并不适用。这些代码对单片机是无用的。 3)指针。在电脑里,指针只有一种,就是指向某一地址的RAM,而在单片机里指针有几种。在电脑里,所有程序都必须先放在RAM里才能运行,所以它的指针只有一种情况,就是指向RAM。而单片机的结构和电脑的结构有很大差别,指针类型很多,对指针运算的速度也不一样。UNIX实现TCP/IP的源代码中,用的最多的就是指针,而在单片机里一般要求少用指针,或使用特定类型的指针。这使用UNIX的源代码需要作很多的改动。 4)参数传递。在UNIX实现的TCP/IP源代码中,一般有很多的参数传递,而在单片机里允许传递的参数是有限的(因为受到内部RAM的限制)。 5)变量定义。UNIX和KEIL C51虽然都是C语言,但两者又有所不同,对于一些变量的定义,两者却不能通用。 6)协议支持。在UNIX里可支持比较完整的TCP/IP协议,但在单片机里无法做到,这是因为单片机根本没有足够的代码空间来支持这些协议 7)硬件接口。在UNIX或WINDOWS里,对网卡驱动无一例外都是采用中断方式。而在单片机的应用中,大部份的方案都是查询式的。 问:CPU和FPGA的这些不用的I/O口怎么处理呢,是不是可先让它空着吧,以后再说?
答:不用的I/O口如果悬空的话,受外界的一点点干扰就可能成为反复振荡的输入信号了,而MOS器件的功耗基本取决于门电路的翻转次数。如果把它上拉的话,每个引脚也会有微安级的电流,所以最好的办法是设成输出(当然外面不能接其它有驱动的信号)。
问:这款FPGA还剩这么多门用不完,尽情发挥没问题吧?
答:FGPA的功耗与被使用的触发器数量及其翻转次数成正比,所以同一型号的FPGA在不同电路不同时刻的功耗可能相差100倍。尽量减少高速翻转的触发器数量是降低FPGA功耗的根本方法。
问:现在有些小芯片的功耗都很低,是否就不用考虑它们的功耗问题?
答:对于内部不太复杂的芯片功耗是很难确定的,它主要由引脚上的电流确定,一个ABT16244,没有负载的话耗电大概不到1毫安,但它的指标是每个脚可驱动60毫安的负载(如匹配几十欧姆的电阻),即满负荷的功耗最大可达60*16=960mA,当然只是电源电流这么大,热量都落到负载身上了。
问:存储器有这么多控制信号,我这块板子只需要用OE和WE信号就可以了,片选就接地吧,这样读操作时数据出来就可得快多了,对吗?
答:大部分存储器的功耗在片选有效时(不论OE和WE如何)将比片选无效时大100倍以上,所以应尽可能使用CS来控制芯片,并且在满足其它要求的情况下尽可能缩短片选脉冲的宽度。
问:这些信号怎么都有过冲啊?
答:除了少数特定信号外(如100BASE-T、CML),都是有过冲的,只要不是很大,并不一定都需要匹配,即使匹配也并非要匹配得最好。象TTL的输出阻抗不到50欧姆,有的甚至20欧姆,如果也用这么大的匹配电阻的话,那电流就非常大了,功耗是无法接受的,另外信号幅度也将小得不能用,再说一般信号在输出高电平和输出低电平时的输出阻抗并不相同,也没办法做到完全匹配。所以对TTL、LVDS、422等信号的匹配只要做到过冲可以接受即可。
问:降低功耗都是硬件人员的事,与软件没关系的吧?
答:硬件只是搭个舞台,唱戏的却是软件,总线上几乎每一个芯片的访问、每一个信号的翻转差不多都由软件控制的,如果软件能减少外存的访问次数(多使用寄存器变量、多使用内部CACHE等)、及时响应中断(中断往往是低电平有效并带有上拉电阻)及其它争对具体单板的特定措施都将对降低功耗作出很大的贡献。
问:如何判断常用集成电路的质量及好坏?
答:一看: 封装考究,型号标记清晰,字迹,商标及出厂编号,产地俱全且印刷质量较好,(有的为烤漆,激光蚀刻等) 这样的厂家在生产加工过程中,质量控制的比较严格。 二检: 引脚光滑亮泽,无腐蚀插拔痕迹,生产日期较短,正规商店经营。 三测: 对常用数字集成电路,为保护输入端及工厂生产需要,每一个输入端分别对 VDD GND 接了一个二级管,(反接),用万用表的测二级管档位可测出二级管效应, VDD GND之间电阻值静态在20K以上,小于1K肯定是坏的。 对常用模拟及线性集成电路,通常要插入应用电路中才可判断,为安全考虑,本人建议先焊一同脚位的集成电路插座, 确信外围电路无错误再插入集成电路,万一不好可找商家更换。
问:去新公司,经常遇到接手别人做过的产品或者别人做到一半的东西。读人家的程序,有时就像读天书一样。没有注释,没有文档,结构不清晰,逻辑混乱,定义不规范,写法不规范等等都可能遇到,你们有啥办法没有?
答:1先不管软件 先搞懂输入输出接口比如说那些I/O是LED指示,哪些是键盘扫描I/O,哪些是AD口,哪些是通讯口等。最好写在本子上,随时查阅。否则你看到一半程序就要跑去查原理图了。 2从main函数开始,任何功能都是在main里面实现循环的。从main调用的第一个函数读起,一般都是很多初始化函数。读完初始化就去读执行部分,看看这个模块的实现方式,模块间互相调用的,可以暂时不理。 3用笔记本记下,思路整理清晰的模块。内容包括模块作用,里面包含的函数的功能和定义。这样逐个把所有模块思路搞清晰。 4 用搜索方式,查看互相调用部分。搞懂相互关系,基本上就差不多了。 5 尤其提到一点:因为程序可能很长,必须在本子上写东西,否则你是神仙也记不住所有模块的含义。等到想不起来,再去看源码效率就很低了。
[1] [2] 下一页
|