单片机抗干扰技术及应用

发布者:大橙子5511最新更新时间:2012-07-04 来源: 61ic关键字:单片机  抗干扰技术  敏感程度 手机看文章 扫描二维码
随时随地手机看文章

引言

随着单片微机在各个领域中的应用越来越广泛,对其可靠性要求也越来越高。单片机系统的可靠性由多种因素决定,其中系统抗干扰性能是可靠性的重要指标。工业环境有强烈的电磁干扰,因此必须采取抗干扰措施,否则难以稳定、可靠运行。

工业环境中的干扰一般是以脉冲形式进入微机系统,渠道主要有三条,如图1所示。

空间干扰(场干扰),电磁信号通过空间辐射进入系统。

过程通道干扰,干扰通过与系统相连的前向通道、后向通道及与其它系统的相互通道进入。

供电系统干扰,电磁信号通过供电线路进入系统。

一般情况下空间干扰在强度上远小于其它两种,故微机系统中应重点防止过程通道与供电系统的干扰。

抗干扰措施有硬件措施和软件措施。硬件措施如果得当,可将绝大部分干扰拒之门外,但仍然会有少数干扰进入微机系统,故软件措施作为第二道防线必不可少。由于软件抗干扰措施是以CPU为代价的,如果没有硬件消除绝大多数干扰,CPU将疲于奔命,无暇顾及正常工作,严重影响系统的工作效率和实时性。因此,一个成功的抗干扰系统是由硬件和软件相结合构成的。

笔者设计的激光打标控制系统由于现场使用环境较恶劣,各种干扰因素较多,如交流噪声、电网干扰及其它电磁干扰等,因此必须采取有效的抗干扰措施以确保系统稳定工作,下面介绍我们在该系统硬件、软件和CPU上采取的抗干扰措施。

硬件措施

光电隔离

在输入和输出通道上采用光电隔离器来进行信息传输是很有好处的,它将微机系统与各种传感器、开关、执行机构从电气上隔离开来,很大一部分干扰将被阻挡。本系统中步进电机驱动电路采用了光电隔离器4N33。电路如图2所示。

过压保护电路

在输入输出通道上应采用一过压保护电路,以防引入高电压,伤害微机系统。过压保护电路由限流电阻和稳压管组成,限流电阻选择要适宜,太大会引起信号衰减,太小起不到保护稳压管的作用。稳压管的选择也要适宜,其稳压值以略高于最高传送信号电压为宜,太低将对有效信号起限幅效果,使信号失真。步进电机驱动电路即采用过压保护电路。

抗干扰电源

微机系统供电线路是干扰的主要来源,电源采用隔离变压器接入电网,可以防止电网的干扰侵入微机系统。隔离变压器与普通变压器的不同之处在于它在初级和次级之间加了一层屏蔽层,并将它和铁芯一起接地。

配置去耦电容

原则上每个集成电路芯片都应安置一个0.01mF的陶瓷电容器,可以消除大部分高频干扰。

良好接地

本系统既有模拟电路又有数字电路,因此数字地与模拟地要分开,最后只在一点相连,如果两者不分,则会互相干扰。

软件措施

单片机在输出信号时,外部干扰有可能使信号出错。本系统中单片机发出的驱动步进电机的信号经锁存器锁存后传送给驱动电路,锁存器对干扰非常敏感,当锁存线上出现干扰时,会盲目锁存当前数据,而不管是否有效。因此首先应将锁存器与单片机安装在同一电路板上,使传输线上传送的是已经锁存好的控制信号。在软件上,最有效的方法就是重复输出同一个信号,只要重复周期尽可能短,锁存器接收到一个被干扰的错误信号后还来不及作出有效的反应,一个正确的输出信号又来到,就可以及时防止错误动作的产生。

CPU抗干扰措施

前面几项抗干扰措施是针对I/O通道,干扰还未作用到单片机本身,这时单片机还能正确无误地执行各种抗干扰程序,当干扰作用到单片机本身时(通过干扰三总线等),单片机将不能按正常状态执行程序,从而引起混乱。如何发现单片机受到干扰,如何拦截失去控制的程序流向,如何使系统的损失减小,如何恢复系统的正常运行,这些就是CPU抗干扰需要解决的问题。我们采用了以下几种方法。

人工复位

对于失控的CPU,最简单的方法是使其复位,程序自动从0000H开始执行。为此只要在单片机的RESET端加上一个高电平信号,并持续10ms以上即可。

掉电保护

电网瞬间断电或电压突然下降将使微机系统陷入混乱状态,电网电压恢复正常后,微机系统难以恢复正常。对付这一类事故的有效方法就是掉电保护。掉电信号由硬件电路检测到,加到单片机的外部中断输入端。软件中断将掉电中断规定为高级中断,使系统及时对掉电作出反应。在掉电中断子程序中,首先进行现场保护,保存当时重要的状态参数,当电源恢复正常时,CPU重新复位,恢复现场,继续未完成的工作。

睡眠抗干扰

CMOS型的51系列单片机具有睡眠状态,此时只有定时/计数系统和中断系统处于工作状态。这时CPU对系统三总线上出现的干扰不会作出任何反应,从而大大降低系统对干扰的敏感程度。

我们仔细分析系统软件后发现,CPU很多情况下是在执行一些等待指令和循环检查程序,由于这时CPU虽没有重要工作,但却是清醒的,很容易受干扰。让CPU在没有正常工作时休眠,必要时再由中断系统来唤醒它,之后又处于休眠。采用这种安排之后,大多数CPU可以有50~95%的时间用于睡眠,从而使CPU受到随机干扰的威胁大大降低,同时降低了CPU的功耗。

指令冗余

当CPU受到干扰后,往往将一些操作数当作指令码来执行,引起程序混乱。这时我们首先要尽快将程序纳入正轨(执行真正的指令系列)。MCS-51系统中所有指令都不超过3个字节,而且有很多单字节指令。当程序弹飞到某一条单字节指令上时,便自动纳入正轨。当弹飞到某一双字节或三字书指令上时,有可能落到其操作数上,从而继续出错。因此,我们应多采用单字节指令,并在关键的地方人为地插入一些单字节指令(NOP),或将有效单字书指令重复书写,这便是指令冗余。[page]

在双字节和三字节指令之后插入两条NOP指令,可保护其后的指令不被拆散。或者说,某指令前如果插入两条NOP指令,则这条指令就不会被前面冲下来的失控程序拆散,并将被完整执行,从而使程序走上正轨。但不能加入太多的冗余指令,以免明显降低程序正常运行的效率。因此,常在一些对程序流向起决定作用的指令之前插入两条NOP指令,以保证弹飞的程序迅速纳入正确的控制轨道。此类指令有:RET、RETI、LCALL、SJMP、JZ、CJNE等。在某些对系统工作状态至关重要的指令(如SETB EA之类)前也可插人两条NOP指令,以保证被正确执行。上述关键指令中,RET和RETI本身即为单字书指令,可以直接用其本身来代替NOP指令,但有可能增加潜在危险,不如NOP指令安全。

软件陷阱

指令冗余使弹飞的程序安定下来是有条件的,首先弹飞的程序必须落到程序区,其次必须执行到冗余指令。当弹飞的程序落到非程序区(如EPROM中未使用的空间、程序中的数据表格区)时前一个条件即不满足,当弹飞的程序在没有碰到冗余指令之前,已经自动形成一个死循环,这时第二个条件也不满足。对付前一种情况采取的措施就是设立软件陷阱,对于后一种情况采取的措施是建立程序运行监视系统(WATCHDOG)。

所谓软件陷阱,就是一条引导指令,强行将捕获的程序引向对程序出错进行处理的程序。如果我们把这段程序的入口标号称为ERR的话,软件陷阱即为一条LJMP ERR指令,为加强其捕捉效果,一般还在它前面加两条NOP指令,因此,真正的软件陷阱由三条指令构成:

NOP

NOP

LJIMP ERR

软件陷阱安排在下列四种地方:

(1)未使用的中断向量区。当干扰使未使用的中断开放,并激活这些中断时,就会进一步引起混乱。如果在这些地方布上陷阱,就能及时捕捉到错误中断。

(2)未使用的大片ROM空间。现在使用EPROM都很少将其全部用完。对于剩余的大片未编程的ROM空间,一般均维持原状(0FFH),0FFH对于指令系统,是一条单字节指令(MOV R7,A),程序弹飞到这一区域后将顺流而下,不再跳跃(除非受到新的干扰)我们只要每隔一段设置一个陷阱,就一定能捕捉到弹飞的程序。软件陷阱一定要指向出错处理过程ERR。我们可以将ERR字排在0030H开始的地方,程序不管怎样修改,编译后ERR的地址总是固定的(因为它前面的中断向量区是固定的)。这样我们就可以用00 00 02 00 30五个字节作为陷阱来填充ROM中的未使用空间,或者每隔一段设置一个陷阱(02 00 30),其它单元保持0FFH不变。

(3)表格。有两类表格,一类是数据表格,供MOVC A,@A+PC指令或MOVC A,@A+DPTR指令使用,其内容完全不是指令。另一类是散转表格,供JMP @A+DPTR指令使用,其内容为一系列的三字节指令 LJMP或两字节指令 AJMP。由于表格内容和检索值有一一对应关系,在表格中间安排陷阱将会破坏其连续性和对应关系,只能在表格的最后安排五字节陷阱(NOP NOP LJMP ERR)。

(4)程序区。程序区是由一串串执行指令构成的,在这些指令串之间常有一些断裂点,正常执行的程序到此便不会继续往下执行了,这类指令有JMP、RET等。这时PC的值应发生正常跳变。如果还要顺次往下执行,必然就出错了。当然,弹飞来的程序刚好落到断裂点的操作数上或落到前面指令的操作数上(又没有在这条指令之前使用冗余指令),则程序就会越过断裂点,继续往前冲。我们在这种地方安排陷阱之后,就能有效地捕捉住它,而又不影响正常执行的程序流程。例如:

……

AJMP ABC

NOP

NOP

LJMP ERR

……

ABC:MOV A,R2

RET

NOP

NOP

LJMP ERR

ERR: ……

由于软件陷阱都安排在程序正常执行不到的地方,故不会影响程序执行效率。

 

结语

综上所述,通过对单片机应用系统的软硬件全面考虑,并针对不同的情况采取不同的技术措施,保证了系统准确、可靠运行。激光打标控制系统采用了上述抗干扰措施后,系统可靠性大大增强,运行稳定,效果理想,现已批量生产,取得了良好的经济效益。■

 

参考文献

1.陈光东,赵性初,单片微型计算机原理与接口技术,华中理工大学出版社,1995:150。

2.邵贝贝,单片机系统可靠性技术及发展,电子产品世界,1998;8:20-21。

关键字:单片机  抗干扰技术  敏感程度 引用地址:单片机抗干扰技术及应用

上一篇:Flash型单片机的加密与解密
下一篇:C语言出错信息速查

推荐阅读最新更新时间:2024-03-16 13:02

MCS-51单片机指令系统的寻址方式
1、寄存器寻址 寄存器寻址方式可用于访问选定寄存器区的8个工作寄存器R0~R7。由指令操作码的低3位指示所用的寄存器,寄存器A、B、DPTR和C位(位处理机的累加器)也可作为寻址的对象。 2、直接寻址 直接寻址是访问特殊功能寄存器的唯一方法。它也用于访问内部RAM(低128个字节)。采用直接寻址方式的指令是双字节指令,其中第一个字节是操作码,第二个字节是内部RAM或特殊功能寄存器的直接地址。 3、寄存器间接寻址 寄存器间接寻址方式可用于访问内部RAM或外部数据存储器。这种寻址方式是由指令指定某一寄存器的内容作为操作数的地址。 访问内部RAM或外部数据存储器的低256个字节时,可采用R0或R1作为间址寄存器。 4、立即寻址 采用
[单片机]
STM32单片机小Tips(6):玩转IAR,开发STM32
  从51开始,单片机玩了很长时间了,有51,PIC,AVR等等,早就想跟潮流玩玩ARM,但一直没有开始,原因 -----不知道玩了ARM可以做什么(对我自己而言)。如果为学习而学习,肯定学不好。然后cortex-m3出来了,据说,这东西可以替代单片机,于 是马上开始关注。也在第一时间开始学习,可惜一开始就有点站错了队,选错了型(仍是对我自己而言)。我希望这种芯片应该是满大街都是,随便哪里都可以买得 到,但我选的第一种显然做不到。为此,大概浪费了一年多时间吧,现在,回到对我来说是正确的道路上来啦,边学边写点东西。   闲话多了些,就权当前言了。下面准备开始。   STM32单片机小Tips之RTC实践   BKP还没有搞完,
[单片机]
STM32<font color='red'>单片机</font>小Tips(6):玩转IAR,开发STM32
单片机学习——IIC总线及EEPROM实验之一
题目:简单的流水灯实验。用EEPROM实现。 解决方案:(c语言编程) #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar code table ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f ,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; void delay1(uint); sbit scl=P3^3; sbit sda=P3^4; void delay() //短延时子程序 { ;; } void i
[单片机]
51单片机教程之基础编(基于C语言)
大家好,我是陈滨,本人是去年9月份开始学单片机,到现在一年多了,现在本人基本掌握了单片机编程,开始深入学习汇编语言了。很多初学者有很多的疑惑,我究竟是先学C语言,还是汇编语言?其实我告诉你,本人认为,先学C语言!为什么呢?C语言是目前使用最广泛的中级语言,就连现在的windows7也是C语言编写的,C语言易读性好,无需对单片机内部结构十分熟悉即会编程,可移植性高,便于维护。C语言只有32个关键字,9种控制语句,而且编译器提供了很多函数库,使用十分方便。而汇编语言达100多条指令,每条指令对应一个机器码,跟单片机内部结构息息相关,而且不提供库函数,每种东西都要自己写。汇编语言最致命的地方是它不同硬件几乎不可移植,维护麻烦。但是读者又有
[单片机]
关于STM32单片机GPIO口上拉与下拉输入
以前GPIO上接的电路都是低电平触发的那种,新画了个板子有一个按键设计的是高电平触发,结果IO口设置成上拉输入后,怎么读都不正确,按键电路如图1。无奈只能去调试一下,发现当设置为上拉输入后,其ODR(GPIO输出数据寄存器)相应的也置为1,百思不得其解。 图1 按键电路 于是去看一下GPIO的结构图: I/O引脚结构图 由图可以发现其实输出寄存器与输入寄存器之间在I/O引脚处是线与状态,在GPIO设置成上位输入时,其上拉电阻闭合,这时如果输出寄存器设置为0那么在IO口内部就会自己损耗电流,而这些电流的损耗是会增加功耗的。因此当GPIO设置成上拉输入时,相应的输出寄存器也设置为1. 将按键电路与I/O
[单片机]
关于STM32<font color='red'>单片机</font>GPIO口上拉与下拉输入
单片机驱动继电器电路设计
之前说过,单片机的拉电流和灌电流有限,即输出驱动能力有限,要驱动继电器这类大功率的器件该怎么办呢,答案很简单:用三极管。器件参数该如何确定呢? 手上有一个HFD23的5V继电器,下面看一下其参数。 可以看出: 线圈的电阻为125Ω; 线圈的功率为200mW; 继电器的额定电压为5V; 由此可以计算出继电器的吸合电流,两种计算方式: I=0.2mW/5V=40mA; I=5V/125Ω=40mA; 下面看三极管的参数: 参数解释如下: PCM是集电极最大允许耗散功率; ICM是集电极最大允许电流; BV(CEO)是三极管基极开路时,集电极-发射极反向击穿电压; fT是特征频率; hFE是放大倍
[单片机]
<font color='red'>单片机</font>驱动继电器电路设计
SAM4E单片机之旅——6、LED闪烁之按钮控制
现在试试用按钮控制LED灯……让LED在一个按钮按下时亮起;弹起时灭掉。 主要目的是学习GPIO的输入及中断。 一、 电路 图中的J39-n是几个跳线插座,位置在开发板LCD附近,往下进行前要先确保跳线是接通的。 可以看到,当按钮按下时,引脚接地。即若引脚接个上拉电阻,则在按钮弹起状态下,引脚处于高电平状态;而在按钮按下时,则处于低电平状态。 这次使用的按钮是BP3,即PA20引脚;LED为蓝色LED,即PA0。 二、 最简单的办法 在开发版重置时,所有的引脚就默认接了上拉电阻。 所以,直接使用一根杜邦线将PA20和PA0短接,就可以用BP3控制蓝色LED了。 三、 稍微有技术含量的思路 假设,身边不存在杜邦线
[单片机]
SAM4E<font color='red'>单片机</font>之旅——6、LED闪烁之按钮控制
基于单片机PIC18F66J10的主动放线机设计
0 引言 速度是工业生产中的主要被控参数之一,与之相关的各种速度控制系统已被广泛应用于冶金、化工、机械、食品等领域。本文介绍的主动放线机速度自动控制系统适用于微细金属线的恒张力主动放线,可广泛用于拉丝机、绕线机的前端放线,并可在放线过程中保持金属线的张力恒定。适用的线材有金、银、铜、铝等,放线速度为0~700 rpm,线径可达φ0.05 mm,张力控制可通过摆臂一边悬挂的砝码来手动调整。 整个系统选用六线式单极性步进电机为执行部件,具有低成本和控制方法简单的优点,核心控制芯片选用美国Microchip公司的PIC单片机PIC18F66J10,该芯片具有实用可靠、代码保密性好、片内集成有模拟、数字功能部件等优点。而系统选用美国A
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved