这6招助你提高单片机抗干扰能力!
一、解决来自电源端的干扰
单片机系统中的各个单元都需要使用直流电源,而直流电源一般是市电电网的交流电经过变压、整流、滤波、稳压后产生的,因此电网上的各种干扰便会引入系统。除此之外,由于交流电源共用,各电子设备之间通过电源也会产生相互干扰,因此抑制电源干扰尤其重要。电源干扰主要有以下几类。
① 电源线中的高频干扰
供电电力线相当于一个接收天线,能把雷电、电弧、广播电台等辐射的高频干扰信号通过电源变压器初级耦合到次级,形成对单片机系统的干扰;解决这种干扰一般通过接口防护,在接口增加滤波器或使用隔离电源模块解决。
② 感性负载产生的瞬变噪声
切断大容量感性负载时,能产生很大的电流和电压变化率,从而形成瞬变噪声干扰,成为电磁干扰的主要形式;解决这种干扰一般通过屏蔽线与双胶线或在电源接口、信号接口进行滤波处理。这两种方法都需要在系统接地良好的情况下进行,滤波器、接口滤波电路都必须良好接地,这样才能有效地将干扰泄放。
二、模拟信号采样抗干扰技术
单片机应用系统中通常要对一个或多个模拟信号进行采样,并将其通过A/D转换成数字信号进行处理。为了提高测量精度和稳定性,不仅要保证传感器本身的转换精度、传感器供电电源的稳定、测量放大器的稳定、A/D转换基准电压的稳定,而且要防止外部电磁感应噪声的影响,如果处理不当,微弱的有用信号可能完全被无用的噪声信号淹没。在实际工作中,可以采用具有差动输入的测量放大器,采用屏蔽双胶线传输测量信号,或将电压信号改变为电流信号,以及采用阻容滤波等技术。
三、数字信号传输通道的抗干扰技术
数字输出信号可作为系统被控设备的驱动信号(如继电器等),数字输入信号可作为设备的响应回答和指令信号(如行程开关、启动按钮等)。数字信号接口部分是外界干扰进入单片机系统的主要通道之一。在工程设计中,对数字信号的输入/输出过程采取的抗干扰措施有传输线的屏蔽技术,如采用屏蔽线、双胶线等;采用信号隔离措施;合理接地,由于数字信号在电平转换过程中形成公共阻抗干扰,选择合适的接地点可以有效地抑制地线噪声。
四、硬件监控电路
在单片机系统中,为了保证系统可靠、稳定地运行,增强抗干扰能力,需要配置硬件监控电路,硬件监控电路从功能上包括以下几方面。
①上电复位:保证系统加电时能正确启动。
②掉电复位:当电源失效或电压降到某一电压值以下时,产生复位信号对系统进行复位。
③电源监测:供电电压出现异常时,给出报警指示信号或中断请求信号。
④硬件看门狗:当处理器遇到干扰或程序运行混乱产生“死锁”时对系统进行复位。
五、PCB电路合理布线
PCB设计的好坏对抗干扰能力影响很大,因此在进行PCB设计时,必须遵守PCB设计的一般原则,并应符合抗干扰设计的要求。下面着重说明两点。
①关键器件放置
在器件布置方面与其他逻辑电路一样,应把相互有关的器件尽量放得靠近些,从而可以获得较好的抗噪声效果。时钟发生器、晶振和CPU的时钟输入端都易产生噪声,要相互靠近些;CPU复位电路、硬件看门狗电路要尽量靠近CPU相应引脚;易产生噪声的器件、大电流电路等应尽量远离逻辑电路。
②D/A、A/D转换电路地线的正确连接
D/A、A/D芯片及采样芯片均提供了数字地和模拟地,分别有相应的引脚。在线路设计中,必须将所有器件的数字地和模拟地分别相连,但数字地与模拟地仅在一点上相连。另外,也可以采用屏蔽保护,屏蔽可用来隔离空间辐射。对噪声特别大的部件(如变频电源、开关电源)可以用金属盒罩起来以减少噪声源对单片机的干扰,对容易受干扰的部分可以增加屏蔽罩并接地,使干扰信号被短路接地。
六、软件抗干扰原理及方法
尽管采取了硬件抗干扰措施,但由于干扰信号产生的原因错综复杂,且具有很大的随机性,很难保证系统完全不受干扰。因此,往往在硬件抗干扰措施的基础上采取软件抗干扰技术加以补充,作为硬件措施的辅助手段。软件抗干扰方法具有简单、灵活方便、耗费低等特点,在系统中被广泛应用。
①数字滤波方法
数字滤波是在对模拟信号多次采样的基础上,通过软件算法提取最逼近真值数据的过程。数字滤波的算法灵活,可选择权限参数,其效果往往是硬件滤波电路无法达到的。
②输入信号的重复检测方法
输入信号的干扰是叠加在有效电平信号上的一系列离散尖脉冲,作用时间很短。当控制系统存在输入干扰,又不能用硬件加以有效抑制时,可用软件重复检测的方法达到“去伪存真”的目的,直到连续两次或连续两次以上的采集结果完全一致时方为有效。若信号总是变化不定,在达到最高次数限额时,则可给出报警信号。对于来自各类开关型传感器的信号,如限位开关、行程开关、操作按钮等,都可采用这种输入方式。如果在连续采集数据之间插入延时,则能够对付较宽的干扰。
③输出端口数据刷新方法
开关量输出软件抗干扰设计主要采取重复输出的方法,这是一种提高输出接口抗干扰性能的有效措施。对于那些用锁存器输出的控制信号,这些措施很有必要。在尽可能短的周期内,将数据重复输出,受干扰影响的设备在还没有来得及响应时正确的信息即到来,这样就可以及时防止误动作的产生。在程序结构的安排上,可为输出数据建立一个数据缓冲区,在程序的周期性循环体内将数据输出。对于增量控制型设备不能这样重复送数,只有通过检测通道从设备的反馈信息中判断数据传输的正确与否。在执行重复输出功能时,对于可编程接口芯片,工作方式控制字与输出状态字一并重复设置,从而使输出模块可靠工作。
④软件拦截技术
当窜入单片机系统的干扰作用在CPU部位时,后果更加严重,会使系统失灵。最典型的故障是破坏程序计数器(PC)的状态,导致程序从一个区域跳转到另一个区域,或者程序在地址空间内“乱飞”,或者陷入“死循环”。使用软件拦截技术可以拦截“乱飞”的程序或者使程序摆脱“死循环”,并将运行程序纳入正轨,转到指定的程序入口。
⑤“软件看门狗”技术
PC受到干扰而失控,引起程序“乱飞”,也可能使程序陷入“死循环”。当软件拦截技术不能使失控的程序摆脱“死循环”的困境时,通常采用程序监视技术WDT TIMER,又称“看门狗”技术,使程序脱离“死循环”。WDT是一种软硬件结合的抗程序跑飞措施,其硬件主体是一个用于产生定时T的计数器或单稳触发器,该计数器或单稳触发器基本独立运行,其定时输出端接至CPU的复位线,而其定时清零则由CPU控制。在正常情况下,程序启动WDT后,CPU周期性地将WDT清零,这样WDT的定时溢出就不会发生,如同睡眠一般不起任何作用。在受到干扰的异常情况下,CPU时序逻辑被破坏,程序执行混乱,不可能周期性地将WDT清零,从而当WDT的定时溢出时,其输出使系统复位,避免CPU因一时干扰而陷入瘫痪状态。
如何优雅的屏蔽别人的警告?
或许刚入门的小菜鸟都会被学长告知,警告不用管,没有错误就行!
正是这一句话,导致很多初学者都不会注意警告问题。
鱼鹰当时也是这样被教育的,但没听。
无它,既然编译器报出了警告,那就说明有不合理的地方,肯定可以想办法解决的。所以,不管是警告还是错误,鱼鹰都会一个个上网寻找解决方案,因此,鱼鹰的工程基本都是 0 警告,0 错误(当然 0 错误是必须的,不然无法生成目标文件)。
最常见的警告是有个函数没有声明,或者有个变量声明了没有使用,这里介绍一种快速解决该警告的方法:
函数没有声明:
这样,只要在使用前声明即可(C99模式)。虽然不是很规范,但这是最快解决该类警告的方式,比每次编译跳出一堆警告好得多了。
变量没有使用,一般是打印需要或者调试需要,定义了变量,没有使用或者仅仅是赋值,没有读取该变量的操作 ,此时可以采用如下方式解决:
这两种警告确实无伤大雅,但有些警告如果你不关注的话,程序运行异常是很正常的事情(比如函数没有定义),所以鱼鹰的建议是 0 警告,这样,每次编译跳出警告时,你都可以快速定位这个是不是自己新改代码的警告,同时可以发现自己代码隐藏的问题。
那么,如果别人实在是不愿意处理警告又该如何呢?
在稍大一些的项目,一般都是由多人合作开发的,如果同事上传的代码存在警告,而他又一直没有处理,同时你自己又不能随便修改别人的代码。
你在开发时,每次跳出一个警告,你都要看一下这个警告是不是自己代码产生的(强迫症),而代码修改、编译是常有的事情,这样势必影响自己的开发进度。
还有一种情况是,使用别人的开源代码,这个源代码可能是很久以前写的,以前编译器可以通过这种写法,到现在的编译器可能就无法通过了,但同时你测试发现,这些警告不会影响功能。
那么是否可以屏蔽这些文件的警告呢?
有些人在工程里面直接屏蔽了所有警告:
这对于其他需要警告来保证开发效率的人来说,这就是灾难,因为前面鱼鹰说过,一些警告不可忽视。
还有一种稍好一些的是屏蔽部分特定警告:
但是这些配置都会对整个工程产生作用,是否有一种更好的方法,只屏蔽部分文件,其他文件的警告不受影响呢?
事实上,MDK 软件已经提供了这个功能。前面提到的那种对整个工程设置的方式是最常用的,接下来还有两种不是很常用的:
对某个文件关闭警告:打开配置选项
选择 C/C++ 选项卡
此时,你可以看到熟悉的配置选项,按照需要配置即可。
并且这些配置只针对一个文件有效果,对其他文件不起作用。
对某个文件夹关闭警告:MDK 使用了虚拟文件夹,虽然不存在于实际文件系统中,但方便我们管理工程文件,同时也给了我们配置该文件夹的可能。
这样,如果有太多文件需要关闭警告,我们可以将其整合在一块,一次性关闭这些文件的警告(比如将有警告的开源代码放一起)。
当然,我们也可以据此来关闭某些特定警告,而不必将所有警告都关闭了,方法和对整个工程配置那里类似。
除此之外,我们还可以通过在代码中添加特定内容来达到消除警告的目的,比如(一般这种代码如果没有使用的话,将产生警告,只能屏蔽它):
或者明确指定该代码不应该发出某种警告。
因为这些内容鱼鹰也用的不是很多,就不再细说。
相关问答
单片机 怎么 屏蔽 中断?在单片机程序中屏蔽中断就可以了,实际编程时使用。在单片机程序中屏蔽中断就可以了,实际编程时使用。
pic 单片机 中tris和port是什么意思,怎么理解,怎么用,是走能做输出又能做输入, 屏蔽 高四位是?PORT是端口I/O寄存器(如PORTA、PORTB…)写PORTx寄存器就是将数据值写入该端口锁存器。读PORTx寄存器就是读取I/O引脚上的数据值。TRIS是端口I/O控制寄存...
单片机 全局中断为什么可以避免中断嵌套?一般而言中断能不能嵌套,在于此中断的优先级高不高,且此单片机支持抢占式,那么中断优先级低的自然不能打断优先级高的,再者,一般单片机还有一个可屏蔽中断EM...
单片机 控制大电流器件,如何实现电路隔离?单片机控制大电流器件,如何实现电路隔离?单片机用在工业现场,出现异常状况多数是源自于干扰,造成程序跑飞、控制失灵,有时出现严重事故。根据题目说的,单...单...
8051 单片机 如何设置中断优先级?8051单片机中断优先级可以通过IP寄存器进行设置。IP寄存器的高3位分别表示外部中断0、外部中断1和定时器中断的优先级,其中高位表示优先级高。可以通过设置IP...
51 单片机 优点?单片机优点如下:1、有优异的性能价格比目前国内市场上,有些单片机的芯片只有人民币几元,加上少量外围元件,就能构成一台功能相当丰富的智能化控制装置。2...
400Hz的高电压会对 单片机 有射频干扰吗?主要是工频50HZ的干扰吧。射频没有。越是有大变压器和大功率电机的周围,干扰越强。工频的穿透力很强,一般的铁盒都屏蔽不了。除了用屏蔽盒,也想办法做个接地...
otp 单片机 的特点?otp单片机具有以下特点:1、有优异的性能价格比目前国内市场上,有些单片机的芯片只有人民币几元,加上少量外围元件,就能构成一台功能相当丰富的智能化控制装...
单片机 调用中断服务子程序和调用子程序的区别是什么?基于51单片机中断跳出指令“RETI”浅议"最近在基于51单片机编程的过程中出现了个很奇怪的问题“程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF...
深圳 单片机 开发,工资如何突破月薪15k?你好,作为一个实际走过这条路的单片机开发者可以和你分享一些经验。在某招聘网站上的截图,首先先给你看看,在深圳这个地方,是有公司愿意开超过15K来招单片机...