您现在的位置:机电论文网>> 单片机技术>> 正文内容

单片机应用中的软件抗干扰技术

作者: 来源: 发布时间:2006/8/15 23:17:57  点击数:16430
单片机应用中的软件抗干扰技术


随着单片机应用的普及,采用单片机控制的产品与设备日益增多,而某些设备所在的工作环 境往往比较恶劣,干扰严重,这些干扰会严重影响设备的正常工作,使其不能正常运行。因此,为了保证设备能在实际应用中可靠地工作,必须要周密考虑和解决抗干扰的问题。本文对单片机应用中的软件抗干扰技术作详细介绍,文中所用单片机为MCS51。

一、数字量输入输出中的软件抗于

数字量输入过程中的干扰,其作用时间较短,因此在采集数字信号时,可多次重复采集,直到若干次采样结果一致时才认为其有效。例如通过A 价转换器测量各种模拟量时,如果有干扰作用于模拟信号上,就会使A/D 转换结果偏离真实值。这时如果只采样一次A/D 转换结果,就无法知道其是否真实可靠,而必须进行多次采样,得到一个A/D 转换结果的数据系列,对这一系列数据再作各种数字滤波处理,最后才能得到一个可信度较高的结果值。本书第八章将给出各种具体的数字滤波算法及程序。如果对于同一个数据点经多次采样后得到的信号值变化不定,说明此时的干扰特别严重,已经超出允许的范围,应该立即停止采样并给出报警信号。如果数字信号属于开关量信号,如限位开关、操作按扭等,则不能用多次采样取平均值的方法,而必须每次采样结果绝对一致才行。这时可编写一个采样子程序,程序中设置有采样成功和采样失败标志,如果对同一开关量信号进行若干次采样,其采样结果完全一致,则成功标志置位;否则失败标志置位。后续程序可通过判别这些标志来决定程序的流向。
单片机控制的设备对外输出的控制信号很多是以数字量的形式出现的,如各种显示器、步进电机或电磁阀的驱动信号等。即使是以模拟量输出,也是经过D/A 转换而获得的。单片机给出一个正确的数据后,由于外部干扰的作用有可能使输出装置得到一个被改变了的错误数据,从而使输出装置发生误动作。对于数字量输出软件抗干扰最有效的方法是重复输出同一个数据,重复周期应尽量短。这样输出装置在得到一个被干扰的错误信号后,还来不及反应,一个正确的信号又来到了,从而可以防止误动作的产生。在程序结构上,可将输出过程安排在监控循环中.循环周期取得尽可能短,就能有效地防止输出设备的错误动作。需要注意的是.经过这种安排后输出功能是作为一个完整的模块来执行的,与这种重复输出措施相对应.软件设计中还必须为各个外部输出设备建立一个输出暂存单元,每次将应输出的结果存入暂存单元中,然后再调用输出功能模块将各暂存单元的数据一一输出,不管该数据是刚送来的,还是以前就有的。这样可以让每个外部设备不断得到控制数据,从而使干扰造成的错误状态不能得以维持。在执行输出功能模块时,应将有关输出接口芯片的初始状态也一并重新设置。因为由于干扰的作用可能使这些芯片的工作方式控制字发生变化,而不能实现正确的输出功能,重新设置控制字就能避免这种错误.确保输出功能的正确实现。


二、程序执行过程中的软件抗于扰

前面述及的是针对输入输出通道而言的,干扰信号还未作用到CPU 本身,CPU 还能正确地执行各种抗干扰程序。如果干扰信号已经通过某种途径作用到了CPU 上,则CPU 就不能按正常状态执行程序,从而引起混乱,这就是通常所说的程序“跑飞”。程序“跑飞”后使其恢复正常的一个最简单的方法是使CPU 复位,让程序从头开始重新运行。很多单片机控制的设备中都有设置人工复位电路。人工复位一般是在整个系统已经完全瘫痪,无计可施的情况下才不得已而为之的。因此在进行软件设计时就要考虑到万一程序“跑飞”,应让其能够自动恢复到正常状态下运行。

程序“跑飞”后往往将一些操作数当作指令码来执行,从而引起整个程序的混乱。采用“指令冗余”是使“跑飞”的程序恢复正常的一种措施。所谓“指令冗余”,就是在一些关键的地方人为地插入一些单字节的空操作指令NOP。当程序“跑飞”到某条单字节指令上时,就不会发生将操作数当成指令来执行的错误。对于MCS51 单片机来说,所有的指令都不会超过3 个字节,因此在某条指令前面插入两条NOP 指令,则该条指令就不会被前面冲下来的失控程序拆散,而会得到完整的执行,从而使程序重新纳入正常轨道。通常是在一些对程序的流向起关键作用的指令前面插入两条NOP 指令。应该注意的是在一个程序中“指令冗余”不能使用过多,否则会降低程序的执行效率。

采用“指令冗余”使“跑飞”的程序恢复正常是有条件的,首先“跑飞”的程序必须落到程序区,其次必须执行到所设置的冗余指令。如果“跑飞”的程序落到非程序区(如EPROM中未用完的空间或某些数据表格等),或在执行到冗余指令之前已经形成了一个死循环,则“指令冗余”措施就不能使“跑飞”的程序恢复正常了。这时可以采用另一种软件抗干扰措施,即肠胃“软件陷阱”。“软件陷阱”是一条引导指令,强行将捕获的程序引向一个指定的地址,在那里有一段专门处理错误的程序。假设这段处理错误的程序入口地址为ERR,则下面三条指令
即组成一个“软件陷阱”:
NOP
NOP
LJMP ERR
“软件陷阱”一般安排在下列四种地方。
(l)未使用的中断向量区。MCS - 51 单片机的中断向量区为0003H~002FH,如果所设计的智能化测量控制仪表未使用完全部中断向量区,则可在剩余的中断向量区安排“软件陷阱”,以便能捕捉到错误的中断。例如某设备使用了两个外部中断INT0、INT1 和一个定时器中断T0,它们的中断服务子程序入口地址分别为FUINTO、fUINT1 和FUT0,则可按下面的方式来设置中 断向量区。
ORG 0000H
0000H START: LJMP MAIN ;引向主程序入口
0003H LJMP FUINT0 ;INT0 中断服务程序入口
0006H NOP ;冗余指令
0007H NOP
0008H LJMP ERR ; 陷阱

000BH LJMP FUT0 ;T0 中断服务程序入口
000EH NOP ;冗余指令
000FH NOP
0010H LJMP ERR ; 陷阱
0013H LJMP FUINT1 ;INT1 中断服务程序入口
0016H NOP ;冗余指令
0017H NOP
0018H LJMP ERR ; 陷阱
00lBH LJMP ERR ;未使用T1 中断,设陷饼
00lEH NOP ;冗余指令
00lFH NOP
0020H LJMP ERR ; 陷阱
0023H LJMP ERR ;未使用串行口中断,设陷阱
0026H NOP ;冗余指令
0027H NOP
0028H LJMP ERR ; 陷阱
002BH LJMP ERR ;未使用T2 中断,设陷阱
002EH NOP ;冗余指令
002FH NOP
0030H MAIN: ? ; ; 主程序

(2)未使用的大片EPROM 空间。智能化测量控制仪表中使用的EPROM 芯片一般都不会使用 完其全部空间,对于剩余未编程的EPROM 空间,一般都维持其原状,即其内容为OFFH。OFFH对于MCS51 单片机的指令系统来说是一条单字节的指令:MOV R7,A,如果程序“跑飞”到这一区域,则将顺序向后执行,不再跳跃(除非又受到新的干扰)。因此在这段区域内每隔一 段地址设一个陷阱,就一定能捕捉到“跑飞”的程序。
(3)表格。有两种表格,即数据表格和散转表格。由于表格的内容与检索值有一一对应的关系,在表格中间安排陷阱会破坏其连续性和对应关系,因此只能在表格的最后安排陷阱。如果表格区较长,则安排在最后的陷阱不能保证一定能捕捉到飞来的程序的流向,有可能在中途再次“ 跑飞”。
(4)程序区。程序区是由一系列的指令所构成的,不能在这些指令中间任意安排陷阱,否则会破坏正常的程序流程。但是在这些指令中间常常有一些断点,正常的程序执行到断点处就不再往下执行了,如果在这些地方设置陷价就有能有效地捕获“跑飞”的程序。例如在一个根据累加器A 中内容的正、负和零的情况进行三分支的程序,软件陷阱安排如下。

JNY XYZ
? ;零处理
? ?
AJMP ABC ;断裂点
NOP
NOP
LJMP ERR ; 陷阱
XYZ:JB ACC.7,UVW
? ;零处理
?
AJMP ABC ;断裂点
NOP
NOP
LJMP ERR ; 陷阱
UVW:?
?
ABC:MOV A ,R2 ;取结果
RET ;断裂点
NOP
NOP
LJMP ERR

由于软件陷阱都安排在正常程序执行不到的地方,故不会影响程序的执行效率。在EPROM 容量允许的条件下,这种软件陷阱多一些为好。如果“跑飞”的程序落到一个临时构成的死循环中时,冗余指令和软件陷阱都将无能为力。这时可以采用人工复位的方法使系统恢复正常,实际上可以设计一种模仿人工监测的“程序运行监视器”,俗称“看门狗”(WATCHDOG )。 WATCHDOG 有如下特征:
(1)本身能独立工作,基本上不依赖于CPU。CPU 只在一个固定的时间间隔内与之打一次交道,表明整个系统“目前尚属正常”。
(2)当CPU 落入死循环之后,能及时发现并使整个系统复位。目前有很多单片机在内部已经集成了片内的硬件WATCHDOG 电路,使用起来更为方便。也可以用软件程序来形成WATCHDOG。例如可以采用8031 的定时器T0 来形成WATCHDOG:将T0的溢出中断设为高级中断,其它中断均设置为低级中断,若采用6M 的时钟,则可用以下程序使T0 定时约10ms 来形成软件WATCHDOG:

MOV TMOD,# 01H;置TO 为16 位定时器
SETB ET0;允许T0 中断
SETB PT0;设置T0 为高级中断
MOV TH0,# 0E0H;定时约10ms
SETB TR0;启动T0
SETB EA;开中断

软件WATCHDOG启动后,系统工作程序必须每隔小于10ms的时间执行一次MOV TH0,#0E0H 指令,重新设置T0 的计数初值。如果程序“跑飞”后执行不到这条指令,则在10ms 之内即会 产生一次T0 溢出中断,在T0 的中断向量区安放一条转移到出错处理程序的指令:LJMP ERR, 由出错处理程序来处理各种善后工作。 采用软件WATCHDOG 有一个弱点,就是如果“跑飞”的程序使某些操作数变形成为了修改T0 功能的指令,则执行这种指令后软件WATCHDOG 就会失效。因此软件WATCHDOG 的可靠性不 如硬件高。


三、系统的恢复

前面列举的各项措施只解决了如何发现系统受到干扰和如何捕捉“跑飞”程序,但仅此还不 够,还要能够让单片机根据被破坏的残留信息自动恢复到正常工作状态。 硬件复位是使单片机重新恢复正常工作状态的一个简单有效的方法。前面介绍的上电复位、人 工复位及硬件WATCHDOG 复位,都属于硬件复位。硬件复位后CPU 被重新初始化,所有被激 活的中断标志都被清除,程序从0000H 地址重新开始执行。硬件复位又称为“冷启动”,是将系统当时的状态全部作废,重新进行彻底的初始化来使系统的状态得到恢复。用软件抗干扰措施来使系统恢复到正常状态,是对系统的当前状态进行修复和有选择的部分初始化,这种操作又可称为“热启动”。热启动时首先要对系统进行软件复位,也就是执行一系列指令来使各专用寄存器达到与硬件复位时同样的状态,这里需要注意的是还要清除中断激活标志。如用软件WATCHDOG 使系统复位时,程序出错有可能发生在中断子程序中,中断激活标志已经置位,它将阻止同级的中断响应;而软件WATCHDOG 是高级中断,它将阻止所有的中断响应。由此可见清除中断激活标志的重要性。在所有的指令中,只有RETI 指令能清除中断激活标志。前面提到的出错处理程序ERR 主要就是用来完成这一功能。这部分程序如下:
ORG 0030H
ERR: CLR EA ;关中断
MOV DPTR,# ERRI ;准备返回地址
PUSH DPL
PUSH DPH
RETI ;清除高级中断激活标志
ERRI: MOV 66H,# 0AAH ;重建上电标志
MOV 67H,# 55H

CLR A ;准备复位地址
PUSH ACC ;压入复位地址
PUSH ACC
RETI ;清除低级中断激活标志


在这段程序中用两条RETI 指令来代替两条LJMP 指令,从而清除了全部的中断激活标志。另外在66H、67H 两个单元中存放一个特定的数据0AA55H 作为软件复位标志,系统程序在执行复位操作时可以根据这一标志来决定是进行全面初始化还是进行有选择的部分初始化。如前所述,热启动时应进行部分初始化,但如果干扰过于严重而使系统遭受的破坏太大,热启动不能使系统得到正确的恢复时,则只有采取冷启动,对系统进行全面初始化来使之恢复正常。 在进行热启动时,为使启动过程能顺利进行,首先应关中断并重新设置堆栈。因为热启动过程
是由软件复位(如软件WATCHDOG 等)引起的,这时中断系统未被关闭,有些中断请求也许正在排队等待响应,因此使系统复位的第一条指令应为关中断指令。第二条指令应为重新设置栈底指令,因为在启动过程中要执行各种于程序,而子程序的工作需要堆栈的配合,在系统得到正确恢复之前堆栈指针的值是无法确定的,所以在进行正式恢复工作之前要先设置好栈底。然后应将所有的I/O 设备都设置成安全状态,封锁I/O 操作,以免于扰造成的破坏进一步扩大。接下来即可根据系统中残留的信息进行恢复工作。系统遭受干扰后会使RAM中的信息受到不同程度的破坏,RAM 中的信息有:系统的状态信息,如各种软件标志、状态变量等;预先设置的各种参数;临时采集的数据或程序运行中产生的暂时数据。对系统进行恢复实际上就是恢复各种关键的状态信息和重要的数据信息,同时尽可能地纠正由于干扰而造成的错误信息。对于那些临时数据则没有必要进行恢复。在恢复了关键的信息之后,还要对各种外围芯片重新写入它们的命令控制字,必要时还需要补充一些新的信息,才能使系统重新进入工作循环。

对于系统信息的恢复工作是至关重要的。系统中的信息以代码的形式存放在RAM 中,为了使这些信息在受到破坏后能得到正确的恢复,在存放系统信息时应该采取代码冗余措施。下面介绍一种三重冗余编码,它是将每个重要的系统信息重复存放在三个互不相关的地址单元中,建立双重数据备份。当系统受到干扰后,就可以根据这些备份的数据进行系统信息的恢复。这三个地址 应当尽可能的独立,如果采用了片外RAM,则应在片外RAM 中对重要的系统信息进行双重数据备份。片外RAM中的信息只有MOVX指令才能对它进行修改,而能够修改片内RAM中信息的指令则要多得多,因此在片外RAM 中进行双重数据备份是十分必要的。通常将片内RAM 中的数据供程序使用以提高程序的执行效率,当数据需要进行修改时应将片外RAM中的备份数据作同样的修改。在对系统信息进行恢复时,通常采用三中取二的表决流程。首先将要恢复的单字节信息及它的二个备份信息分别存放到工作寄存器R2、R3 和R4 中,再调用表决子程序。子程序出口时若F0=0 表示表决成功,即三个数据中有两个是相同的;若F0=1表示表决失败,即三个数据互不相同。表决结果存放在累加器A 中。表决子程序如下:
VOTE3: MOV A ,R2 ;第一数据与第二数据比较
XRL A ,R3

JZ VOTE32
MOV A ,R2 ;第一数据与第三数据比较
XRL A ,R4
JZ VOTE32
MOV A ,R3 ;第二数据与第三数据比较
XRL A ,R4
JZ VOTE31
SETB FO ; 失败
RET
VOTE31: MOV A ,R3 ;以第二数据为准
MOV R 2 ,A
VOTE32: CLR FO ; 成功
MOV A ,R2 ;取结果
RET

所有重要的系统信息都要一一进行表决,对于表决成功的信息应将表决结果再写回到原来的地 方,以进行统一;对于表决失败的信息要进行登记。全部表决结束后再检查登记,如果全部成功,系统将得到满意的恢复。如果有失败者,则应根据该失败信息的特征采取其它补救措施,如从现场采集数据来帮助判断,或者按该信息的初始值处理,其目的都是为了使系统得到尽可能满意的恢复。

更多
字体:【】-【】-【】【关闭此页

上一篇:基于MasterCAM加工三角开关凸'   下一篇:单片机仿真实验室的建立'


特别声明:机电之家(http://www.jdzj.com )所共享的机电类资料,机电论文、机电类文章、机电企业类管理制度、机电类软件都来自网上收集,其版权归作者本人所有,如果有任何侵犯您权益的地方,请联系我们,我们将马上进行处理。购买的论文都出自原创,保证作者的原创的版权的转让,任何纠纷由法律解决。