单片机

平时我们看到的单片机最小系统中一般都是有时钟电路,见得太多以至于习以为常,突然之间问起来为什么要有晶振呢?一般我们就答晶振就像人的心跳,哈哈,但是到底他是怎么工作的呢,本期我们一探究竟。


一、晶振旁边的电容是什么用?可不可以不要?

如上图是51单片机晶振的典型应用电路,一般晶振旁边会带两个30pf或者20pf的电容,这个电容叫做负载电容,这个电容不加也是可以使用的。如果电路不加负载电容,则电路会工作在晶体谐振频率上。这里我们假设晶体的谐振频率为Fr,而加了电容的谐振频率为有载谐振频率我们设为FL,则晶体谐振频率Fr与晶体有载谐振频率FL的关系是:FL=Fr + Ts*CL,其中Ts为晶体的牵引量,单位为ppm/pF。CL为晶体的负载电容,即晶体旁边加的那个电容,单位为pF。所以说不加电容也是可以的,只是电路会工作在晶体谐振频率上即FL=Fr;

当晶体发生谐振后,会呈现为纯电阻,即谐振阻抗。在有载谐振中,谐振电阻一般会与负载电容呈反比例关系。也就是说负载电容越小,电路的谐振阻抗越高,就越不容易起振,输出波形幅度就越小。但是电路直接工作在晶体谐振频率的状态是非常理想化的,我们一般的电路都或多或少的有一些杂散电容,当电路振荡时,这些杂散电容便被视为晶体的负载电容进行工作。由于这些杂散电容一般都很小,且不稳定,这就造成晶体振荡频率不稳定,且谐振阻抗增高,不同的人设计的地电路走线不一样,杂散电容也不同。

既然有杂散电容存在,那么上面的公式实际应该是:FL = Fr + Ts*(Cy+CL),其中Cy为杂散电容,那么根据不同的电容可以调整CL值,直到电路工作在你所要的频率上,比如51单片机的12MHz。一般时候这个负载电容CL值不要太小,上面说过电容太小,谐振阻抗会变高,不利于起振且输出幅度小。所以这个电容值一般选取在10至30pF之间,22或30pf也是一种经验数值,此时由于负载电容CL值远远大于杂散电容Cy值,因此对杂散电容的不稳定性可以忽略不计,那么加了负载电容的电路就会更稳定,频率更准确。

二、晶振的作用

通过上面的介绍我们了解了晶振的典型电路,而平时我们也有看到晶振和电容封装在一起的,也有的单片机不需要接外部晶振而是直接使用内部晶振,总之,无论我们看见看不见,单片机工作是需要晶振的,这是单片机能正常工作的必要条件之一。

晶振,一般我们指的是石英晶体振荡器,是一种高精度和高稳定度的振荡器。通过一定的外接电路来,可以生成频率和峰值稳定的正弦波,它是一种无源晶振。而单片机在运行的时候,需要一个脉冲信号,作为自己执行指令的触发信号,可以简单的想象为:单片机收到一个脉冲,就执行一次或多次指令,这也就是所谓的心跳。无论是简单的51单片机,还是手机里的ARM处理器都是需要晶振的,只是晶振的种类和频率不同。我们本期侧重点是51单片机晶振,别的都类似。 

单片机工作时,是一条一条地从ROM中取指令,然后一步一步地执行。单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。—个机器周期包括12个时钟周期。如果一个单片机外接了一个12MHz的晶振,那么它的时钟周期就是1/12us,它的一个机器周期是12×(1/12)us,也就是1us。

在51单片机的所有指令中,有一些完成比较快的指令,只要一个机器周期就行了,有一些完成得比较慢,得要2个机器周期,还有两条指令要4个机器周期才可以运行完毕。为了衡量指令执行时间的长短,又引入一个新的概念:指令周期。所谓指令周期就是指执行一条指令的时间。

例如,当需要计算DJNZ指令完成所需要的时间时,首先必须要知道晶振的频率,假如我们使用12兆赫兹晶振,那么一个机器周期就是1us,而DJNZ指令是双周期指令,所以执行一次就要2us。如果该指令需要执行500次,那就是1000us,也就是1ms。

机器周期不仅对于指令执行有着重要的意义,而且它也是单片机定时器和计数器的时间基准。比如我们常见的51单片机,通常晶振选择12兆赫兹,那么当定时器的数值加1时,实际经过的时间就是1us,这就是单片机的定时原理。

说白了,晶振就是给单片机提供工作信号脉冲,这个脉冲就是单片机的工作速度,比如12兆晶振,单片机工作速度就是每秒12兆。

来源:单片机仿真

围观 4

作为一个电子工程师,在大众的眼里,你们似乎拥有麒麟臂,上能九天揽月,下可五洋捉鳖,抄板、焊板、画板、仿真、编程、调试、创意什么的通通不在话下。

今天,小编要给各位大佬介绍几款非常实用的单片机小工具,涉及调试、计算、设计、自动代码生成等。

点击此处下载软件包

第1款:555定时器自动计算工具,想要什么频率,想要什么占空比,输入要求,点一下开始计算,然后结果就出来了!!!

第2款:串口调试助手,单片机和电脑串口通信必备的工具!

第3款:色环电阻计算器,输入色环电阻的颜色,然后阻值和精度就会自动计算出来!

第4款:51单片机定时器初值计算工具,想用哪个定时器,哪个定时方式,多大的晶体,多长的延时,输入你的要求,自动计算出来!

第5款:51单片机波特率计算工具,功能虽然不算多,但完全足够了,输入波特率或者晶振频率再点击计算按钮马上就会显示结果!

第6款:单片机代码自动生成器,不管是51单片机还是AVR单片机,只要输入你的要求,哪一组IO口高低电平,哪一个定时器延时多少,SPI口如何配置。点一下代码生成,自动输出代码!

第7款:LED代码查询,可快速查询并直接显示LED代码,根本不用自己记,此外还可以查询任意自定义接法的代码!

第8款:LCD汉字取模软件,配合lcmsim排版仿真软件一起使用,可以大大提高单片机编程的工作效率。

第9款:虚拟示波器,这是一款可以在电脑上使用的虚拟示波器软件,可自动扫描串口,并设置多种波特率,显示出来的波形会自动适应屏幕,不管是测试还是设计,用这款软件准没错!

第10款:FilterPro(滤波器设计软件),经典的滤波器设计软件,TI出品,不用注册就可以用!

第11款:LC震荡频率计算工具,各栏输入数字后,自动计算频率,直接双击运行,无需安装。具体使用方法:只要输入电感L、电容C、频率F三者任意两者,可按相应按钮计算第三者!

第12款:BmpToPcb(bmp位图转PCB文件工具),这个软件可以将一幅BMP图形转换为PCB格式!

第13款:变压器设计软件,这款小工具不仅适合设计新手,同样也适合高级别的老手,妥妥的开关电源设计必备利器,赶紧去下载试式吧!

还有更多的小工具,小编就不一一列举了。

来源:电子发烧友网

围观 17

做电子硬件的同学都会用单片机做一些小玩意,学会单片机的硬件抗干扰方法也是一项必备技能。单片机系统中若是包含以下原件或模块,一般都要考虑防静电干扰的问题。  

1、微控制器时钟频率特别高,总线周期特别快的系统。  

2、系统含有大功率,大电流驱动电路,如产生火花的继电器,大电流开关等。  

3、含微弱模拟信号电路以及高精度A/D变换电路的系统。  

应对方法有:  

1、选用频率低的微控制器  

2、减小信号传输中的畸变 信号在印刷板上传输,其延迟时间不应大于所用器件的标称延迟时间。  

3、减小信号线间的交叉干扰。若AB线为一模拟信号,要避免数字电路信号线CD对AB的干扰,AB线下方要有大面积的地,AB线到CD线的距离要大于AB线与地距离的2~3倍。可用局部屏蔽地,在有引结的一面引线左右两侧布以地线。  

4、减小来自电源的噪声  电源在向系统提供能源的同时,也将其噪声加到所供电的电源上。电路中微控制器的复位线,中断线,以及其它一些控制线最容易受外界噪声的干扰。电网上的强干扰通过电源进入电路,即使电池供电的系统,电池本身也有高频噪声。模拟电路中的模拟信号更经受不住来自电源的干扰。  

5、元件布置要合理分区  元件在印刷线路板上排列的位置要充分考虑抗电磁干扰问题,原则之一是各部件之间的引线要尽量短。在布局上,要把模拟信号部分,高速数字电路部分,噪声源部分(如继电器,大电流开关等)这三部分合理地分开,使相互间的信号耦合为最小。

6、处理好接地线  印刷电路板上,电源线和地线最重要。克服电磁干扰,最主要的手段就是接地。

对于双面板,地线布置特别讲究,通过采用单点接地法,电源和地是从电源的两端接到印刷线路板上来的,电源一个接点,地一个接点。印刷线路板上,要有多个返回地线,这些都会聚到回电源的那个接点上,就是所谓单点接地。所谓模拟地、数字地、大功率器件地开分,是指布线分开,而最后都汇集到这个接地点上来。与印刷线路板以外的信号相连时,通常采用屏蔽电缆。对于高频和数字信号,屏蔽电缆两端都接地。低频模拟信号用的屏蔽电缆,一端接地为好。

对噪声和干扰非常敏感的电路或高频噪声特别严重的电路应该用金属罩屏蔽起来。 

来源:至秦单片机

围观 9

引言

我在学习STM32芯片的GPIO模块时对一些细节感到困惑,Demystifying Microcontroller GPIO Settings这篇文章几乎解答了我所有的疑问。因此将它翻译出来,希望对大家有帮助。

写单片机软件的人都会配置和管理通用输入输出口(GPIO)的引脚。表面上看,GPIO配置非常简单:引脚是输入或输出,是高电平或低电平。但是,你不可避免地会碰到配置选项很多的芯片,或者电子工程师会问一些你不懂的引脚配置(比如将某条线设置成高阻态)。本文会帮助你理解现代单片机上不同的引脚配置。

背景知识

在学习引脚配置之前,先要弄懂一些和GPIO、IO信号有关的描述和名词。

大多数现代GPIO线路都实现成一个三态缓冲器(tri-state buffer)。这表明这些GPIO线路可以有三个状态:

1. 逻辑低电平(和GND相连)
2. 逻辑高电平(和VCC相连)
3. 高阻抗,也称为“悬空”(floating)、高阻(Hi-Z)和三态(tri-stated)

如果某条线路是高阻抗(High-impedance)状态,那么它实际上就从电路中移除了。这使得多个电路或设备能够共用输出线路,就可以实现通信总线(communication buses)。在需要高阻抗的场合但没能使用高阻态会导致I/O争用(I/O contention)和短路(short-circuit)。

如果信号的状态不确定,则称为悬空(Floating),表示它没有连接到VCC或GND。该信号的电压会“悬空”,和残余电压匹配。“悬空”这个名词还可以用来描述引脚是高阻抗状态。

上拉(Pull-Up)是指将信号通过电阻连接到VCC,上拉电阻用于将悬空的信号设置成一个默认状态。当输入引脚处于高阻抗模式且没有外部源驱动它时,引脚就处于悬空状态,电压值是残余电压。引脚没有主动的驱动时,上拉电阻强行将信号电压变成VCC,避免引脚悬空。当其他的源将信号拉低(连接到GND),就忽略上拉电阻,输入引脚会读到低电平。很多单片机提供内置的上拉配置选项。有时候,需要在芯片外部上拉一个特定阻值的电阻,而非使用内部的上拉电阻。

下拉(Pull-Down)是将信号通过一个电阻连接到GND。下拉电阻用于将悬空的信号设置到某个默认状态。如果其他的源将信号拉高(连接到VCC),就忽略下拉电阻,输入引脚会读到高电平。很多单片机提供内置的下拉配置选项。有时候,需要在芯片外部下拉一个特定阻值的电阻,而非使用内部的下拉电阻。

电流阱(Current Sink)表示电流流入引脚、结点或信号中。对于数字I/O口,电流阱为负载提供了GND连接端。电流源(Current Source)和电流阱相反,表示电流流出引脚、结点或信号中。对于数字I/O口,电流阱为负载提供了电压源。电流阱和电流源都有电流流动,但方向相反。

输入输出模式

GPIO输入模式

如果配置GPIO为输入,就可以读取电子信号的状态。配置GPIO为输入,引脚就是高阻抗状态。总体来说,GPIO输入主要配置成下面三种方式:

1. 高阻抗(默认,没有驱动则是悬空状态)
2. 上拉(内部连接到VCC的电阻)
3. 下拉(内部连接到GND的电阻)

大多数GPIO输入引脚内部有可以防止引脚状态虚假变化的迟滞模块。迟滞模块是内置特性,而不是配置选项。

GPIO输出模式
如果GPIO配置成输出,可以驱动一个信号为高电平或低电平。GPIO输出主要有两个选项:推拉(push-pull)和开漏(open-drain)。

推拉输出

推拉(也有翻译成“推挽”)输出是大多数场景下GPIO输出的默认配置。推拉输出的GPIO既能灌电流(source)也能拉(sink)电流。推拉输出的GPIO中,有一个连接到VCC或GND的三极管来驱动信号为高电平或低电平。当输出是低电平,信号就被主动地拉(pull)到GND,如果输出是高电平,信号就被主动地推(push)到VCC。

开漏输出

和推拉模式不同的是,开漏输出只能拉电流。输出有两种状态:低电平和高阻抗。想在线路上输出一个高电平,需用上拉电阻将开漏输出连接到想要的输出电平。你可以将开漏输出GPIO想象成一个接地或断开的开关。

开漏GPIO可以典型地配置成两种模式:开漏或内部上拉的开漏。大多数使用开漏电路的应用在开漏输出上使用外部上拉电阻。一般来说,内部上拉电阻的阻值对目标电路是不够的。

当多个门或引脚连接到一起时,开漏输出会很有用,比如I2C总线。当设备没有在用总线时,开漏输出处于高阻抗模式,电压被上拉电阻拉高。当设备将输出拉低时,所有连接到一起的线路都是低电平。

开漏输出的另一个用途是在单片机上用多个外部设备驱动一个主动拉低的中断引脚。

集电极开路(Open-Collector)
集电极开路和漏极开路的功能一样。集电极开路指的是从BJT输出拉电流,漏极开路指的是从FET输出拉电流。我在元器件数据手册上比在单片机数据手册上碰到集电极开路更多一些。

GPIO速度

GPIO速度控制转换速度(slew rate),也就是信号在高低电平直接转换的速度(上升速度和下降速度)。速度控制选项描述为“速度”、“转换速度”、“频率”和“高频模式”。提高GPIO速度可以提高输出电压(减小上升时间)改变的速度。但是,功耗和发射到电路中的噪声也会随着GPIO速度升高。一般来讲,没有特殊原因的话,应该降低GPIO速度。

本文作者: Krist Pan
本文链接:
http://panqiincs.me/2019/09/25/mcu-gpio-settings/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

围观 8

在单片机开发过程中,我们总被代码的执行效率、单片机器件的性能、成本困扰着,以至于用很长时间思考这类问题,这是难以避免的,毕竟开发过程中的性价比、执行效率等因素都是十分重要的考量因素。为了让大家更高效率的开发,小编总结了几个技巧,帮助大家进阶,在优秀的开发者路上越走越远!

如何提高C的代码效率?

用C语言进行单片机程序设计是单片机开发与应用的必然趋势。如果使用C编程时,要达到最高的效率,最好熟悉所使用的C编译器。 先试验一下每条C语言编译以后对应的汇编语言的语句行数,这样就可以很明确的知道效率。在今后编程的时候,使用编译效率最高的语句。

各种C编译器都会有一定的差异,故编译效率也会有所不同,优秀的嵌入式系统C编译器代码长度和执行时间仅比以汇编语言编写的同样功能程度长 5-20%。

虽然C语言是最普遍的一种高级语言,但由于不同的MCU厂家其C语言编译系统是有所差别的,特别是在一些特殊功能模块的操作上。所以如果对这些特性不了解,那么调试起来问题就会很多,反而导致执行效率低于汇编语言。

如何解决单片机的抗干扰性问题?

防止干扰最有效的方法是去除干扰源、隔断干扰路径,但往往很难做到,所以只能看单片机抗干扰能力够不够强了。单片机干扰最常见的现象就是 复位;至于程序跑飞,其实也可以用软件陷阱和看门狗将程序拉回到复位状态;所以单片机软件抗干扰最重要的是处理好复位状态。

一般单片机都会有一些标志寄存 器,可以用来判断复位原因;另外你也可以自己在RAM中埋一些标志。在每次程序复位时,通过判断这些标志,可以判断出不同的复位原因;还可以根据不同的标 志直接跳到相应的程序。这样可以使程序运行有连续性,用户在使用时也不会察觉到程序被重新复位过。

如何测试单片机系统的可靠性?

对于不同的单片机系统产品会有不同的测试项目和方法,但是有一些是必须测试的:

测试单片机软件功能的完善性。这是针对所有单片机系统功能的测试,测试软件是否写的正确完整。

上电、掉电测试。在使用中用户必然会遇到上电和掉电的情况,可以进行多次开关电源,测试单片机系统的可靠性。

老化测试。测试长时间工作情况下,单片机系统的可靠性。必要的话可以放置在高温,高压以及强电磁干扰的环境下测试。

ESD和EFT等测试。可以使用各种干扰模拟器来测试单片机系统的可靠性。例如使用静电模拟器测试单片机系统的抗静电ESD能力;使用突波杂讯模拟器进行快速脉冲抗干扰EFT测试等等。

来源:网络,转载此文目的在于传递更多信息,版权归原作者所有。

围观 27

1. 接地

这里的接地指接大地,也称作保护地。为单片机系统提供良好的地线,对提高系统的抗干扰能力极为有益。特别是对有防雷击要求的系统,良好的接地至关重要。上面提到的一系列抗干扰元件,意在将雷击、浪涌式干扰以及快脉冲群干扰去除,而去除的方法都是将干扰引入大地,如果系统不接地,或虽有地线但接地电阻过大,则这些元件都不能发挥作用。为单片机供电的电源的地俗称逻辑地,它们和大地的地的关系可以相通、浮空、或接一电阻,要视应用场合而定。不能把地线随便接在暖气管子上。绝对不能把接地线与动力线的火线、零线中的零线混淆。

2. 隔离与屏蔽

典型的信号隔离是光电隔离。使用光电隔离器件将单片机的输入输出隔离开,一方面使干扰信号不得进入单片机系统,另一方面单片机系统本身的噪声也不会以传导的方式传播出去。屏蔽则是用来隔离空间辐射的,对噪声特别大的部件,如开关电源,用金属盒罩起来,可减少噪声源对单片机系统的干扰。对特别怕干扰的模拟电路,如高灵敏度的弱信号放大电路可屏蔽起来。而重要的是金属屏蔽本身必须接真正的地。

3. 滤波

滤波指各类信号按频率特性分类并控制它们的方向。常用的有各种低通滤波器、高通滤波器、带通滤波器。低通滤波器用在接入的交流电源线上,旨在让50周的交流电顺利通过,将其它高频噪声导入大地。低通滤波器的配置指标是插入损耗,选择的低通滤波器插入损耗过低起不到抑制噪声的作用,而过高的插入损耗会导致“漏电”,影响系统的人身安全性。高通、带通滤波器则应根据系统中对信号的处理要求选择使用。

来源:网络

围观 47

单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。

在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。

采用数字滤波算法克服随机干扰的误差具有以下优点:

1、数字滤波无需其他的硬件成本,只用一个计算过程,可靠性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。

2、数字滤波使用软件算法实现,多输入通道可共用一个滤波程序,降低系统开支。

3、只要适当改变滤波器的滤波程序或运算,就能方便地改变其滤波特性,这对于滤除低频干扰和随机信号会有较大的效果。

4、在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波等。

(1)限幅滤波算法

该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。A的大小由被测对象的具体情况而定,如果小于或等于允许的最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。

算法的程序代码如下:

#defineA //允许的最大差值
chardata; //上一次的数据
char filter()
{
chardatanew; //新数据变量
datanew=get_data(); //获得新数据变量
if((datanew-data)>A||(data-datanew>A))
return data;
else
returndatanew;
}

说明:限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到。

(2)中值滤波算法

该运算的过程是对某一参数连续采样N次(N一般为奇数),然后把N次采样的值按从小到大排列,再取中间值作为本次采样值,整个过程实际上是一个序列排序的过程。

算法的程序代码如下:

#define N11 //定义获得的数据个数
char filter()
{
charvalue_buff[N]; //定义存储数据的数组
char count,i,j,temp;
for(count=0;count
{
value_buf[count]=get_data();
delay(); //如果采集数据比较慢,那么就需要延时或中断
}
for(j=0;j
{
for(value_buff[i]>value_buff[i+1]
{
temp=value_buff[i];
value_buff[i]=value_buff[i+1];
value_buff[i+1]=temp;
}
}
returnvalue_buff[(N-1)/2];
}

说明:中值滤波比较适用于去掉由偶然因素引起的波动和采样器不稳定而引起的脉动干扰。若被测量值变化比较慢,采用中值滤波法效果会比较好,但如果数据变化比较快,则不宜采用此方法。

(3)算术平均滤波算法

该算法的基本原理很简单,就是连续取N次采样值后进行算术平均。

算法的程序代码如下:

char filter()
{
int sum=0;
for(count=0;count
{
sum+=get_data();
delay():
}
return (char)(sum/N);
}

说明:算术平均滤波算法适用于对具有随机干扰的信号进行滤波。这种信号的特点是有一个平均值,信号在某一数值附近上下波动。信号的平均平滑程度完全到决于N值。当N较大时,平滑度高,灵敏度低;当N较小时,平滑度低,但灵敏度高。为了方便求平均值,N一般取4、8、16、32之类的2的整数幂,以便在程序中用移位操作来代替除法。

(4)加权平均滤波算法

由于前面所说的“算术平均滤波算法”存在平滑度和灵敏度之间的矛盾。为了协调平滑度和灵敏度之间的关系,可采用加权平均滤波。它的原理是对连续N次采样值分别乘上不同的加权系数之后再求累加,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的认识。各个加权系数均小于1的小数,且满足总和等于1的结束条件。这样加权运算之后的累加和即为有效采样值。设D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci体现了各种采样值在平均值中所占的比例。一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。

样例程序代码如下:

char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区
char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
char count;
char value_buff[N];
int sum=0;
for(count=0;count
{
value_buff[count]=get_data();
delay();
}
for(count=0;count
sum+=value_buff[count]*jq[count];
return(char)(sum/sum_jq);
}

(5)滑动平均滤波算法

以上介绍和各种平均滤波算法有一个共同点,即每获取一个有效采样值必须连续进行若干次采样,当采速度慢时,系统的实时得不到保证。这里介绍的滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用。如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。

程序代码如下:

char value_buff[N];
char i=0;
char filter()
{
char count;
int sum=0;
value_buff[i++]=get_data();
if(i==N)
i=0;
for(count=0;count
sum=value_buff[count];
return (char)(sum/N);
}

(6)低通滤波

将普通硬件RC低通滤波器的微分方程用差分方程来表求,变可以采用软件算法来模拟硬件滤波的功能,经推导,低通滤波算法如下:

Yn=a* Xn+(1-a) *Yn-1

式中 Xn——本次采样值

Yn-1——上次的滤波输出值;

,a——滤波系数,其值通常远小于1;

Yn——本次滤波的输出值。

由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值(注意不是上次的采样值,这和加权平均滤波是有本质区别的),本次采样值对滤波输出的贡献是比较小的,但多少有些修正作用,这种算法便模拟了具体有教大惯性的低通滤波器功能。滤波算法的截止频率可用以下式计算:

fL=a/2Pit pi为圆周率3.14…

式中 a——滤波系数;

, t——采样间隔时间;

例如:当t=0.5s(即每秒2次),a=1/32时;

fL=(1/32)/(2*3.14*0.5)=0.01Hz

当目标参数为变化很慢的物理量时,这是很有效的。另外一方面,它不能滤除高于1/2采样频率的干搅信号,本例中采样频率为2Hz,故对1Hz以上的干搅信号应采用其他方式滤除,低通滤波算法程序于加权平均滤波相似,但加权系数只有两个:a和1-a。为计算方便,a取一整数,1-a用256-a,来代替,计算结果舍去最低字节即可,因为只有两项,a和1-a,均以立即数的形式编入程序中,不另外设表格。虽然采样值为单元字节(8位A/D)。为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。

设Yn-1存放在30H(整数)和31H(小数)两单元中,Yn存放在32H(整数)和33H(小数)中。

小结一下吧:数字滤波器,说白了,就是多次采样求平均值的一个过程,精确一点的,就是再顺序排列,去掉首位再求平均值,就是求平均数!!

本文转自:玩转单片机,转载此文目的在于传递更多信息,版权归原作者所有。

围观 225

影响单片机系统可靠安全运行的主要因素主要来自系统内部和外部的各种电气干扰,并受系统结构设计、元器件选择、安装、制造工艺影响。这些都构成单片机系统的干扰因素,常会导致单片机系统运行失常,轻则影响产品质量和产量,重则会导致事故,造成重大经济损失。

形成干扰的基本要素有三个:

(1)干扰源。指产生干扰的元件、设备或信号。如:雷电、继电器、可控硅、电机、高频时钟等都可能成为干扰源。

(2)传播路径。指干扰从干扰源传播到敏感器件的通路或媒介。典型的干扰传播路径是通过导线的传导和空间的辐射。

(3)敏感器件。指容易被干扰的对象。如:A/D、 D/A变换器,单片机,数字IC,弱信号放大器等。

1、干扰的耦合方式

(1)直接耦合:

这是最直接的方式,也是系统中存在最普遍的一种方式。比如干扰信号通过电源线侵入系统。对于这种形式,最有效的方法就是加入去耦电路。

(2)公共阻抗耦合:

这也是常见的耦合方式,这种形式常常发生在两个电路电流有共同通路的情况。为了防止这种耦合,通常在电路设计上就要考虑。使干扰源和被干扰对象间没有公共阻抗。

(3)电容耦合:

又称电场耦合或静电耦合。是由于分布电容的存在而产生的耦合。

(4)电磁感应耦合:

又称磁场耦合。是由于分布电磁感应而产生的耦合。

(5)漏电耦合:

这种耦合是纯电阻性的,在绝缘不好时就会发生。

2、常用硬件抗干扰技术

针对形成干扰的三要素,采取的抗干扰主要有以下手段。

2.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.2、切断干扰传播路径

按干扰的传播路径可分为传导干扰和辐射干扰两类。

所谓传导干扰是指通过导线传播到敏感器件的干扰。高频干扰噪声和有用信号的频带不同,可以通过在导线上增加滤波器的方法切断高频干扰噪声的传播,有时也可加隔离光耦来解决。电源噪声的危害最大,要特别注意处理。

所谓辐射干扰是指通过空间辐射传播到敏感器件的干扰。一般的解决方法是增加干扰源与敏感器件的距离,用地线把它们隔离和在敏感器件上加屏蔽罩。

切断干扰传播路径的常用措施如下:

(1)充分考虑电源对单片机的影响。电源做得好,整个电路的抗干扰就解决了一大半。许多单片机对电源噪声很敏感,要给单片机电源加滤波电路或稳压器,以减小电源噪声对单片机的干扰。比如,可以利用磁珠和电容组成π形滤波电路,当然条件要求不高时也可用100Ω电阻代替磁珠。

(2)如果单片机的I/O口用来控制电机等噪声器件,在I/O口与噪声源之间应加隔离(增加π形滤波电路)。

(3)注意晶振布线。晶振与单片机引脚尽量靠近,用地线把时钟区隔离起来,晶振外壳接地并固定。

(4)电路板合理分区,如强、弱信号,数字、模拟信号。尽可能把干扰源(如电机、继电器)与敏感元件(如单片机)远离。

(5)用地线把数字区与模拟区隔离。数字地与模拟地要分离,最后在一点接于电源地。A/D、D/A芯片布线也以此为原则。

(6)单片机和大功率器件的地线要单独接地,以减小相互干扰。大功率器件尽可能放在电路板边缘。

(7)在单片机I/O口、电源线、电路板连接线等关键地方使用抗干扰元件如磁珠、磁环、电源滤波器、屏蔽罩,可显著提高电路的抗干扰性能。

2.3、提高敏感器件的抗干扰性能

提高敏感器件的抗干扰性能是指从敏感器件这边考虑尽量减少对干扰噪声的拾取,以及从不正常状态尽快恢复的方法。

提高敏感器件抗干扰性能的常用措施如下:

(1)布线时尽量减少回路环的面积,以降低感应噪声。

(2)布线时,电源线和地线要尽量粗。除减小压降外,更重要的是降低耦合噪声。

(3)对于单片机闲置的I/O口,不要悬空,要接地或接电源。其它IC的闲置端在不改变系统逻辑的情况下接地或接电源。

(4)对单片机使用电源监控及看门狗电路,如: IMP809,IMP706,IMP813, X5043,X5045等,可大幅度提高整个电路的抗干扰性能。

(5)在速度能满足要求的前提下,尽量降低单片机的晶振和选用低速数字电路。

(6)IC器件尽量直接焊在电路板上,少用IC座。

2.4、其它常用抗干扰措施

(1)交流端用电感电容滤波:去掉高频低频干扰脉冲。

(2)变压器双隔离措施:变压器初级输入端串接电容,初、次级线圈间屏蔽层与初级间电容中心接点接大地,次级外屏蔽层接印制板地,这是硬件抗干扰的关键手段。次级加低通滤波器:吸收变压器产生的浪涌电压。

(3)采用集成式直流稳压电源: 有过流、过压、过热等保护作用。

(4)I/O口采用光电、磁电、继电器隔离,同时去掉公共地。

(5)通讯线用双绞线:排除平行互感。

(6)防雷电用光纤隔离最为有效。

(7)A/D转换用隔离放大器或采用现场转换:减少误差。

(8)外壳接大地:解决人身安全及防外界电磁场干扰。

(9)加复位电压检测电路。防止复位不充分, CPU就工作,尤其有EEPROM的器件,复位不充份会改变EEPROM的内容。

(10)印制板工艺抗干扰:

① 电源线加粗,合理走线、接地,三总线分开以减少互感振荡。

② CPU、RAM、ROM等主芯片,VCC和GND之间接电解电容及瓷片电容,去掉高、低频干扰信号。

③ 独立系统结构,减少接插件与连线,提高可靠性,减少故障率。

④ 集成块与插座接触可靠,用双簧插座,最好集成块直接焊在印制板上,防止器件接触不良故障。

⑤ 有条件的采用四层以上印制板,中间两层为电源及地。

来源:电子产品世界

围观 166

I/O口是单片机与外界联系的通道。它可对各类外部信号(开关量、模拟量、频率信一号)进行检测、判断、处理,并可控制各类外部设备。单片机通过I/O口感知外界的存在,而外界也通过I/O口感知单片机的存在。


现在的单片机I/O口已经集成了更多的特性和功能。因此,在学习某一款单片机时,需要先了解其I/O口具有哪些特性和特殊的应用功能(不同的单片机是有所差别的),并因地制宜设计外围电路、编写控制软件,充分发挥该I/O口的优势。


1. 输入/输出概念

大多数I/O口都是双向三态的。根据具体应用情况,可以分为输入口和输出口。输人口用来读取外部输人的电平信号,输出口则用于对外输出一个电平信号。

有些单片机(如PIC)允许设置I/O口的输入/输出状态。这样做的好处是可以让I/O口适应更多的应用环境:当I/O口处于输入状态时,对外表现为“高阻态”;而当I/O口处于输出状态时,对外可以提供更大的灌电流或拉电流,这样可以直接驱动一些如LED之类的负载。无需再外扩驱动电路了。

2. 输入门槛电平

对于51系列单片机来说,输入电平低于0.7V就是低电平,高于1. 8 V就是高电平。如果输入的电平介于二者之间,那么CPU在读取该I/O口时可能会得到一个不确定的错误数据。一般来说,我们不希望输入口上出现这种模棱两可的电平状态(除非那个口是ADC检测口)。

3. 最大输出电流

这个特性是针对输出来讲的。最大输出电流包括两种:灌电流和拉电流。灌电流是指当I/O口输出“0”(低电平)时允许灌人(流入)该I/O口的电流;拉电流则是指当I/O口输出“1"(高电平)时允许流出的电流。

4. 输出电平

这个特性是也针对输出来讲的,包括两种:“0”(低电平电压)和“1"(高电平电压)。理想状态上来说,输出高电平应该等于单片机的工作电压Vcc。但是实际由于内阻的关系,输出高电平会略低于Vcc。尤其是当拉电流较大时,高电平会被进一步拉低。同样的道理,输出低电平也往往不是正好等于0V,而是有可能比0V高出一点。

5. I/O口附加功能

许多单片机都为I/O口集成了许多新的功能控制,包括内部上拉/下拉电阻功能、R-op-TION功能以及漏极(或集电极)开路功能。如果能够合理地使用这些功能,就可以简化外围工作电路。

6. I/O口功能的拓展与复用

包括中断、唤醒、ADC检测以及PWM输出等。

本文转自:电工学习网,转载此文目的在于传递更多信息,版权归原作者所有。

围观 111

页面

订阅 RSS - 单片机