单片机

单片机(Microcontroller, MCU)是一种集成了计算机功能的微型计算机,通常由一个微处理器(CPU)、存储器(ROM、RAM)、输入/输出接口、定时器/计数器等功能模块集成在同一芯片上。单片机是一种常用于嵌入式系统中的控制器,它被广泛应用于家电、汽车、工业自动化、医疗设备、消费电子、物联网(IoT)设备等多个领域。

下面介绍了基于PIC单片机与16位串行D/A转换的原理:

1.基本原理

D/A转换器相当于一种译码电路,它将数字输入传换为模拟输出:

其中,D是数字输入,VR是模拟参考输入,Vo是模拟输出。这里模拟输出可以是电压,也可以是电流,式中 数字D是一个小于1的值。

式中an为1或0,由数字对应位的逻辑电平来决定,N是数字输入D的位数。由此(3.2)由此(3.1)

当参考电压输入TIp.固定时,转换器的模拟输出D成正比关系。对于单位数字量的变化,模拟输出是按等 幅度的阶跃量变化的。

2.原理图

(1)串行D/A转换器。

串行D/A转换器一般由数字输入、基准电压源、模拟开关、电阻或电容网络、加法电路、运算放大器、模 拟输出等组成,如图1所示,根据集成度不同D/A转换器中可能不全包括其中的部分。图2所示为这种转换器 的原理图。


图1 集成D/A转换器的组成框图


图2 串行D/A转换器

数模转换器的基本工作原理是基于权的控制,即权电压或权电流相加。D/A转换器的几种常见结构,根据加 权网络等部分实现方法的不同,常见的DAC结构有电流型、电压型、电荷型等,每一类又细分为若干小类, 接下来将分别进行介绍。

(2)权电阻型D/A转换器。

权电阻型D/A转换器的电路框图如图3所示。


图3 权电阻型D/A转换器的电路框图

权电阻型D/A转换器是实现二进制数模转换的最简单的一种网络结构。其缺点是位数增多时,电阻的取值范 围很大,如要实现8位D/A转换器,电阻比值将高达128∶1,这一比值在工艺制造上难以实现,并且该结构对 于电阻精度的苛刻要术也使得的这结构的实现更加困难。

(3)R-2R梯形电阻网络D/A转换器。

图4所示为R-2R梯形电阻网络D/A转换器的电路原理框图。


图4 R-2R梯形电阻网络D/A转换器

(4)电流衰减型D/A转换器如图5所示。


图5 电流衰减型D/A转换器

总结:以上就是基于PIC单片机与16位串行D/A转换的原理,可以广泛的运用到需要进行D/A转换的场合中。

来源:畅学单片机

围观 159

排阻的阻值读取

在三位数字中,从左至右的第一、第二位为有效数字,第三位表示前两位数字乘10的N次方(单位为Ω)。如果阻值中有小数点,则用“R”表示,并占一位有效数字。例如:标示为“103”的阻值为10&TImes;10=10kΩ;标示为“222”的阻值为2200Ω即2.2kΩ;标示为“105”的阻值为1MΩ。

需要注意的是,要将这种标示法与一般的数字表示方法区别开来,如标示为220的电阻器阻值为22Ω,只有标志为221的电阻器阻值才为220Ω。

标示为“0”或…000”的排阻阻值为OΩ,这种排阻实际上是跳线(短路线)。

一些精密排阻采用四位数字加一个字母的标示方法(或者只有四位数字)。前三位数字分别表示阻值的百位、十位、个位数字,第四位数字表示前面三个数字乘10的N次方,单位为欧姆;数字后面的第一个英文字母代表误差(G=2%、F=1%、D=0.25%、B=O.1%、A或W=0.05%、Q=0.02%、T=0.01%、V=0.005%)。如标示为“2341”的排阻的电阻为234&TImes;10=2340Ω。

排阻的作用

内存芯片下方均匀分布的“芝麻粒”,实际上是位于内存颗粒和金手指之间的“排阻”。排阻,是一排电阻的简称。

我们知道,内存在处理、传输数据时会产生大小不一的工作电流。而在内存颗粒走线的必经之处安装一排电阻,则能够帮助内存起到稳压作用,让内存工作更稳定。从而提升内存的稳定性,增强内存使用寿命。

而你说的内存右边角上的“小绿豆”。我们一般称之为SPD。SPD是一存储体,它存储了厂商对内存的详细配置信息:如内存的工作电压,位宽,操作时序等。每次开机后自检时,系统都会首先读取内存SPD中的相关信息,来自动配置硬件资源,以避免出错。上拉、限流。和普通电阻一样,相比而言简化了PCB的设计、安装,减小空间,保证焊接质量。

排阻引脚说明

1与a2与b3与c4与d之间的电阻都是10欧,与其它的管脚没有任何关系.就是一排电阻,做在了一个原件上..

有的还有一个公脚,就是为了方便使用,拿万用表量一下就会发现所有脚对公共脚的阻值均是标称值,除公共脚外其它任意两脚阻值是标称值的两倍,很明显任意两脚通过公共脚脚串联的嘛!用在有很多上下拉电阻的场合应用特方便,比如并行通讯线上,还节省空间。

51单片机最小系统排阻作用

起上拉作用:

上拉就是将不确定的信号通过一个电阻嵌位在高电平,电阻同时起限流作用,下拉同理。上拉是对器件注入电流,下拉是输出电流,弱强只是上拉电阻的阻值不同,没有什么严格区分,对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。

另外其他I/O口都是准双向口且都有驱动能力,P0口也是准双向口但是驱动能力小,加排阻说白了就是给P0加驱动电路,电源通过排阻向P0口供电,使其能够驱动与P0口相连的元件。

单片机中排阻的焊接方法

先找出排阻的公共端。公共端在排阻标有小白点的一侧。也可以用万用表电阻档测量一下,任意选择一端,测量该端与其余引脚的电阻,若个引脚的电阻相等,该端为公共端,否则,另一端为公共端。

公共端连接单片机电源,其它引脚分别连接单片机IO口。具体焊接方法与焊接普通电阻一样,只是引脚多一点而已。可先焊接两端,定位后,再焊接中间引脚。

如图:带点的一端为排阻的公共端。

RP是排阻,J0就接数码管的段码。把排阻有字的一面对着自己,最左端有一个圆点右或方点,对应的管脚就是公共脚了。

来源:嵌入式ARM

围观 321

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


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

如上图是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兆。

来源:单片机仿真

围观 1187

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

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

点击此处下载软件包

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

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

来源:电子发烧友网

围观 132

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

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

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

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

应对方法有:  

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

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

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

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

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

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

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

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

来源:至秦单片机

围观 1083

引言

我在学习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 许可协议。转载请注明出处!

围观 1573

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

如何提高C的代码效率?

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

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

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

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

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

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

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

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

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

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

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

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

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

围观 49

1. 接地

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

2. 隔离与屏蔽

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

3. 滤波

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

来源:网络

围观 66

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

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

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

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(小数)中。

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

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

围观 240

页面

订阅 RSS - 单片机