单片机

随着电子技术的不断发展, 家庭中的许多电器设备如彩电、冰箱、空调等都已贴上了智能化的标签, 为提高人们的生活质量做出了贡献。但遗憾的是, 居室的眼睛---窗户, 却迟迟未跟上时代的步伐。即使是在众多的智能化生活小区, 我们都可以发现, 几乎所有的窗户的管理仍然处在原始管理方式, 与电子技术毫不沾边, 更不用说智能化了。如果使窗户具有一定的智能, 如下雨则自动关、室内有害气体超标则自动开、有盗贼入内则自动报警等, 就会给人们的居家生活带来诸多方便, 从而进一步提高人们的生活质量。

沿着这样的思路, 我们设计了以AT89C51 单片机为中央控制器的智能窗控制系统。

该控制系统能通过其数据检测传感电路不断循环检测室内温度、湿度、有害气体(如媒气) 浓度等环境参数,然后与由控制键盘预置的参数临界值相比较, 从而作出开/关窗、转动/停止换气扇、降/升温(湿) 等判断, 再结合窗状态检测电路所检测到的窗状态, 发出一系列的控制命令, 完成下雨则自动关窗、室内有害气体超标则自动开窗(同时转动换气扇) 、恒温(湿) 等自动控制功能。人们还可通过控制键盘, 直接控制窗户的开/关、换气窗的转/停、温(湿) 的升/降、选择所显示参数的种类等。

二、系统组成和部分电路设计

本控制系统主要由AT89C51 单片机组成的中央控制器, 数据检测传感电路, A/D 转换器, 窗驱动控制接口电路、窗驱动电路等组成。其系统框图如图一所示。

基于单片机的智能窗控制系统设计方案
图1 系统框图

中央控制器

中央控制器以美国ATMEL 公司的AT89C51 单片机为核心。

1. AT89C51 单片机系统具有设计简单、性能可靠、功耗低等优点。它为用户预留下足够的软、硬件资源, 可供用户进行再开发应用。该系统除内部已有的4K Flash 存储器外, 还可以扩展选址64KROM区和64KRAM区, 供用户使用。用户在系统开发时, 可以将自己的数据块和程序段、数据表, 以若干控制子程序、数据块形式存放于AT89C51 单片机的扩展ROM或RAM区中, 以便系统工作时重复使用和反复调用。由于本应用系统主要用于温度、湿度、有害气体识别、防盗安全的定点和多点测试, 片内4K Flash 存储器已能满足系统设计要求。

2. AT89C51 单片机机有三级程序存储器加密。利用该功能可防止别人非法复制程序, 从而保护知识产权。

3. AT89C51 单片机还为用户预置了P0、P1、P2、P3 四个并行I/O 口, 为该系统的数据采集和控制提供了足够的端口资源。

4. AT89C51 单片机还为用户提供一组全双工串行数据传输端口, 可用于单片机系统间的远程数据信息交换。

本系统采用P0 数据采集、控制端口, 完成控制信息的采集和控制功能。

P110~P113 作为窗状态检测端口, 完成对窗状态(即窗是否移到边框) 的检测。

数据检测传感电路

数据检测传感电路由四个部分组成:
1) 温度传感电路;
2) 湿度传感电路;
3) 有害气体传感电路;
4) 红外防盗传感电路。

为了讨论问题方便, 我们以温度传感电路为例进行分析。通常, 在自然情况下, 窗户的开关与生活环境和人体的舒适度有关, 温度的测试是该系统设计的关键。为了较好地测出温度参数, 我们选用集成温度传感器AD590(可测-55~+150 ℃) , 其温度检测完全可以满足要求。基本电路如图二所示。

基于单片机的智能窗控制系统设计方案
图2 基本电路

A/D 转换器

为了便于与AT89C51 单片机相连接, 同时又有利于系统设计, A/D 转换器选用了ADC0809.其分辨率为8 位,不必进行零点和满度调整。单一电源( + 5V) 供电, 模拟量输入范围0 -5V.转换速度取决于芯片的时钟频率。

时钟频率范围为10 -500KHZ.ADC0809 有八路模拟量输入, 在本系统中只用4 路输入, 即可完成温度等4 种被测模拟量的A/D 转换。利用单片机对FOH口的数据写启动A/D 转换器, A/D 转换结束ADC0809 的EOC 向AT89C51 发出中断请求信号, CPU 再响应中断请求信号, 通过对FOH 口的读操作, 读取转换结果并送到被测量的相应存储区。

在重新选择被测量(修改各相关指针) , 并再次启动A/D 转换后中断返回。A/D 转换器电路如图三所示。

基于单片机的智能窗控制系统设计方案
图3 A/D 转换器电路

窗驱动电路

我们可以根据驱动信号与所控对象的关系, 将窗驱动电路分解为: 移窗驱动电路; 换窗驱动电睡; 窗锁驱动电路; 温度调节驱动电路; 湿度调节驱动电路; 换气扇驱动电路; 报警驱动电路等, 分别用它们去控制1 个对象。

窗状态检测电路

可考虑采用4 个开关型磁敏器件。外窗、内窗所对应的左、右墙框各1 个。在外窗、内窗的左、右边上与磁敏器件相对应的地方各贴上一小片磁铁。当小磁铁随窗户的移动而移近相对应的磁敏器件时, 该磁敏器件的输出信号从高电平变为低电平, 表示窗户已移到相应边上。

键盘输入及显示电路

可采用Intel 公司生产的8279 通用可编程键盘显示器接口芯片。利用8279 , 可实现对键盘显示器的自动扫描,并识别键盘上闭合键的键号, 大大节省单片机对键盘显示器的操作时间, 从而减轻单片机的负担。该键盘输入及显示电路具有显示稳定, 程序简单, 不会出现误动作等优点。

对于控制键盘, 可考虑采用微动开关制作并安装在窗户的固定边框上。通过控制键盘, 用户不但可设置各环境参数的临界值, 还可随意选择所显参数的种类, 并直接控制窗户的开/关、换气扇的转/停、温(湿) 的升/降等。

三、软件设计

该控制系统的软件主要由一个主程序和两个中断服务程序等所组成。

主程序

主程序的主要作用是在系统复位后对系统进行初始化, 如设置8279、ADC0809 等的工作方式和初始状态, 设置各中断的优先级别并开中断, 以及首次启动A/D 转换等, 然后向8279 循环送显示字符。

读键值中断服务程序

读键值中断服务程序的主要作用是在AT89C51 响应中断(有键按下则产生该中断) 后, 读出键值, 并根据键值从P0 口依序发出相应的控制命令字, 完成相应的控制功能。该中断应设为高优先级。

循环检测及A/D 转换中断服务程序

该中断服务程序的主要作用是在AT89C51 响应中断(A/D 转换结束时EOC 引脚输出高电平, 从而产生该中断) 后, 将A/D 转换结果送相应存储区, 然后判断该转换结果是否在上、下限值之间, 并根据判断结果依序发出相应的控制命令字, 完成相应的控制、报警功能。然后重新选择被转换量, 再次启动A/D 转换后返回主程序。

该中断应设为低优先级。并设为电平触发方式。

程序流程图如下:

基于单片机的智能窗控制系统设计方案
图4 程序流程图

来源: www.dzsc.com

围观 313

引言

传统测量频率的方法主要有直接测量法、分频测量法、测周法等,这些方法往往只适用于测量一段频率,当被测信号的频率发生变化时,测量的精度就会下降。本文提出一种基于等精度原理的测量频率的方法,在整个频率测量过程中都能达到相同的测量精度,而与被测信号的频率变化无关。本文利用(现场可编程门阵列)的高速数据处理能力,实现对被测信号的测量计数;利用单片机的运算和控制能力,实现对频率、周期、脉冲宽度的计算及显示。

等精度测量原理等精度测量的一个最大特点是测量的实际门控时间不是一个固定值,而是一个与被测信号有关的值,刚好是被测信号的整数倍。在计数允许时间内,同时对标准信号和被测信号进行计数,再通过数学公式推导得到被测信号的频率。由于门控信号是被测信号的整数倍,就消除了对被测信号产生的士1误差,但是会产生对标准信号士1的误差。如图1所示。

基于Verilog语言的等精度频率计设计

系统中,如果采用的标准信号源的精度很高,就叮以达到一个很高的测量精度,一般情况下都是采用晶体作为标准信号源,因此可以达到很高的精度,满足一般系统的要求。

2、模块设计

本系统在传统的等精度测量原理基础上进行了改进和优化。增加了测量占空比的功能,同时由内部产生清零信号,节省了资源。改进后的FPGA核心模块如图2所示。FPGA部分主要由门控信号产生模块、计数器控制模块、计数器模块、锁存器、中断输出、数据选择输出、顶层模块组成。

基于Verilog语言的等精度频率计设计

1)门控信号为了测量频率为1H:的信号,要求系统的开门时间不小于1s;同理,为了测量0.1H:频率的信号,要求开门时间最短为109。但是如果系统一直采用10s的门控信号,测量高频信号的等待时间太长,显然不合理,因为测量结果的显示必须要等到一个测量周期结束之后才能更新。本系统采用的方法是,由单片机给FPGA提供一个门控的选择信号,如果FPG人测得的频率小于1Hz,那么单片机自动给出一个启动10s门控的控制信号;反之,如果发现测量的频率大于1Hz,自动切换回1。门控,实现了一个闭环的自动控制,很好地解决了门控的时间问题。

2)计数器控制模块

该模块是本文的创新点所在,主要用来同步被测信号。由前面的分析可知,门控信号启动(上升沿)后,在被测信号的上升沿启动计数允许模块,允许计数器计数;门控信号关闭(下降沿)后,在被测信号的下一个上升沿关闭计数允许模块,停止计数,从而保证了门控信号是被测信号的整数倍,达到了等精度的目的。该模块有GATE,CLKx这2个输人端;ENh,ENx,Load,CLR这4个输出端。GATE为上一级给出的门控信号汉LKesx为被测信号;EN-h,高电平期间对标准信号进行计数,得到CNT_h;EN_x为给出的允许计数信号,在EN-x的高电平期间,对被测信号、标准信号同时计数,得到CNT-x,CNT-b;Load为锁存信号;CLR为计数器清零信号。

由CNTx和CNT_b可以计算出被测信号的频率和周期;由CNTex和CNTh可以计算出被测信号的脉冲宽度。佑直图加图3所式。

基于Verilog语言的等精度频率计设计

3)计数器模块

在设计计数器的过程中需要注意计数器的宽度设置,系统中采用的最大门控时间为10a,标准信号源的频率为50MHz,则在计数的允许时间内计数的最大值为:536870912,为了方便数据传输,系统中采用了32位位宽的计数器。

4)锁存器模块

在门控信号关闭的同时,停止计数,同时启动锁存模块,把测量的数据锁存起来,以便传输。

5)中断输出

锁存数据的同时,给单片机一个低电平的中断信号,通知单片机读取数据。

6)数据选择输出模块

系统中采用了3个32位的计数器,由于单片机采用的是51系列单片机,只有8位的数据总线,所以一次通信只能传输8位数据,3x32/8二12,所以设计了一个数据输出控制模块,由单片机提供4根地址线,译码后可以选择16组数据,单片机得到中断通知后,分12次读取测量的数据。

7)顶层模块

实例化所有的底层模块,同时为了调试方便,加入了一些测试点。FPGA部分的整体结构图如图4所示。

基于Verilog语言的等精度频率计设计

3、单片机模块控制

3.1理论分析

在计数允许EN-x时间内,对被测信号和标准信号同时进行进行计数,得到CNT_x和CNT_b,设被测信号的周期为T,,频率为Fx,标准信号周期为F6.频率为Fb。则有:

基于Verilog语言的等精度频率计设计

系统中采用式(6)一式(8)进行计算,得到最终的测量数据,单片机中采用浮点数进行运算,计算的精度可以满足系统的要求。

3.2硬件电路

系统硬件电路比较简单,就是单片机的最小系统加上液晶显示模块,设计时需要注意,51单片机端口电压是5V输出,而FPGA是3.3V输出,所以在数据传输时要串联一个电阻一般1000一300f2即可。电路原理图如图5所示。

基于Verilog语言的等精度频率计设计

3.3软件设计

单片机软件主要由系统初始化、数据传输、频率、周期、占空比计算、液晶显示等程序模块组成。

基于Verilog语言的等精度频率计设计

基于Verilog语言的等精度频率计设计

下面简单介绍主函数及计算子函数。软件流程如图6所示。

基于Verilog语言的等精度频率计设计

中断服务子程序如图7所示。

基于Verilog语言的等精度频率计设计

4、结束语

本系统设计采用FPGA和单片机结合的方式实现等精度测量频率,充分发挥了FPGA高速的数据处理能力以及单片机的计算、控制能力。采用硬件描述语言对系统进行仿真测试.最终下载到FPGA内部。单片机采用C语言编写程序,利用浮点数进行计算,精度高。同时设计了门控信号自动选择的闭环控制,大大地提高了系统的性能。等精度测量技术在生产、实验等环境中得到了广泛的应用。

来源: 电子产品世界

围观 555

单片机I/O口工作方式基本有以下几类:
1.准双向IO口配置(弱上拉)
小结:
• 灌电流能力强,拉电流能力弱
• 读外部状态前要先锁存“1”(断开下拉晶体管)
• 读IO口状态的原则是非高即低,只能准确识别外部的低电平信号,无法区分悬空和真正的高电平
• 作为输入时,输入阻抗不为高阻,可能出现将外部低电平误读为高电平的情况(例上拉电阻10K,外部电阻100K,IO=5*100/110=4.54V)

单片机IO口工作方式详细分析

其应用方式参考:
单片机IO口工作方式详细分析

准双向口用作输入时,可对地接按键,如图1,当然也可以去掉R1直接接按键,当按键闭合时,端口被拉至低电平,当按键松开时,端口被内部“极弱上拉”晶体管拉至高电平。
当端口作为输出时,不应对地外接LED如图2控制,这样端口的驱动能力很弱(拉电流能力弱),LED只能发很微弱的光,如果要驱动LED,要采用图3的方法,这样准双向口在输出为低时,可吸收20mA的电流(灌电流能力强),故能驱动LED。图4的方法也可以,不过LED不发光时,端口要吸收很大电流。

2.推挽输出配置
小结:
• 能真正输出高低电平,具有很强的驱动能力(灌电流,拉电流能力强)
• 如果当两个推挽输出结构相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。整个通路上电阻很小,会发生短路,进而可能造成端口的损害。这也是为什么推挽输出不能实现" 线与"的原因。

单片机IO口工作方式详细分析

推挽输出可以用图2的方式通过拉电流驱动LED灯亮。

3.开漏输出配置
小结:
• 通过外部上拉电阻输出高电平
• 若有外部上拉,可作为输入IO读取外部状态(同准双向IO,先锁存“1”)
• 通过外部上拉电源进行电平转换与外部器件兼容

单片机IO口工作方式详细分析

4.高阻输入
小结:
• 电路无法流入流出,只能作为输入数据使用
单片机IO口工作方式详细分析

转自:
jbh18401的博客
围观 263

1引言

与传统模拟示波器相比.数字存储示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能。在电子测量领域,数字存储示波器正在逐渐取代模拟示波器。但目前我国使用高性能数字存储示波器主要依靠国外产品,而且价格昂贵。因此研究数字存储示波器具有重要价值。借于此,提出了一种简易数字存储示波器的设计方案,经测试,性能优良。

2 数字存储示波器基本工作原理

数字存储示波器与模拟示波器不同在于信号进入示波器后立刻通过高速A/D转换器将模拟信号前端快速采样,存储其数字化信号。并利用数字信号处理技术对所存储的数据进行实时快速处理,得到信号的波形及其参数,并由示波器显示,从而实现模拟示波器功能,而且测量精度高。还可存储信号,因而,数字存储示波器可以存储和调用显示特定时刻信号。

3 系统分析论证

3.1 A/D实时采样

根据奈奎斯特采样定理,采样速率必须高于2倍的信号最高频率分量。对于正弦信号,一周期内应有2个采样点。为了不失真恢复被测信号,通常一周期内需要采样8个点以上。为了配合高速模数转换器,采用FPGA控制M/D转换器的采样速率,以实现高速实时采样。实时采样可以实现整个频段的全速采样,本系统设计选用ADI公司的12位高速A/D转换器AD9220,其最高采样速率可达10 MHz。

3.2 双踪显示

本系统设计的双踪显示模块是以高速切换模拟开关选通两路信号进入采样电路,两路波形存储在同一个存储器的奇、偶地址位。双踪显示时,先扫描奇地址数据位,再扫描偶地址数据位。采用模拟开关代替一个模数转换器,避免两片高速A/D转换器相互干扰,降低系统调试难度,并且实现系统功能。

3.3 触发方式

采用FPGA内部软件触发方式,通过软件设置触发电平,所设置的施密特触发器参数易于修改,从而抑制比较器产生的毛刺。当采样值大于触发电平,则产生一次触发。该方式充分利用了FPGA的资源,减少外围电路,消除硬件毛刺产生的干扰,易于调整触发电压。

3.4 波形显示位置的调节

3.4.1 行扫描调节

通过控制FPGA内部双口RAM(1 KB)的起始地址的偏移量确定来控制波形的移动。其具体方法是将滑动变阻器R上的电平通过模数转换器转换为数字信号传输给FPGA,再与初始电平数字信号(显示位置复位时,滑动变阻器R的电平采样值)相比较决定起始地址ADR0的偏移量。该方法可易于实现波形满屏和自动显示功能。

3.4.2 列扫描调节

MAXl97采样A、B通道的Position电位器值,所得采样值经FPGA送至16位串行D/A转换器,MAX542产生直流电平,该直流电平与列扫描波形相加送至模拟示波器显示,实现波形上下移动。为分离A、B通道,在读A通道波形数据时,FPGA必须将Position A电位器的值送至D/A转换器;而在读B通道波形数据时,也必须将Position B电位器的值送至D/A转换器,这样可在调节某一电位器时,实现相应通道波形上下移动。

3.5 波形数据存储

数字示波器存储波形数据可采用外接的双口RAM或通用静态RAM,同时FPGA可控制RAM的地址线,从而实现波形数据的存储。双口RAM可同时进行读写操作,由于本系统设计采用FPGA,因此可充分利用FPGA的逻辑阵列和嵌入式阵列,可将双口RAM写入FPGA内部,从而无需外接RAM,减少硬件电路,提高简易数字示波器的可靠性。

4 系统设计方案

本系统设计框图如图1所示。整个系统是以FPGA为核心,包括前端模拟信号处理模块、单片机模块、显示模块和键盘输入模块。而信号的前级处理模块又包括射级跟随器、程控放大电路、整形电路。A、B通道的信号经前级处理变为O~4 V,AD9220对其采样。波形存储控制模块将其采样数据写入FPGA内部RAM,再由波形显示控制模块进行显示。FPGA通过编程设置实现测频、键盘扫描、显示驱动、波形存储控制等功能。单片机AT89S52控制整个系统键盘和点阵液晶模块实现人机交互。通过面板按键可方便调整波形显示方式。

基于单片机和FPGA的简易数字存储示波器设计

5 硬件电路设计

5.1 程控放大电路

采用模拟开关CD4051、宽带运算放大器AD844及精密电位器实现10 mV/div~2 V/div的多档垂直分辨率。FPGA含有通道选择寄存器模块,通过单片机写入通道号控制模拟开关以选通不同的反馈电阻,实现不同放大倍数,将信号调理在满足AD9220的0~4 V的范围内,具体电路如图2所示。

基于单片机和FPGA的简易数字存储示波器设计

5.2 数据采集模块

本系统设计采用ADI公司的高速模数转换器AD9220实现波形信号的采集,AD9220最高采样速率可达10 MHz,采用外部晶体振荡器8 MHz,FPGA内部通过采样实现波形存储。AD9220有直流耦合和交流耦合两种输入方式。本系统设计采用直流耦合,0~5 V的输入方式。采用内部2.5 V参考电压。由于系统垂直分辨率只需255级,故采用AD9220的高8位。数据采集电路如图3所示。

基于单片机和FPGA的简易数字存储示波器设计

5.3 FPGA设计

系统采用Verilog HDL语言,在QuartusII软件下对FPGA进行逻辑电路的描述编程,可灵活实现系统所需电路和控制模块。

5.3.1 触发模块

单片机先向FPGA模块写入设置的触发电压,FPGA内部相比较后,当采样值大于该触发电压时,则产生一次触发。图4为触发模块。

基于单片机和FPGA的简易数字存储示波器设计

5.3.2 程控放大控制模块

单片机首先以100 mv/div的档位对信号采样,通过比较与该信号最近的模拟开关的通道号,然后写入控制字,产生相应通道号,实现垂直分辨率的调整。

5.3.3 波形存储控制模块

该模块为RAM模块的写地址累加器,可控制波形的存储。H_sering为单次和多次触发控制引脚,当为高电平时,单次触发,停止向RAM写入数据,所显示波形为存储波形;为低电平时,多次触发,当检测到一次触发时,即向RAM写一次数据,共l K个点,并在写操作时屏蔽触发。写地址先写奇地址,存入通道一采样后的波形数据,后写偶地址,存入通道二采样后的波形数据。如果连续多次检测不到触发时,向RAM中写入全0,显示一条直线,即实现自动捕捉功能。波形存储控制模块如图5所示。

基于单片机和FPGA的简易数字存储示波器设计

5.3.4 波形显示控制模块

该模块为读地址累加器,从RAM中读取数据,并产生行扫描和列扫描数据。通过单片机写入累加器基地址,改变读取数据的起始位,实现波形的平移。该模块还可计算波形的峰峰值、平均值,单片机可直接读回数值。波形显示控制模块如图6所示。

6 系统软件设计

系统软件设计实现人机交互、信息提示、系统启动与复位等功能。首先系统初始化,显示默认通道波形,再等待按键按下。当按键按下后,完成相应功能,显示相应波形,然后循环等待。系统软件设计流程如图7所示。

基于单片机和FPGA的简易数字存储示波器设计

7 测试结果

使用自制的数字存储示波器和tektronix TDSl002型数字示波器测量输入信号,其中部分测量数据如表1所列。

基于单片机和FPGA的简易数字存储示波器设计

通过对比测试和结果分析,各种输入信号在自制数字存储示波器上可精确显示波形,并且实现波形的双踪显示及波形水平、垂直平移,频率、平均值、峰峰值的测量,误差小,达到一定的精度要求。
8 结语

本系统设计采用单片机作为核心控制器,充分利用FPGA的可编程逻辑功能,完成相关电路设计。软硬件有机结合实现简易数字存储示波器的设计,系统总体功能完善,稳定性高,使用方便。

来源: 电子工程世界

围观 509

本篇文章对于上拉电阻在单片机当中的重要作用进行了细致的介绍,相信在阅读过本篇文章之后,大家对于为什么要在单片机中添加上拉电阻有了一定的认识。希望大家在阅读过本篇文章之后能够有所收获。

在单片机系统当中,上拉电阻逐渐成为了最为稳定也最为可靠的主要组成部分。大多数人知道上拉电阻在单片机系统当中的重要作用,但却不知道为什么如此重要。

本篇文章就将为大家解释上拉电阻的重要性,为什么管脚和单片机大部分都要接上拉电阻呢? 专家称管脚和单片机接上拉电阻是必然的,上拉电阻和下拉电阻相比,上拉电阻要更胜一筹。

众所周知,上拉电阻就是将不确定的信号通过一个电阻钳位在高电平,输入电流,电阻同时起到限流的作用。阻值的强弱只是上拉电阻的组织不同,实际上并没有什么严格区分。对于非集电极开路输出型电路或漏极开路输出型电路来说,上拉在这种类型的电路中对提升电流和电压的能力是有限的,它的主要功能还是为集电极开路输出型电路输出电流通道。

通常来说,在管脚接上拉、下拉的设计方面有两个原因直接决定了上拉电阻的接入。一是在正常工作或单一故障状态下,管脚都是不应该出现不定状态的,如接头脱落后导致的管脚悬空情况。 二是从机体的功耗角度出发,长时间处于管脚等待状态下,管脚端口的电阻上不能消耗太多电流,这一点对电池供电设备的使用寿命和安全性来说尤为重要。

从抗扰的角度来说,信号端口也应当优先选择上拉电阻。接入上拉电阻时,在待机状态下源端输入常为高阻态。此时如果没有上拉电阻的接入,那么输入导线将会呈现天线效应,一旦管脚受到了辐射干扰,管脚输入状态就非常容易被感应发生变化。

除此之外,管脚接入上拉电阻后,最重要的一点就是能够提供一个泄流通道,防止高电平干扰。如果此时出现了强辐射干扰,强度甚至超过了Vcc的电平,那么导线上的高电平干扰会通过上拉电阻提供的泄流通道泻放到Vcc上去。因此,无论是怎样的辐射干扰,都不会产生误触发的情况,对系统的安全性能提供了极大的保障。

最近,一些工程师在处理IIC单片机接口的工作问题时,对外部接上拉电阻的做法感到疑惑。

由于单片机内部已经设置了上拉电阻,对于外部是否还需要接上拉的情况业界一直存在争议。 由于一些单片机型号内部就设置了上拉电阻,因此有些上拉能力够了,是可以不加上拉电阻,有些不够,那就必须在外部加上拉电阻。

在这种情况下,主要是取决于工程师所使用的单片机是否有标准的IIC标准接口。如果单片机使用了标准的IIC接口,那么接口在使能时引脚将进入漏极开路模式,可以省去外部接入的上拉电阻。但如果是使用单片机的引脚模拟IIC协议的话,就需要结合单片机引脚是否支持漏极开路模式或者上拉模式来进行判断,这种情况下一般是需要接入一个外部的上拉电阻的。

除此之外,在IIC接口接入上拉电阻,也可以起到保护作用。

由于I2C接口在工作时主要负责的是对高低电平检测的作用,一旦没有了上拉电阻的保护而直接接电源,出现器件拉低时整个系统就非常危险。根据I2C总线规范,总线空闲时两根线都必须为高。根据IIC总线规范的要求,总线空闲时两根线都必须为高。但由于IIC接口采用OpenDrain机制,本身只能输出低电平而无法主动输出高电平,所以只能通过外部上拉电阻RP将信号线拉至高电平。因此I2C总线上的上拉电阻是必须要接入的。

来源: 21ic

围观 393

1.引言

在电子仪器、仪表的制造及使用行业,有大量的印刷电路板需要调试、测量与维修,需要对电阻电容的数值进行测试。

本文介绍了一种基于AT89C51单片机和555定时器的数显式电阻和电容测量系统设计方案,然后制作出电路实物,实现系统的功能。系统利用555定时器和待测电阻(或电容)组成多谐振荡器,通过单片机定时器测量555输出信号的周期,根据周期和待测电阻(或电容)的数学关系再计算出电阻(或电容)值,再通过1602液晶显示器将其显示出来。经仿真结果表明该测量系统具有结构简单,方便实用等优点。

2.设计方案与原理

2.1 设计总方案

整个测量系统由单片机最小系统,按键,电阻、电容和555组成的多谐振荡器和液晶显示等几个电路模块组成。如图1所示。

采用555定时器和单片机的RC测量系统设计方案

2.2 多谐振荡器原理
采用555定时器和单片机的RC测量系统设计方案

如图2所示,测量电容时,利用555和待测电容CX和电阻R1和R2(R1和R2为已知电阻)等组成多谐振荡器,这样从555的输出端Q将输出周期性方波,接到示波器,如图2(b)所示。该信号不是一个占空比为50%的方波,根据参考文献2,一个周期T中高电平时间持续时间为:
采用555定时器和单片机的RC测量系统设计方案

测量电阻时,另用一个555组成一个多谐振荡器电路,将待测电阻RX接在R1的位置(或者将RX和一个已知电阻串联),CX替换成一个已知的电容C.这样一个周期时间为:
采用555定时器和单片机的RC测量系统设计方案

2.3 单片机计时原理

555输出的周期性方波信号送给单片机进行计时,测量出信号的一个周期时间T,再利用上面的数学关系进行计算处理,得到待测的电容或者电阻值。单片机计时的原理是:利用单片机的外部中断0和定时器0.555的输出信号接到单片机的外部中断0引脚P3.2,将其设置成下降沿触发。当555的输出信号为下降沿时,触发外部中断,开启单片机的定时器0开始计时,直到下一次下降沿到达时,即一个周期到达了,停止计时,这时定时器记下的就是一个周期的时间长度。

3.硬件模块设计

3.1 单片机最小系统

系统核心的控制器采用的是AT89C51单片机,图3所示为单片机最小系统,包括单片机和单片机正常工作需要的晶振电路和复位电路。Proteus中默认单片机电源和地已接好,所以图中省去了。

采用555定时器和单片机的RC测量系统设计方案

3.2 按键电路

按键电路用于确定是测量电容还是电阻,如图4所示,采用了一个单刀双掷按键。当按键打到上方接通单片机P3.6引脚时,用于测量电容;打到下方P3.7引脚时,用于测量电阻。

采用555定时器和单片机的RC测量系统设计方案

3.3 555多谐振荡器
采用555定时器和单片机的RC测量系统设计方案

如图5所示,利用555和待测电容或者电阻组成多谐振荡器,555产生的周期性方波从Q引脚输出,然后接至单片机的外部中断INT0引脚,即P3.2引脚。测量时,两电路只有一个接至单片机,分别用于测量电容和电阻。

3.4 液晶显示电路

采用555定时器和单片机的RC测量系统设计方案

测量的结果要显示出来,本系统采用LCD1602作为显示器,图6为LCD1602和单片机的连接电路,P0口接了上拉电阻,作为数据口;P2口的前3位作为读写和使能的控制引脚。

4.软件设计

系统软件流程图如7所示。接通电源,首先是初始化工作,包括定时器T0、外部中断0和LCD1602的初始化。然后启动555芯片,通过单片机判断是否有中断请求,若无的话,继续等待中断请求;若有的话,启动定时器开始计时直到有中断请求时停止计时。得到计时值,即555输出信号的一个周期后,判断是测量电阻还是测量电容。判断后将电阻或者电容值由LCD1602显示出来。

采用555定时器和单片机的RC测量系统设计方案

5.仿真结果

将上述各电路模块整合到一起,组成一个测量系统。采用Keil编写好程序无误后,在Proteus中进行电路仿真。分别测量一个50kΩ电阻和一个150μF电容的仿真结果如图8所示。从中可以看出,测量有一定的误差,这主要是因为采用前面公式计算时取了近似值。仿真通过后,按照仿真电路,购买需要的元器件,制作出实物电路。

采用555定时器和单片机的RC测量系统设计方案

6.结束语

本文介绍了一种基于555定时器和单片机的电阻和电容测量系统设计方案。在系统的设计和仿真中,是以Keil和Proteus两种软件为平台。在Keil中使用C语言编写了程序,再利用Proteus仿真了系统电路的功能。该测量电路简单可靠,较易实现,能够测量一定范围内的电阻和电容值从而证实了本设计方案的实用性。

来源: eepw

围观 435

本文分析了基于AT89S51 单片机的角度测量的硬件组成、电路设计原理。给出了主函数的工作流程和源代码。设计样机已通过多种环境实验的测试。

角度测量仪是某控制系统中瞄准装置的关键部件。在以往的控制系统中,多数都是仅凭设备操作人员眼睛瞄准指定目标,然后作出相应的控制,这样就带来一系列问题,如操作人员的经验、瞄准装置转盘的空回都可能会严重会影响瞄准目标的精确程度,从而严重影响控制系统的精度。为了提高控制系统的瞄准精度,在控制系统的瞄准装置中增加了角度测量仪部件,操作人员瞄准目标后的角度值能够精确定量地显示在操作面板上,帮助操作人员更加准确地瞄准目标,因此,极大地提高了控制系统的控制精确度。

角度测量仪利用光电编码器读取角度值,采用AT89S51 单片机实现角度值数码显示、角度值偏差范围的发光二极管指示功能(有三个指示灯,分别指示:偏高、偏低、适中)。不论在操作的复杂程度上还是在测量的精度上,都是传统的眼瞄方法、刻度测量及标识方法无法比拟的。

作为某控制系统的瞄准装置的重要技术改进,此仪器的应用大大提高了控制系统瞄准的精度,增加瞄准偏差范围的可读性,淘汰了传统的用刻度测量和标识角度的方法,使该控制系统的整体性能得到了显着提高。此外,该角度测量仪只要稍作改动即可广泛用于其它工业控制系统中。

1、硬件基本原理

首先,角度测量仪利用单片机读取光电编码器测出的角度值,再将角度值转换成密位值并显示在数码屏上(注意: 密位(mil) 是一种角度单位,密位100 = 角度6°)。单片机判断当前角度值的偏差范围,给出控制信号点亮相应的发光二极管指示灯。此外,角度测量仪还可以通过控制面板上的开关控制实现瞄准镜照明和低温环境下瞄准镜自动除霜功能。单片机的主要功能是实现角度值数码管显示、角度值范围的发光二极管指示。该系统的难点在于确保角度值转换成密位值的转换精度和系统在非常温环境下的工作可靠性。

硬件分为以下几个模块:控制面板、单片机、光电编码器、电源、数码显示器、发光二极管匹配指示装置、周视镜与直瞄镜照明与除霜,如图1所示。

基于AT89S51单片机的角度测量仪的设计

1. 1 单片机的选用

首先,根据项目的需求分析可以得知单片机要完成的主要功能是:从光电编码器(数据总线宽度是15 位) 读取角度值后,将该角度值与系统预设的角度值比较,判断瞄准的角度值范围,点亮相应的指示灯。然后将从光电编码器读得的角度值转换成密位值,发送给串行L ED 显示驱动器MAX7219 ,显示在LED 显示器上。
从以上分析可以得知,适合此需求的单片机至少应具备3 个8 位并行I/ O 端口(其中光电编码器占用2 个端口,其它占用1 个端口) ,才能有效工作。众所周知,产品的品质等级通常分为三级:军用级、工业级和商用级,其中,军用级等级最高,商用级等级最低。由于此工业控制设备通常在户外作业,工作环境比较恶劣,故单片机的品质的等级也是需要考虑的一个重要因素。

目前,MCS - 51 系列单片机技术成熟,开发所用的教材和技术资料多,开发工具齐全,市场上产品种类丰富、性价比较高、购买容易,开发语言简单易学(可以用汇编或C51) ,因此,该系列产品应用广泛,经久不衰。

经过综合考虑,单片机采用ATMEL 公司生产的AT89S51 芯片(MCS - 51 系列单片机的工业级产品) , 兼容MCS51 微控制器,4 K 字节FLASH 存贮器支持在系统编程( ISP) 1000 次擦写周期,128 字节片内RAM ,工作电压4. 0 V 到5. 5 V ,全静态时钟0 Hz 到33 MHz ,三级程序加密,4 个8 位的可编程I/ O 端口,2/ 3 个16 位定时/ 计数器,6/ 8 个中断源,全双工UART ,低功耗支持Idle 和Power down 模式,Powerdown 模式支持中断唤醒,双数据指针,上电复位标志。ATMEL 公司生产的89 系列单片机在工业、交通、仪器仪表、自动生产过程、航空、运输、汽车、家电等领域都有着极及其广泛的应用。所选型号为ATMEL 公司的AT89S51 - 24PI ,工业级。能适应- 45 ℃~ + 80 ℃环境工作。

单片机的I/ O 端口资源分配是: P0 和P2口分配给光电编码器,P1 口分配给显示驱动和匹配指示发光二极管控制以及MAX813.

1. 2 单片机主要外围电路的设计

监控电路:为了提高单片机在恶劣环境下的可靠性,必须采用μP 监控电路来增加单片机的稳定性和抗干扰能力。硬件监控电路有以下功能:(1) 上电复位:保障系统加电时能正确地启动。(2) 掉电复位:当电源失效或电压降到某一电压值以下时,产生复位信号对系统进行复位。(3)看门狗定时器:当处理器遇干扰,程序运行混乱产生"死锁"时,对系统复位。此处采用MAXIM公司的军用级芯片MAX813LMJA.
显示驱动电路: 为了节省单片机I/ O 口资源,降低单片机的计算量,选用串行L ED 显示驱动器MAX7219. 它能控制8 位共阴级L ED 数码管,具有16 级亮度控制、译码灵活,上电发光二极管全熄、只占用三根单片机I/ O 口线等优点。

单片机及主要外围电路的原理如图2 所示。

基于AT89S51单片机的角度测量仪的设计

1. 3 单片机与外围器件的数据通信

单片机与光电编码器:因为光电编码器获得角度值的速度远大于单片机的工作速度,所以,单片机可以认为光电编码器上的数据总是处于"准备好"状态,单片机随时可以读取有效数据,16 位的角度值分成高8 位和低8 位两次读取,它们之间的数据是并行无条件传送。

单片机与MAX7219 :从单片机和MAX7219的工作速度来看,CPU 两次发送数据给MAX7219 的时间间隔,足以保证单片机访问MAX7219 时,MAX7219 总是处于"准备好"状态。而MAX7219 又是串行L ED 显示驱动器,因此,单片机与MAX7219 的数据传送是串行无条件传送。

单片机与MAX813 :因为单片机向MAX813发送数据时,MAX813 只等待接收单片机的初始化数据而并无其它的工作其工作速度足够快,可以认为MAX813 总是处于"准备好"状态。因此,单片机与MAX813 的数据传送也是串行无条件传送。

2、软件设计原理

角度测量仪启动工作后,单片机的工作过程是:系统启动后,初始化外部看门狗,初始化显示驱动芯片MAX7219 ,给看门狗计数器赋初值,读取光电编码器获取的角度值,当角度偏差值处在某一特定范围时,单片机发出控制信号点亮与该范围相对应的指示灯,将当前的角度值转换成密位值显示在数码屏,又重新给看门狗计数器赋初值,进入下一个工作循环。主函数的工作流程如图3 所示。

基于AT89S51单片机的角度测量仪的设计

请注意,流程图中,带双线边的矩形框表示该部分为函数。在本课题的软件设计中,采用了C51 编程语言,因为用C51 编程不仅效率高,而且可读性很强。

下面给出主函数的源代码。

void main (void)
{
WDI = 0 ; / / 初始化看门狗
INItMax7219 () ; / / 初始化MAX7219 的函数
while (1) {
WDI = 1 ; / /"喂狗"
WDI = 0 ; / /"喂狗"
GetAngle () ; / / 读角度值的函数
MachView() ; / / 指示灯匹配显示的函数
GetMil () ; / / 计算密位值的函数
DisplayMil () ; / / 显示密位的函数
}
}

在主函数调用的几个函数中,InitMax7219() 的功能是初始化L ED 显示驱动器MAX7219 ,单片机向MAX7219 发送消影控制、亮度、扫描范围、译码方式信息。

GetAngle () 的功能是从光电编码器读角度值,先读高8 位,再读低8 位,然后将高8 位和低8 位合并,最后舍去最低位(光电编码器的有效数据是15 位) .

MachView() 的功能是角度偏差指示灯匹配显示,将该角度值与系统预设的角度值比较,判断瞄准的角度值是偏高、偏低还是适中。如果角度值偏高,那么单片机就发出控制命令,使偏高指示灯亮,如果偏低,则令偏低指示灯亮,否则令适中指示灯亮。

值得注意的是,计算密位值的函数GetMil() 的代码编写,要考虑角度的转换精度,在本课题中,采用了C51 中的long 型变量来分别存放密位的整数和小数部分,并将角度的小数部分放大十万倍后参加运算,保证转换精度。

DisplayMil( )的功能是驱动MAX7219 显示密位。首先显示密位,判断此角度是否进入预设区,如果是,熄灭符号灯,各位显示"0";如果没有,判断角度值是否为负,如果是,显示负号,如果是正,不显示负号,然后将角度值显示在L ED显示屏上。

3、结束语

为了使角度测量仪能在各种可能的恶劣环境下(如高温、低温、振动等环境) 正常工作,在整个设计过程中,要着重考虑的问题是硬件的可靠性和软件的可靠性。

设计时的注意事项如下:

(1)电源芯片的额定功率选择要留有余量。
(2) 元器件选择工业级或军用级产品。
(3) 采用硬件看门狗方案,防止单片机程序锁死。
本课题设计的样机已处于测试阶段,目前已通过了常温和多种环境试验的测试。

来源: 21ic.com

围观 329

MCS- 51系列单片机的指令系统是一种简明高效的指令系统,其基本指令共有111条,其中单字节指令49条,双字节指令4'5条,三字节指令17条。如果按功能可以讲这些指令分为五类:数据传送类(29条)、算术操作类(24条)、逻辑操作类(24条)、控制转移类(17条)以及位变量操作类(17条)。对于反向设计而言,我们关心的不是它的各种具体指令的多少而是指令的寻址方式。所谓的寻址方式就是寻找确定参与操作的数的真正地址。MCS-51系列单片机的111条指令一共只采用了5种寻址方式。5种寻址方式以及它们的寻址空间如表1所示。

基于EDA技术的8051单片机指令系统剖析
表1:表寻址方式及寻址空间

1.寄存器寻址

寄存器寻址方式可用于访问选定寄存器区的8个工作寄存器RO-R7。由指令操作码的低三位指示所用的寄存器,寄存器A, B, DPTR, AB和Cy位(位处理机的累加器)也可作为寻址对象。在这种寻址方式中被寻址的寄存器的内容就是操作数。

在实现这类寻址方式时,确定被寻址寄存器的物理地址时关键。由于选定寄存器区由PSW的相关位来决定,指令的低三位又指示了具体的寄存器,所以可以用下面的VHDL语句来确定相关寄存器的物理地址:

rr_ adr<=unsigned((psw and“00011000”)or(rom_data_i and“00000111”));

其中rr_ adr表示的是寄存器的物理地址,rom_data_i表示的是指令代码。物理地址确定以后,对RAM的操作就很好进行。

2.直接寻址

直接寻址是访问特殊功能寄存器的唯一方法。它也可以用于访问内部RAM(128个字节)。采用直接寻址方式的指令是双字节指令,其中第一个字节是操作码,第二个字节是内部RAM或特殊功能寄存器的直接地址。地址已经给出,显然不需要像寄存器寻址那样先计算地址,直接针对由ROM给出地址就可以对RAM进行相关操作。

3.寄存器间接寻址

寄存器间接寻址可用于访问内部RAM或者外部数据存储器。访问访问内部RAM或者外部数据存储器的低256个字节时,可以采用RO或R1作为间址寄存器。这类指令为单字节指令,其最低为表示采用RO还是R1作为间址寄存器。访问内部RAM和外部数据存储器时采用不同的指令,所以不会引起混淆。

访问外部数据存储器,还可用数据指针DPTR作为间址寄存器,DPTR是16位寄存器,故它可对整个外部数据存储器空Il(64K)寻址。

在执行PUSH(压栈)POP(出栈)指令时,也采用寄存器间接寻址,这时堆栈指针SP用作间址寄存器。

实现这类寻址方式必须分为两步,首先确定4个通用工作寄存器区中可以作为间接寻址寄存器的8个单元的地址,然后读出所选定的寄存器中的值,这个值就是当前指令要寻址的空间的物理地址。确定间接寻址寄存器的地址可以由下面的VHDL语句来实现:

ri_adr<=((psw and“00011000”)or(s-command (7downto 0) and“110000000111”)),

其中ri_ adr表示的是用于间接寻址的寄存器的物理地址,s_command表示的是当前指令的操作码。然后通过另外一个读RAM的进程就可以确定间址寄存器中的值,从而得到指令需要的存储器单元的地址。至千其他特殊功能寄存器作为间址寄存器的情况,由于间址寄存器的地址事先已经能够确定,所以这种方式下寻找存储器单元的地址就仅需要上述两步中的后一个步骤就可以确定指令需要的存储器单元的地址。

4.立即寻址

采用立即寻址方式的指令是双字节的,第一个字节是操作码,第二个字节是立即操作数。因此,这种寻址方式实现起来比直接寻址还要容易,操作数就是放在程序存储器内的常数。

5.基址寄存器加变址寄存器间接寻址

这种寻址方式用于访问程序存储器的一个单元,该单元的地址是基址寄存器(DPTR或PC)与变址寄存器A的内容之和。虽然这类寻址方式也是间接寻址,对于使用DPTR作为基址寄存器的情况,它的实现方法和用数据指针DPTR作为间址寄存器时的间接寻址的情况很相似,因为其间址寄存器事实上还是确定的。与用数据指针DPTR作为间址寄存器时的间接寻址的情况有所不同的是,确认最终需要的地址还要进行一次加法运算,这在使用VHDL语言描述的时候是很容易实现的。用PC作为基址寄存器时,需要知道PC当前值,但是PC和DPTR是不同的,DPTR是特殊功能寄存器,利用它的地址就可以读出其值,PC并没有被分配地址,不能使用读RAM的方式取得其值,所以内部有必要设置编写这样一个进程,它用于读出那些位于CPU内部、没有分配地址的辅助寄存器的值。

来源: EEPW

围观 297

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

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

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

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)。为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。

来源: 玩转单片机

围观 607

单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域的广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的32位300M的高速单片机。

1、万事开头难、要勇敢迈出第一步。

开始的时候,不要老是给自己找借口,说KEIL不会建项目啦、没有实验板啦之类的。遇到困难要一件件攻克,不会建项目,就先学它,这方面网上教程很多,随便找找看一下,做几次就懂了。然后可以参考别的人程序,抄过来也无所谓,写一个最简单的,让它运行起来,先培养一下自己的感觉,知道写程序是怎么一回事,无论写大程序还是小程序,要做的工序不会差多少,总得建个项目,再配置一下项目,然后建个程序,加入项目中,再写代码、编译、生成HEX,刷进单片机中、运行。必须熟悉这一套工序。个人认为,一块学习板还是必要的,写好程序在上面运行一下看结果,学习效果会好很多,仿真器就看个人需要了。单片机是注重理论和实践的,光看书不动手,是学不会的。

2、知识点用到才学,不用的暂时丢一边。

厚厚的一本书,看着人头都晕了,学了后面的,前面的估计也快忘光了,所以,最好结合实际程序,用到的时候才去看,不必说非要把书从第一页看起,看完它才来写程序。比如你写流水灯,完全就没必要看中断的知识,专心把流水灯学好就是了,这是把整本书化整为零,一小点一小点的啃。

3、程序不要光看不写,一定要自己写一次。

最开始的时候,啥都不懂,可以抄人家的程序过来,看看每一句是干什么用的,达到什么目的,运行后有什么后果,看明白了之后,就要自己写一次,你会发现,原来看明白别人的程序很容易,但到自己写的时候却一句也写不出来,这就是差距。。。当你自己能写出来的时候,说明你就真的懂了。

4、必须学会掌握调试程序的方法。

不少人写程序,把代码写好了,然后一运行,不是自己想要的结果,就晕了,然后跑到论坛上发个帖子,把程序一贴,问:为什么我的程序不能正常运行?然后就等别人来给自己分析。这是一种很不好的行为,应该自己学会发现问题和学会如何解决问题。这就需要学习调试程序的方法,比如KEIL里,可以下断点啦,查看寄存器内容等等,这些都是调试程序的手段,当你发现你写的程序运行结果和你想象中不一样的时候,你可以单步,也可以下断点,然后跟踪,查看各相关寄存器内容,看看程序运行过中是不是有什么偏差,找出影响结果的地方,改正过来。这一个过程非常重要,通过程序的排错,你可以学到的知识是书上得不到的。

5、找到解决问题思路比找到代码更重要。

我们用单片机来控制周边器件,达到我们想到的目的,这是一个题目,而如何写出一个程序,来控制器件按你想要的结果去运作,这个就是解题的思路。要写程序,就得先找到解决问题的思路,你学会找出这个解题思路,比你找到代码更为重要。不少人很喜欢找人家的代码,有的人甚至有了代码就直接复制到自己的程序中,可以说,这不是一种学习的态度,无助于你编程水平的提高。我几乎不怎么看人家的代码,多数时候是看别人的思路,有方框图最好,没有的话文字说明也可以,要从代码中看出别人处理问题的思路,是相当困难的,特别是大型的程序,看起来是非常的累人,所以现在我也明白了,以前读书时说的程序流程图很重要,现在算是知道了。当你知道一个问题怎么去解决了,那么剩下的只是你安排代码去完成,这就已经不是什么问题了。(http://www.diangon.com版权所有)举个例子:数码管动态扫描,没写过的初学者可能搞不清是怎么回事,其实,就是分时让每一时间段时只控制一只数码管显示数字,几只数码管轮流显示,由于速度很快,人眼的看起来是全部数码管都亮的。明白是这么一回事,事情就好办了,剩下的事情,无非是你安排让一只只数码管轮流显示出相应的数值。显示数字,然后延时一下,再下一只显示数字,延时,知道是这样,我们实际程序上只要做到这样就可以:往段口送段码,然后打开位选显示一只,延时一下,再关闭位选,再送出段码,再打开另一只位选..仅此而已。有了解决问题的思路,我们就能问题拆分开来,然后逐一的解决,如果动态扫描的原理都没懂,不知道如何做,那么这个程序是怎么也写不出来的。

6、开动脑筋,运用多种方法,不断优化自己的程序。

想想用各种不同方法来实现同一功能。这是一个练习和提高的过程,一个问题,你解决了,那么你再想想,能不能换种写法,也可以实现同一功能,或者说,你写出来的代码,能不能再精简一点,让程序执行效率更高,这个过程,就是一个进步的过程。很多知识和经验的获得,并不是直接写在书让你看就可以得到的,需要自己去实践,开动脑筋,经验才能得到积累,编程水平才能有所提高。

7、看别人的代码,学习人家的思路。

这个在学习初期是很有用,通过看别人的代码,特别是有多年编程经验的人写出的具有一定水平的代码,可以使自己编程水平得到迅速的提高,同时,也可以结合别人的编程手法,与自己的想法融合在一起,写出更高水平的代码,从中得到进步。但要注意,切忌将学习变成抄袭,更不是抄袭完了就认为自己学会了,这样做只会使你退步。

8、尝试编写一下综合应用的程序。

从流水灯学起,到动态扫描,再到中断,那么,你可以试试写一下时钟这种综合性应用的程序,不要小看时钟,要写好它不是一件容易的事情,它包括了单片机大部分的知识,比如有按键(IO读取)、动态扫描(IO输出)、中断等,如何协调好各功能模块正常工作,才是编程者需要学习的地方,当你单独写一个功能的时候,比如按键读取,你可能感觉很容易,因为你的程序啥也不做,只是读按键。但把它和其它功能混合在一起,如何在整个程序运行中使每一部分都正常工作,这就不是写一个按键读取这么容易的事情,功能模块之间有可能会互相影响,比如你需要让数码管既能显示,又要去处理按键读取,怎么使这两部分都正常工作,这就是一个协调过程。当你有了这个处理协调能力,你就算是入门了。

9、着重于培养解决问题的能力,而不是具体看自己编写了多少代码或者做过什么。

“学单片机重点在于学习解决问题的思路,而不是局限于具体的芯片类型和语言”这一直是我的座右铭,是我学单片机多年来感悟出来的。经常看到有人说“你会驱动XX芯片,真牛啊”“你搞过XX项目,真厉害”之类的话,其实这是非常片面的,搞过XX芯片,搞过XX项目,只能说明你做过这一项目,它只是你的业绩,并不是代表能力就一定高。真正的能力应该是:“遇到没有解决过的问题或器件,能利用自己已学的知识,迅速找到解决问题的方法。”这个才是能力。写程序的过程就是一个创造的过程,几乎没有完全一样的项目,每次你遇上的几乎都不相同,所以你拥有的必须是你面对新项目时的创造能力,而不是标榜着你以往做过多少项目。当然,业绩也能从另一侧面反映你的经验和水平。

10、如果有可能,多学习计算机专业的知识,比如数据结构等。

这些是你解决问题的基础知识,你把这些知识应用得越好,就会发现越容易找到解决问题的方法,这就是为什么一个学计算机专业的人编的程序和一个非计算机专业的人编的程序有差异的原因。也是一个菜鸟进军到高手所要配备的知识。如果我们把编程分为宏观编程和微观编程,那么微观编程就是写具体的代码,比如控制某某器件的语句;而宏观编程就是如何对整个程序进行布局、安排,使功能模块以你想要的方式去运行,得出你想要的结果。如前所说“会控制XX器件”这些只能算是微观编程,能做到这一步还只能算是菜鸟级别,如果面对一个新的器件,你心里没底,没把握去写这个控制程序,那说明你还是一个初级的菜鸟。当你有了一定的编程经验,控制过相当数量的器件之后,你就会发现,控制器件这些工作都是相似的、重复的工作,体现不出编程的水平,最多也是写得好与不好的差别,只能算是一些小技巧的应用。而对整个程序进行布局、安排这些才是最头痛的事情,能达到宏观编程和微观编程都做好才是真正的高手。对于规模越大的程序,越能体现出这一点。

11、面对一个新项目时,多自己开动脑筋,不要急于找别人的程序。

有不少人面对一个新项目时,第一步想到的就是网上找别人写过的代码,然后抄一段,自己再写几句,凑在一起就完成任务,这虽然可能是省时间,但绝对不利你的学习。当你接到一个新项目时,应该先自己构思一下整个程序的架构,想想如何来完成,有可能的话,画一个流程图,简单的可以画在脑子里,对程序中用到的数据、变量有一个初步的安排,然后自己动手去写,遇到实在没办法解决的地方,再去请教别人,或看别人是怎么处理的,这样首先起码你自己动过脑想过,自己有自己的思路,如果你一开始就看别人的程序,你的思维就会受限在别人的思维里,自己想再创新就更难了,这样你自己永远也没办法提高,因为你是走在别人的影子里。

12、多利用网络的搜索,学会提问题。

一般来说,学习过程中,你遇上的问题,前人们多数也有遇上的,所以如果有什么不懂,在自己解决不了的时候,最好先到网上搜索一下,看能不能找到答案,找不到再到论坛里发问,发问也要有目的性,尽量简单明了的描述问题,让帮助你的人可以用最少的时间就看懂你说什么,毕竟人家帮助你是免费的,时间也是有限的。

转自: 自动化控制技术控

围观 413

页面

订阅 RSS - 单片机