单片机测控系统软件抗干扰技术分析研究.docx
《单片机测控系统软件抗干扰技术分析研究.docx》由会员分享,可在线阅读,更多相关《单片机测控系统软件抗干扰技术分析研究.docx(9页珍藏版)》请在冰豆网上搜索。
![单片机测控系统软件抗干扰技术分析研究.docx](https://file1.bdocx.com/fileroot1/2023-1/23/6e90514c-3805-49a5-891e-18a41cf2abea/6e90514c-3805-49a5-891e-18a41cf2abea1.gif)
单片机测控系统软件抗干扰技术分析研究
单片机测控系统软件抗干扰技术研究
摘要:
软件抗干扰措施是单片机测控系统硬件抗干扰措施的一个补充和延伸,具有简单、灵活、方便、耗费硬件资源少及容易实现等特点。
软件抗干扰技术的使用会显著提高系统的可靠性。
本文着重讨论了测控系统中的软冗余技术、软件陷阱技术以及“看门狗”数字滤波技术,重点介绍了实时测控系统软件运行的自监视法和互监视法,并给出了软件抗干扰的其他一般方法。
1绪论
单片机测控系统设计中,对软件有以下几个方面的基本要求:
(1>可维护性:
要求尽可能地采用模块化设计,程序流程清晰明了,最大限度地控制使用和调用嵌套次数;
(2>可理解性:
软件源代码应注意加注提示内容,一般应不少于整个代码行数的60%,使其易于理解和阅读,便于修改和补充;
(3>实时性:
随着集合度和运算速度的提高,实时性已经成为测试系统对软件的普遍要求,在工程应用软件设计中,采用汇编语言要比采用高级语言更具有实时性;
(4>准确性:
系统要求在进行大量运算时,要选取合适的算法,以便控制最后结果的精度;
(5>可靠性:
可靠性是测控软件最重要的指标之一,他要求两方面的内容:
一方面是运行参数环境发生变化时(如电压在规定范围内出现较大波动>,软件都能可靠运行并得出正确的结果,也就是软件的自适应性;另一方面是在工作环境恶劣,干扰环境复杂严重的情况下,软件必须保证可靠运行,这对测控软件尤为重要。
为了保证以上两方面的要求,就必须使用多种抗干扰技术。
2单片机软件抗干扰技术及一般方法
2.1简介
软件抗干扰技术是当系统受干扰后,使系统恢复正常运行或输入信号受干扰后去伪存真的一种辅助方法。
此技术属于一种被动抗干扰措施,但是由于软件抗干扰设计灵活,节省硬件资源,操作起来方便易行,所以软件抗干扰技术越来越受到人们的重视。
软件抗干扰技术主要研究的方面:
(1>采取软件的方法对叠加在模拟输入信号上的噪声进行抑制,以读取真正有用的信息,如数字滤波器;
(2>在程序受到干扰"跑飞"的情况下,采取措施使程序回到正常的轨道上来,常见的抗干扰技术有:
软件拦截技术(软件陷阱等>;输人口信号重复检测方法;输出口数据刷新;数字滤波;
(3>程序具有自检功能。
2.2软件拦截技术
2.2.1NOP指令使用
单片机中最容易受到干扰的是内部程序计数器--PC的值,当受到干扰时,PC值被改变,CPU误将程序从正确位置跳转到无意义区域,导致程序运行出错。
目前常用的方法是在对程序走向有重要作用的指令(RET,LCALL,SJMP,JC,LJMP,ACALL等>之前加人2~3个单字节的NOP指令,当失控的程序遇到该指令后得到调整,使接下来的程序得以正常执行。
从实际使用过程中总结可知,应尽量多的使用NOP指令,而且发现NOP指令成对使用时,能起到比较满意的抗干扰效果。
2.2.2软件陷阱
(1>未使用的中断区
对于未使用的中断源因干扰而开放,从而直接影响软件的正常工作的中断源,采用的方法一般是在对应的中断服务地址入口处设置软件陷阱,使其跳转到程序入口,通常的软件陷阱设置如下面的程序:
0RG0003H
LJMP0000H;主程序入口
而在实际使用中,此种处理方法并不合适,特别是在系统联试中,突然重新执行程序的情况应尽量避免。
实际处理应该是让其进入一个信息处理程序,并显示相关信息。
这样做既可以使程序捕捉到错误的中断后,及时离开,又可以根据相关信息快速定位便于实验顺利进行。
如程序所示,只有定时器T0中断开放,对于可能影响程序的中断,如外部中断、定时器T1中断,在其中断地址人口,均加上了软件陷阱,使其跳转到ER38这个故障处理程序,从而避免程序的"跑飞",也便于判断程序的走向。
(2>未使用的EPROM空间
当装载软件程序的存储芯片为27C64,其地址空间为0000H~1FFFFH,一般程序很少能够用完,可填充"FF"。
而FFH是MOVR7,A的机器码,当程序乱入非程序区后,不仅无法转入正轨,而且还会破坏R7的内容,因此在实际使用过程对未使用的EPROM空间应全部填充为"0",因为程序复位入口地址为0000H,当"跑飞"的程序指针跳至无程序处,可以让其重新指向主程序入口,可以起到防"跑飞"的功能。
(3>程序区
为了保证可靠的运行,以及一旦发生"跑飞",不但使其有出口而且便于判断,实际应用中在整个程序中设置了若干软件陷阱,当程序进入陷阱后,让其强制进入一个指定地址执行一段专门对程序出错进行处理的程序。
通过实验验证和使用中的经验总结,在外场软件编写中,软件陷阱的设置,主要是在正常的程序流程中,在认为较为重要的程序段中,随机设置若干个故障信息显示程序区,一方面是完成正常的故障信息的显示,另一方面就是在程序"跑飞"的情况下,通过故障信息的显示,可以快速判断"跑飞',的程序段,从而使程序步入正轨。
程序流程如图1所示。
2.2.3输入口信号重复检测方法
对于重要开关量输入信号的检测,实际应用中一般采用3次或5次重复检测的方法,即对接口中的输人数据信息进行重复进行3次或5次检测,若结果完全一致则认为是"真"的输入信号,若多次测试结果不一致,即可以停止检测显示故障信息,又可以重复进行再检测。
对于软件测量而言,输入量干扰大多数是叠加到有效信号上的一系列作用时间短的尖脉冲,但是频率不一致,因此应在相邻的检测之间应有一定的时间间隔。
理论上可以是等时间段的,而在实际使用过程中,由于外部环境比较复杂,等时间段只能滤除某个频段的干扰,为了滤除尽可能多的干扰,间隔时间应为不等的时间段,但是对数据影响较大的尖峰,通过观察其波形可知,其作用的时间宽度在几十到几百μs之间,所以把滤波时间限定ms级上。
在经过使用和验证,此方法可以有效地保证软件可靠运行。
需要注意的是,对于软件时序要求比较严格场合,延时查询时间不宜过长,查询次数一般以3次为宜。
2.2.4输出端口数据刷新
开关量输出软件抗干扰技术主要采用的方法是重复输出,这是提高输出端口稳定性的有效措施之一。
外场设备的微机系统为51单片机系统,采用了8155,8255可编程I/O扩展芯片,理论上只在上电启动时,进行初始化一次即可。
但是在实际使用中发现,由于干扰等原因,可使芯片的工作控制字遭到破坏,从而使系统输入输出状态混乱的情况时有发生,因此,在读取重要信号之前,先对8155,8255进行初始化操作,通过一段时间软件运行,稳定度大大提高,但是状态混乱情况仍有发生,经过分析数据特点和系统要求后,认为8155、8255允许多次设置状态字、控制字等,而且对系统并无不良影响。
因此,在实际应用中,用到8255和8155之前均首先进行初始化操作,然后再进行状态的读取和写入。
通过长时间实验和联试,不再出现此类问题,软件运行稳定可靠。
另外应注意,在重复设置8255,8155芯片时,一定要将其工作方式、控制字一起设置,方可确保软件可靠工作。
2.2.5数字滤波
为了克服干扰对A/D转换结果的影响,可根据情况采取相应的数字滤波技术。
数字滤波的方法很多,如有中值滤波法、平均值滤波法等,经过对不同滤波法的实际使用和实验验证,认为采用防脉冲干扰平均值滤波法,抗干扰效果比较明显。
普通的平均值滤波,在干扰十分严重的场合,所得到的平均值中干扰的成分仍比较大,不易消除由于脉冲干扰而引起的误差。
而防脉冲干扰平均值滤波是在采集的N个数据中,去掉数据中的最大值和最小值,然后计算N-2个数据的算术平均值。
在实际应用中,此法主要是用在AD值的检测上,由于外场设备中AD采集值判定,直接影响此设备能否投入使用,所以对所采AD值的可靠性要求高,采用此滤波法后,通过仿真可以清楚看出,在某些特定的情况下,AD采集值波动较大,但此法可以有效地避免了CPU对采集值的误判,使软件得以可靠运行。
此程序完成的主要功能是调用A/D测量输入子程序ACD,将循环采集的6个AD值,放在70H至75H的寄存器中,RO为记录采集次数,70H和75H分别放置最大值和最小值,去除最大值和最小值后,将其余4个值求算术平均数,以得到的值为最终AD采集值放在68H寄存器中。
2.2.6程序自检
程序自检是提高测控软件可靠性的有效方法之一。
在实际应用中,自检程序主要是对单片机系统的主要器件如8031的I/O口、外部扩展的可编程I/O接VI芯片、A/D器件、ROM器件等进行检测,如出现故障能够给出故障部位。
因此自检程序不但可以了解与测试相关外设的工作情况,而且可避免因外设原因而使测控系统不能正常工作的干扰。
2.3实时控制软件运行过程中的自监视法
2.3.1基本概念
自监视法是工业控制计算机自己对自己的运行状态的监视。
一般的工控机CPU内部具有WatchdogTimer,使用定时中断来监视程序运行状态。
定时器的定时时间稍大于主程序正常运行一个循环的时间,在主程序运行过程中执行一次定时器时间常数刷新操作。
这样,只要程序正常运行,定时器不会出现定时中断。
而当程序运行失常,不能及时刷新定时器时间常数而导致定时中断,利用定时中断服务程序将系统复位。
在8031应用系统中作为软件抗干扰的一个事例,具体做法是:
*使用8155的定时器所产生的“溢出”信号作为8031的外部中断源INT1。
用555定时器作为8155中定时器的外部时钟输入;
*8155定时器的定时值稍大于主程序的正常循环时间;
*在主程序中,每循环一次,对8155定时器的定时常数进行刷新;
*在主控程序开始处,对硬件复位还是定时中断产生的自动恢复进行分类判断处理。
然而,这并不等于万无一失。
例如,①Watchdog电路本身失效;②设置Watchdog的指令正好在取指令时被干扰而读错;③Watchdog“发现”程序跑飞之后,其产生的复位脉冲或者NMI申请信号正好被干扰而没奏效等等。
虽然以上的导致Watchdog失效的因素的几率很小,但总是存在的。
另一个方面,还有相当数量的工业控制计算机没有Watchdog电路。
因此,以下重点讨论的软件自监视法就势在必行了。
2.3.2随时监督程序计数器PC值
计算机正常运行,其PC值一定在程序区内。
如果PC值跑出程序区,计算机肯定已发生了程序跑飞。
检查程序计数器PC值是否在程序区内的方法,是在一个经常要产生外部中断的某个中断服务程序中,读取转入该中断时压入堆栈的断点地址。
如果该地址在程序区内,则认为PC值正常,否则一定是程序跑飞了。
此时,程序跳转到机器的重启动入口或者复位入口,机器重新启动。
于是机器又自救活了。
如果没有一个这样合适的中断源,可以专门设置一个定时中断或者几个定时中断,在中断服务程序中检查PC值是否合法,一旦发现不对就立即转入机器的重启动入口。
定时器中断的时间常数,可视机器的繁忙程度和重要性设定,一般从几个毫秒到几十毫秒都可以。
这个方法的局限性是不能查出PC值在程序区内的乱跳,即此时PC值虽受干扰却并没有超出程序区,而是错位乱拼指令而构成一些莫名其妙的操作,或者死循环。
2.3.3主循环程序和中断服务程序相互监视
每个工控机的主循环程序和中断服务程序都有一定的运行规律可循。
因此可以设计出主循环程序与各中断服务程序、各中断服务程序之间的相互监视。
每个监视对要定义一个RAM单元,依靠对其计数/清零的方法表达相互监视信息。
例如,某工控机的主循环程序循环一次最长时间为80ms,它的一个定时中断时间常数为10ms,当我们安排该定时中断监视主循环程序运行时,可以每次10ms中断对该RAM单元加1计数,而主循环程序每循环一次对该RAM单元清零。
因此,正常运行时,这个监视计数RAM单元的计数值不可能≥9,如果10ms定时中断服务程序发现其计数值≥9,就知道主循环程序已经被干扰跑飞或出现死循环,于是就跳转到机器的重启动入口,重新恢复运行。
使用这个方法,如果设计得当的话,是非常有效的。
我们多年的经验是:
主循环程序被干扰跑飞可能性最大,中断服务程序越短小越不易跑飞。
主循环程序和中断服务程序以及中断服务程序之间的相互监视,应当多设计几个监视对会更好。
2.3.4随时校验程序代码的正确性
工业控制计算机的实时控制程序代码通常都采用EPROM固化运行,一般不易发生被改写的情况。
但成年累月运行,我们有时也会发现极个别的单元出错。
其原因可能是芯片质量问题或者因静电、雷击干扰等造成的改写。
程序出错了,将直接造成运行错误或者无法运行。
校验的方式可以采用累加和校验或者BCH校验<一种CRC校验方法)。
当采用BCH校验时,其分组附加的冗余字节可以集中在程序区之外的某个EPROM区域里。
校验方法是在某个短小而且经常发生的中断服务程序内安排一个校验模块,可以设计成每次循环校验一部分程序代码,分若干次校验完成;或者当代码少,任务轻松时也可以一次校验完。
如果发现校验错,应当立即向工控网络主站报告或者以自身报警的办法告知操作人员,以便及时处理。
这个方法的局限性是被损坏的程序代码不是校验程序块,而且以该中断还可以正常响应为前提。
由于该中断服务程序短小,通常还是有很大的概率自监视程序代码的正确性。
2.3.5随时校验RAM的正确性
在实时控制过程中,干扰造成比较严重的危害之一就是冲毁RAM中的数据,由于RAM中保存的是各种原始数据、标志、变量等,如果被破坏,会造成系统出错或无法运行,根据数据被冲毁的程度,一般可分为三类:
*整个RAM数据被冲毁;
*RAM中某片数据被冲毁;
*个别数据被冲毁。
因此需要经常监视RAM的正确性。
在工业控制系统中,RAM的大部分内容是为了进行分析、比较而临时存放的,不允许丢失的数据只占极少部分。
在这种情况下,除了这些不允许丢失的数据外,其余大部分内容允许短时间被破坏,最多只引起系统的一个很短时间的波动,很快能自动恢复正常。
因此,在工控软件中,只要注意对少数不允许丢失的数据保护,一般常用的方法有“校验法”和“设标法”。
这两种方法各有千秋,校验法比较繁锁,但查错的可信度高。
设标法简单,但对数据表中个别数据冲毁的情况,查错则无难为力。
在编程中一般应综合使用,其具体做法为:
*将RAM工作区重要区域的始端和尾端各设置一个标志码“0”或“1”;
*对RAM中固定不变的数据表格设置校验字。
在程序的执行过程中,每隔一定的时间通过事先设计的查错程序来检查其各标志码是否正常,如果不正常,则利用数据冗余技术通过抗干扰处理程序来进行修正;冗余数据表的一般设计原则是:
*各数据表应相互远离分散设置,减少冗余数据同时被冲毁的概率。
*数据表应尽可能远离栈区,减少由于操作错误造堆栈被成数据冲的可能。
上述对RAM区域的恢复处理方法,在不同的应用系统中应根据的具体情况进行取舍
3实时控制系统的互监视法
在实时控制系统中,人们关注的问题是能否确保正常的控制状态。
如果干扰进入系统,会影响各种控制条件、造成控制输出失误。
为了确保系统安全可以采取下述软件抗干扰措施:
3.1.软件冗余
CPU取指令过程是先取操作码,再取操作数。
当PC受干扰出现错误,程序便脱离正常轨道“乱飞”,当乱飞到某双字节指令,若取指令时刻落在操作数上,误将操作数当作操作码,程序将出错。
若“飞”到了三字节指令,出错机率更大。
在关键地方人为插入一些单字节指令,或将有效单字节指令重写称为指令冗余。
通常是在双字节指令和三字节指令后插入两个字节以上的NOP。
这样即使乱飞程序飞到操作数上,由于空操作指令NOP的存在,避免了后面的指令被当作操作数执行,程序自动纳入正轨。
此外,对系统流向起重要作用的指令如RET、RETI、LCALL、LJMP、JC等指令之前插入两条NOP,也可将乱飞程序纳入正轨,确保这些重要指令的执行。
对于条件控制系统,将控制条件的一次采样、处理控制输出,改为循环采样、处理控制输出。
这种方法具有良好的抗偶然因素干扰作用。
3.2.拦截技术
所谓拦截,是指将乱飞的程序引向指定位置,再进行出错处理。
通常用软件陷阱来拦截乱飞的程序。
因此先要合理设计陷阱,其次要将陷阱安排在适当的位置。
3.2.1软件陷阱的设计
当乱飞程序进入非程序区,冗余指令便无法起作用。
通过软件陷阱,拦截乱飞程序,将其引向指定位置,再进行出错处理。
软件陷阱是指用来将捕获的乱飞程序引向复位入口地址0000H的指令。
通常在EPROM中非程序区填入以下指令作为软件陷阱:
NOP
NOP
LJMP0000H
其机器码为0000020000。
3.2.2陷阱的安排
通常在程序中未使用的EPROM空间填0000020000。
最后一条应填入020000,当乱飞程序落到此区,即可自动入轨。
在用户程序区各模块之间的空余单元也可填入陷阱指令。
当使用的中断因干扰而开放时,在对应的中断服务程序中设置软件陷阱,能及时捕获错误的中断。
如某应用系统虽未用到外部中断1,外部中断1的中断服务程序可为如下形式:
NOP
NOP
RETI
返回指令可用“RETI”,也可用“LJMP0000H”。
如果故障诊断程序与系统自恢复程序的设计可靠、完善,用“LJMP0000H”作返回指令可直接进入故障诊断程序,尽早地处理故障并恢复程序的运行。
考虑到程序存贮器的容量,软件陷阱一般1K空间有2-3个就可以进行有效拦截。
4其它常采用的软件抗干扰方法
4.1陷井法
有时意想不到的干扰,破坏了中断和所有程序的正常运行。
此时PC值可能在程序区内,也可能在程序区之外,要使其能够自恢复正常运行,只有依赖于广布“陷井”的绝招了。
这里所谓的“陷井”,是指某些类型的CPU提供给用户使用的软中断指令或者复位指令。
例如,Z80指令RST38H,其机器码为FFH。
CPU执行该指令时,则将当前程序计数器PC的值压入堆栈,然后转到0038H地址执行程序。
如果把0038H作为一个重启动入口,则机器就可以恢复新的工作了。
再例如,INTEL8098、80198系列的复位指令RST,机器码也为FFH。
CPU执行该指令时,其内部进行复位操作,然后从2080H开始执行程序。
当然,80198系列还有更多的非法操作码可作为陷井指令使用,这时只需要在2018H的一个字的中断矢量单元里安排中断入口,并且编制一个处理非法操作码的中断服务程序,一遇非法操作码就能进行故障处理。
作者多年的经验表明,陷井不但需要在ROM的全部非内容区、RAM的全部非数据区设置,而且在程序区内的模块之间广泛布置。
一旦机器程序跑飞,总会碰上陷井,立即就可以救活机器了。
4.2重复功能设定法
工控机的很多功能的设定,通常都是在主程序开始时的初始化程序里设定的,以后再也不去设定了。
这在正常情况下本无问题。
但偶然的干扰会改变CPU内部的这些寄存器或者接口芯片的功能寄存器,例如,把中断的类型、中断的优先级别、串行口、并行口的设定修改了,机器的运行肯定会出错,因此,只要重复设定功能操作不影响其当前连续工作的性能,都应当纳入主程序的循环圈里。
每个循环就可以刷新一次设定,避免了偶然不测发生。
对于那些重复设定功能操作会影响当前连续工作性能的,要尽量想法找机会重新设定。
例如串行口,如果接收完某帧信息或者发送完某帧信息之后,串口会有一个短暂的空闲时,就应作出判断并且安排重新设定一次的操作。
4.3重要数据备份法
工控机中的一些关键数据,应当有至少有两个以上的备份副本,当操作这些数据时,可以把主、副本进行比较,如其改变,就要分析原因,采取预先设计好的方法处理。
还可以把重要数据采用校验和或者分组BCH校验的方法进行校验。
这两种方法一并使用则更可靠。
4.4系统“死锁”的软件对策
在工业控制系统中,A/D、D/A,显示等输入/输出接口电路是必不可少的。
这些接口与CPU之间采用查询或中断方式工作,而这些设备或接口对干扰很敏感,干扰信号一旦破坏了某一接口的状态字后,就会导致CPU误认为该接口有输入/输出请求而停止现行工作,转去执行相应的输入/输出服务程序。
但由于该接口本身并没有输入/输出数据,从而使CPU资源被该服务程序长期占用,而不释放,其它任务程序无法执行,使整个系统出现“死锁”。
对这种干扰造成的“死锁”问题,在软件编程中,可采用“时间片”的方法来解决。
其具体步骤为:
*根据不同的输入/输出外设对时间的要求,分配相应的最大正常的输入/输出时间。
*在每一输入/输出的任务模块中,加入相应的超时判断程序。
这样当干扰破坏了接口的状态造成CPU误操作后,由于该外设准备好信息长期无效,经一定时间后,系统会从该外设的服务程序中自动返回,保证整个软件的周期性不受影响,从而避免“死锁”情况的发生。
4.5数据采集误差的软件对策根据数据受干扰性质及干扰后果的不同,采取的软件对策各不相同,没有固定的模式。
对于实时数据采集系统,为了消除传感器通道中的干扰信号,在硬件措施上常采取有源或无源RLC网络,构成模拟滤波器对信号实现频率滤波。
同样,运用CPU的运算、控制功能也可以实现频率滤波,完成模拟滤波器类似的功能,这就是数字滤波。
在许多数字信号处理专著中都有专门论述,可以参考。
随着计算机运算速度的提高,数字滤波在实时数据采集系统中的应用将愈来愈广。
在一般数据采集系统中,可以采用一些简单的数值、逻辑运算处理来达到滤波的效果。
用的方法有算术平均值法、比较取舍法、中值法、一阶递推数字滤波法等。
具体见本版的有关文章。
参考文献
[1]孙传友.测控系统原理与设计[J].北京:
北京航空航天大学出版社,2004.4
[2]韩晓东,杜宇.电动汽车单片机测控系统的抗.干扰设计[J].电子技术,1999,9
[3]何希才.传感器及其应用电路[M].北京:
电子工业出版社,2001
[4]梁廷贵.集成运算放大器[M].电压比较器分册.北京:
科学技术文献出版社,2002
[5]王幸之,王雷,翟成,等.单片机应用系统抗干扰技术[M].北京:
北京航空航天大学出版社,2000]
[6]赵晶.电路设计与制版Protel99高级应用[M].北京:
人民邮电出版社,2000
[7]艾玲梅.单片机测控系统抗抗干扰技术[J].陕西工学院学报,2003.6