| lang's profile五月荷PhotosBlogLists | Help |
|
|
5/24/2006 在Windows下实现PC机与单片机AT89C51的串行通信(ZZ)
在以单片机为基础的数据采集和实时控制系统中,通过计算机中的RS-232接口进行计算机与单片机之间的命令和数据传送,就可以利用计算机对生产现场进行监测和控制。由于计算机上的RS-232所传送的距离不超过30m,所以,在远距离的数据传送和控制时,可以用MAX485的接口转换芯片将RS-232转换成RS-485协议进行远距离传送。在发送和接收端都进行协议转换后,RS-485协议对数据传送来说是相对透明的,所以依然可以使用计算机中的RS-232进行远距离的数据传送和控制。在最简单的RS-232直接传送通信
系统中,只要发送和接收双方同时准备好,仅用信号发送端(TXD),信号接收端(RXD)和信号地(GND)3根线即可进行通信;若以应答方式进行数据通信,可使用请求发送(RTS)、清除发送(CTS)或数据终端准备(DTR)、数据装置准备(DSR)进行硬件握手。在Windows95下,可以很方便地使用Win32通信API函数来实现这些硬件的握手以及数据的传送。在89C51单片机系统中,分别从P3.0和P3.1引出串口线RXD和TXD通过专用的电平转换芯片转换成RS-232接口标准的电平,这样,二者之间就可以通过RS-232接口进行数字信号的传送。单片机也可以以直接传送或应答握手的方式进行数据通信,但由于握手方式占用其他的端口,而单片机的端口数量有限,所以,计算机与单片机的通信常采用直接传送的方式,本文将重点介绍。 1 Windows95下的通信编程 Windows95通信体系提供了1个改进的串行应用程序接口SAPI用来进行交互式串行通信。其中,串口和其他通信设备是作为文件进行处理的,串口的打开、关闭、读取和写入所用的函数和操作文件的函数相同。 通信会话以调用CreateFile函数开始,CreateFile函数为读访问或写访问打开串口,打开成功后返回该串口句柄,供读写串口时使用。CreateFile函数的使用如下: CreateFile(szDevice,fdwAccess,fdwShareMode,lpsa,fdwCreate,fdwAttrsAndFlags,hTemplateFile) 其中,第1个参数szDevice是要打开的串口逻辑名,如COM1或COM2;第2个参数fdwAccess指定串口的访问类型,如读、写或两者兼而有之,大部分通信是双向的,因而通常设置为:GENERICREAD|GENERICWRITE;第3个参数fdwShareMode指定串口的共享属性,串口不能共享,所以它必须为0;第4个参数lpsa引用安全性属性结构;第5个参数fdwCreate指定如果CreateFile正被已有的文件调用时应做些什么,既然串口总是存在,此参数就必须被设置为OPENEXISTING。第6个参数fdwAttrsAndFlags描述了该端口的各种属性,对串口而言,唯一有意义的设置是FILEFLAGOVERLAPPED,指定该设置时,端口I/O可以在后台进行;最后1个参数hTemplateFile是指向模板文件的句柄,当端口打开时,该参数为NULL。 打开串口后,在Windows95下可以对串口进行合适的配置。Windows95提供了COMMPROP结构,COMMPROP结构中包含了对串口允许的设置,如波特率、数据位数、停止位的个数以及奇偶校验方法等,如果串口连接到调制解调器,COMMPROP结构中还包含调制解调器支持的设置。但COMMPROP结构给出的只是单纯的信息,它不能用来改变串口的设置。Windows95下串口设置的改变是通过改变它的DCB结构来实现的,DCB结构中包含了所有串口的设置,其中包括硬件的握手、流控制等。 Windows95提供GetCommState函数来得到当前串口的设置情况,该函数接收1个打开的端口句柄和1个指向DCB结构的指针,在DCB结构中返回信息,GetCommState函数的补充函数是SetCommState函数,SetCommState函数将DCB结构中的内容写向串口设置,这2个函数的调用如下: BOOLGetCommState(hComm,&dcb) BOOLSetCommState(hComm,&dcb) 其中,hComm为打开串口的句柄,dcb为1个指向DCB的结构。 Windows95中实现串口的读写函数与文件的读写函数相同,读写函数的使用格式如下: ReadFile(hComm,inbuff,nBytes,&nBytesRead,&overlapped) WriteFile(hComm,outbuff,nBytes,&nBytesWrite,&overlapped) 其中,第1个参数是打开串口的句柄,第2个参数是数据所使用的缓冲区,第3个参数是要读取的字节数,第4个参数是实际读取的字节数,实际读取的字节数可能小于要读取的字节数,最后1个参数指向1个覆盖似的结构,当CreateFile中dwAttrsAndFlags参数设置为FILEFLAGOVERLAPPED时,此参数可以指定1个OVERLAPPED结构,使数据的读写操作在后台进行。 读写端口可以通过4种技术来实现:查询、同步I/O、异步I/O(后台I/O)和事件驱动I/O。查询方式直接、易于理解,但占用大量CPU时间;同步I/O直到读取所指定字节数或超时时才返回,这样很容易长时间地阻塞线程;异步I/O可以在后台读写数据,而在前台做其他的事情;事件驱动I/O是由Windows95通知应用程序某些事件什么时候发生,然后根据所发生的事情来对串口进行操作。 这4种不同的技术,各有利弊和自己适用的领域,所以,在不同的通信系统中,可以根据不同的要求采用不同的技术。在监测系统中,由于事件的偶然性和要求传送的实时性,计算机常采用事件驱动I/O方式来进行现场监测。 在事件驱动I/O方式下,Windows95报告给应用程序的事件由函数GetCommMask返回,改变返回的事件时,可以使用SetCommMask函数设置,这2个函数的调用如下: GetCommMask(hComm,&dwMask) SetCommMask(hComm,dwMask) 第1个参数是打开串口的句柄,第2个参数是要等待的1个或多个事件的掩码。在用SetCommMask设置了有用的事件后,应用程序调用WaitCommEvent函数来等待事件的发生,直到事件发生,WaitCommEvent函数返回。WaitCommEvent函数使用格式如下: WaitCommEvent(hComm,&dwEvent,&overlapped) 第1个参数是打开串口的句柄,第2个参数是返回的事件,第3个参数是指定同步或者异步操作。当函数返回后,可根据返回的事件掩码进行相应的串口操作。 完成通信后,串口应该关闭,否则,它始终处于打开状态,其他应用程序就不能打开或使用它。关闭串口的函数为:CloseHandle(hComm),其中,hComm为打开的串口句柄。 2 单片机下的通信编程 单片机89C51的串行端口有4种工作方式,通过编程设计,可以使其工作在任一方式,以满足不同场合的需要。其中,方式0主要用于外接移位寄存器,以扩展单片机的I/O电路;方式1主要用于双机之间或外设电路的通信;方式2、3除有方式1的功能外,还可用作多机通信,以构成多微机系统,方式2、3的区别在于波特率的不同。 单片机的串行通信的波特率可以程控设定,在不同的工作方式下,由时钟振荡频率的分频值或由定时器T1的定时溢出时间确定。 单片机的串行端口有2个控制寄存器,用来设置工作方式、发送或接收的状态、特征位、数据传送的波特率以及中断标志TI和RI。 单片机的串行端口有1个数据寄存器SBUF,该寄存器为发送和接收所共有,在一定条件下,向SBUF写入数据就启动了发送过程,读SBUF就启动了接收过程。 单片机可以采用循环方式或中断方式实现串行数据的传送。在循环方式下,单片机循环对数据寄存器SBUF进行读写来实现数据的接收和发送;在中断方式下,对方式1、2来说,1帧数据发送或接收完后,TI/RI自动置1,请求串行中断,若CPU响应中断,则执行串行中断服务程序,并把TI/RI清0以再次响应中断。对在方式2、3下的接收,还要视串口控制寄存器SCON的设置才可确定RI是否被置位以及串口中断是否开放。 实时控制中,由于事件的突发性,常采用中断的方式进行数据传送,中断方式能更大限度地提高资源的利用率,使CPU在不进行数据通信时做其他的工作。下面重点介绍单片机在方式1下的中断方式编程。 方式1是10位异步通信方式,其中包括1个起始位,8个数据位和1个停止位。波特率由定时器T1的溢出率和串口控制寄存器SMOD的状态确定,在CPU的晶振为11.0592MHz时,波特率常采用9600b/s。 对SBUF进行写操作就可启动发送,在发送移位时钟的同步下,从TXD先送出起始位,然后是8位数据位,最后是停止位,这样,1帧数据发送完,中断标志TI置位。 在允许接收的条件下(REN=1),当RXD出现由1到0的负跳变时,即被当成是串行发送来的1帧数据的起始位,从而启动1次接收过程。当8位数据接收完,并检测到高电平停止位后,即把收到的8位数据装入SBUF,置位RI,1帧数据的接收过程就完成了。 下面是单片机以方式1在直接传送下的中断接收和发送程序。由于没有使用通信握手,所以通信双方都应做好通信准备。在计算机接收、单片机发送时,由计算机先发送字母“R”,通知单片机计算机已准备好,然后计算机在事件驱动I/O方式下等待接收到字符“Y”;当单片机接收到“R”时,向计算机发送“Y”,表示单片机也已准备好,这样,一旦计算机接收到“Y”就表示双方都已准备好,二者之间就可以进行数据交换了。在计算机发送、单片机接收时,计算机发送1帧数据,单片机响应中断,接收数据。单片机程序的具体实现过程如下图 3 结束语 串口通信是一种广泛应用于各个领域的通信方式,由于目前大部分计算机都安装了Windows95操作系统,所以本文具体实现了在Windows95下利用它的SDK函数来与单片机进行串口通信。本文所提出的实现函数在所有当前流行软件如VC++、Delphi等中都可实现。它不仅可以用于近距离的RS-232通信,而且,还可以实现中远距离RS-485通信。在使用该程序的通信系统中,近远距离的通信都取得良好的效果。 参考文献 1 MirhoCA,TerrisseA著,贺军,高胜友译.WINDOWS95通信编程.北京:清华大学出版社,1997 2 陈光东,赵性初.单片微型计算机原理与接口技术.武汉:华中理工大学出版社,1993 5/22/2006 单片机初学者几个不易掌握的概念(zz)一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中 ,连连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很 多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各 器件之间的工作必须相互协调?所以就需要的连线就很多了,如果仍如同模拟电路一样 ,在各微处理器和各器件间单独连线线,则线的数量将多得惊人,所以在微处理机中引 入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线 上,即相当于各个器件并联起来,但仅这样还不行,如果有两?器件同时送出数据,一 个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是是不允许的,所以 要通过控制线进行控制,使器件分时工作,任何时候只能有一个器件发送数据(可以有 多个器件同时接收)。器件的数据线也就被称为数据总线,器件所有的控制线被称 控制 总线。 在单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配 地址,才能 用,分配地址当?也是以电信号的形?给出的,由于存储单元比较多,所以 ,用于地址分的线也较多,这些线被称为地址总线。 二、数据、地址、指令:之所以将这三者放在一起,是因为这三者的本质都是一样的─数字,或者说都是?串‘0’和‘1’组成的序列。换言之,地址、指令也都是数据 。指令由单片机芯片的设计者规定的一种数字,它与我们常用的指令助记符有着严格的 一一对应关,不可以由 单片机的开发者更改。地址:是寻找单片机内部、外部的存储 单元、输入输出口的依据,内 单元的地址值已由芯?设计者规定好,不可更改,外部的 单元可以由单片机开发者自行决,但有一些地址单元是一定要有的(详见程序的执行过 程)。数据:这是由微处理机处理的 象,在各种 不同的应用电路中各不相同,一般而言,被处理的数据可能有这么几种情况: 1地址(如MOV DPTR,#1000H),即地址1000H送入DPTR。 2方式字或控制字(如MOV TMOD,#3),3即是控制字。 3常数(如MOV TH0,#10H)10H即定时常数。 4实际输出值(如P1口接彩灯,要灯全亮,则执行指令:MOV P1,#0FFH,要灯全暗, 则执 兄 令:MOV P1,#00H)这里0FFH和00H都是实际输出值。又如用于LE*的字形码,也是实 际?出的值。 理解了地址、指令的本质,就不难理解程序运行过程中为什么会跑飞,会把数据当成指 令来 行了。 三、*0口、*2口和P3的第二功能用法 初学时往往对P0口、P2口和P3口的第二功能用法迷惑不解,认为第二功能和原功能之间 要有个切换的过程,或者说要有一条指令,事实?,各端口的第二功能完全是自动?,不需要?指令来转换。如P3.6、P3.7分别是WR、RD信号,当微片理机外接RAM或有外部I/O口 时,它们挥作第二功能,不能作为通用I/O口使用,只要一微处理机一执行到MOVX指令,就会有相应的信号从 P3. 或P3.7送出,不需要事先用指令说明。事实上‘不能作为通用I/O口使用’也并不是‘不能?而是(使用者)‘不会’将其作为通用I/O口使用。你完全可以在指令中按排一条S ETB P3.7的指令,并且当单片机执行到这条指令时,也会使P3.7变为高电平,但使用者不会 这么做,因为这通常这会导致系统当溃(即死机)。 四、程序的执行过程 单片机在通电复位后8051内的程序计数器(PC)中的值为‘0000?,所以程序总是从‘0000’单元开始执行,也就是说:在系统的ROM中一定要存在‘0000’?个单元,并且在‘0000’单元中存放的一定是一条指令。 五、堆栈 堆栈是一个区域,是用来存放数据的,这个区域本身没有任何特殊之处,就是内部RAM的 一?份,特殊的是它存放和取用数据的方式,即所谓的‘先进后出,后进先出’,并且 堆栈有特 的数据传输指令,即‘PUSH’和甈OP’,有一个特殊的专为其服务的单元,即堆栈指 针SP 每当执一次 PUSH指令时,SP就(在原来值的基础上)自动加1,每当执行一次POP指令,SP就(在原 来值基础上)?动减1。由于SP中的值可以用指令加以改变,所以只要在程序开始阶段更改了SP值,就可以把堆栈设置在规定的内存单元中,如在程序开始时?用一条MOV SP,#5FH指令,就时把堆栈设置在从内存单元60H开始的单元中。一般程序的开头总有这 么?条设置堆栈指针的指令,因为开机时,SP的初始值为07H,这样就使堆栈从08H单元 开始往后?8H到1FH这个区域正是8031的第二、三、四工作寄存器区,经常要被使用,这会造成 数?的浑乱。不? 作者编写程序时,初始化堆栈指令也不完全相同,这是作者的习惯问 题。当设置好堆栈区?,并不意味着该区域成为一种专用内存,它还是可以象普通内存 区域一样使用,只是一般情 下编程者不会把它当成?通内存用了。 六、单片机的开发过程 这里所说的开发过程并不是一般书中所说的从任务分析开始,我们假设已设计并制作好 硬件下面就是编写软件的工作。在编写软件之前,首先要确定一些常数、地址,事实?这些 常?、地址在设计阶段已被直接或间接地确定下来了。如当某器件的连线设计好后,其 地址也就确定了,当 器件的功能被确定下来后,其控制字也就被确定了。然后用文本编缉器(如EDIT、CCED 等)写软件,编写好后,用编译器对源程序文件编译,查错,直到没有语法错误,除了极简 单?程序外,一般应用仿真机对软件进行调试,直到程序运行正确为止。运行正确后, 就可以写(将程序固 化在EPROM中)。在源程序被编译后,生成了扩展名为HEX的目标文件,一般编程器能够 识别种格式的文件,只要将此文件调入即可写片。在此,为使大家对整个过程有个认识,举 一?说明: ORG 0000H LJMP START ORG 040H START: MOV SP,#5FH ;设堆栈 LOOP: NOP LJMP LOOP ;循环 END ;六、单片机的开发过程 这里所说的开发过程并不是一般书中所说的从任务分析开始,我们假设已设计并制作好 硬件下面就是编写软件的工作。在编写软件之前,首先要确定一些常数、地址,事实?这些 常?、地址在设计阶段已被直接或间接地确定下来了。如当某器件的连线设计好后,其 地址也就确定了,当 器件的功能被确定下来后,其控制字也就被确定了。然后用文本编缉器(如EDIT、CCED 等)写软件,编写好后,用编译器对源程序文件编译,查错,直到没有语法错误,除了极简 单?程序外,一般应用仿真机对软件进行调试,直到程序运行正确为止。运行正确后, 就可以写(将程序固 化在EPROM中)。在源程序被编译后,生成了扩展名为HEX的目标文件,一般编程器能够 识别种格式的文件,只要将此文件调入即可写片。在此,为使大家对整个过程有个认识,举 一?说明: ORG 0000H LJMP START ORG 040H START: MOV SP,#5FH ;设堆栈 LOOP: NOP LJMP LOOP ;循环 END [转帖]单片机系统的低功耗设计策略摘要:嵌入式系统的低功耗设计需要全面分析各方面因素,统筹规划。在设计之初,各个因素往往是相互制约、相互影响的,一个降低系统功耗的措施有时会带来其他方面的“负效应”。因此,降低系统整体功耗,需要仔细分析和计算。本文从硬件和应用软件设计两个方面,阐述一个以单片机为核心的嵌入式系统低功耗设计时所需考虑的一些问题。
关键词:低功耗设计 硬件设计 应用软件设计 低功耗模式 在嵌入式应用中,系统的功耗越来越受到人们的重视,这一点对于需要电池供电的便携式系统尤其明显。降低系统功耗,延长电池的寿命,就是降低系统的运行成本。对于以单片机为核心的嵌入式应用,系统功耗的最小化需要从软、硬件设计两方面入手。 随着越来越多的嵌入式应用使用了实时操作系统,如何在操作系统层面上降低系统功耗也成为一个值得关注的问题。限于篇幅,本文仅从硬件设计和应用软件设计两个方面讨论。 1 硬件设计 选用具有低功耗特性的单片机可以大大降低系统功耗。可以从供电电压、单片机内部结构设计、系统时钟设计和低功耗模式等几方面考察一款单片机的低功耗特性。 1.1 选用尽量简单的CPU内核 在选择CPU内核时切忌一味追求性能。8位机够用,就没有必要选用16位机,选择的原则应该是“够用就好”。现在单片机的运行速度越来越快,但性能的提升往往带来功耗的增加。一个复杂的CPU集成度高、功能强,但片内晶体管多,总漏电流大,即使进入STOP状态,漏电流也变得不可忽视;而简单的CPU内核不仅功耗低,成本也低。 1.2 选择低电压供电的系统 降低单片机的供电电压可以有效地降低其功耗。当前,单片机从与TTL兼容的5 V供电降低到3.3 V、3 V、2 V乃至1.8 V供电。供电电压降下来,要归功于半导体工艺的发展。从原来的3 μm工艺到现在的0.25、0.18、0.13 μm工艺, CMOS电路的门限电平阈值不断降低。低电压供电可以大大降低系统的工作电流,但是由于晶体管的尺寸不断减小,管子的漏电流有增大的趋势,这也是对降低功耗不利的一个方面。 目前,单片机系统的电源电压仍以5 V为主,而过去5年中,3 V供电的单片机系统数量增加了1倍,2 V供电的系统也在不断增加。再过五年,低电压供电的单片机数量可能会超过5 V电压供电的单片机。如此看来,供电电压降低将是未来单片机发展的一个重要趋势。 1.3 选择带有低功耗模式的系统 低功耗模式指的是系统的等待和停止模式。处于这类模式下的单片机功耗将大大小于运行模式下的功耗。过去传统的单片机,在运行模式下有wait和stop两条指令,可以使单片机进入等待或停止状态,以达到省电的目的。 等待模式下,CPU停止工作,但系统时钟并不停止,单片机的外围I/O模块也不停止工作;系统功耗一般降低有限,相当于工作模式的50%~70%。 停止模式下,系统时钟也将停止,由外部事件中断重新启动时钟系统时钟,进而唤醒CPU继续工作,CPU消耗电流可降到μA级。在停止模式下,CPU本身实际上已经不消耗什么电流,要想进一步减小系统功耗,就要尽量将单片机的各个I/O模块关掉。随着I/O模块的逐个关闭,系统的功耗越来越小,进入停止模式的深度也越来越深。进入深度停止模式无异于关机,这时的单片机耗电可以小于20 nA。其中特别要提示的是,片内RAM停止供电后,RAM中存储的数据会丢失,也就是说,唤醒CPU后要重新对系统作初始化。因此在让系统进入深度停止状态前,要将重要系统参数保存在非易失性存储器中,如EEPROM中。深度停止模式关掉了所有的I/O,可能的唤醒方式也很有限,一般只能是复位或IRQ中断等。 保留的I/O模块越多,系统允许的唤醒中断源也就越多。单片机的功耗将根据保留唤醒方式的不同,降至1μA至几十μA之间。例如,用户可以保留外部键盘中断,保留异步串行口(SCI)接收数据中断等来唤醒CPU。保留的唤醒方式越多,系统耗电也就会多一些。其他可能的唤醒方式还有实时钟唤醒、看门狗唤醒等。停机状态较浅的情况下,外部晶振电路还是工作的。 图1以Freescale的HCS08单片机为例,给出不同运行模式下的系统功耗。HCS08是8位单片机,有多个系列,各系列I/O模块数目有所不同,但低功耗模式下的电流消耗大致相同。 图1HCS08单片机各模式下的耗电 以R系列单片机为例:在室温(25℃)下,不包括I/O口的负载,以2 V供电,将可编程锁相环时钟设为16 MHz(总线时钟8 MHz),典型电流值为2.6 mA,当温度升高到85℃时,供电电流也升高到3.6 mA;而采用3 V供电,这一组数据升高至3.8 mA和4.8 mA。用2 V供电,直接使用外部晶振2 MHz(总线时钟1 MHz)时,典型运行电流降至450 μA。在等待状态下,因时钟并没有停止,耗电情况和时钟频率有很大关系,节省的功耗有限;而进入轻度停止(stop3),以外部中断唤醒,电流消耗在0. 5 μA左右。在中度停止态(stop2),功耗可进一步降低。使用内部1 kHz的时钟,保持1个运行的时钟,周期性唤醒CPU,所增加的电流约为0.3 μA。在深度停止态(stop1),RAM的数据也不再保留,只能通过外部复位重启系统,此时的电流消耗可降到20 nA。以上数据都是在室温下测量所得。当环境温度升高到85℃时,电流消耗可能增加3~5倍。 1.4选择合适的时钟方案 时钟的选择对于系统功耗相当敏感,设计者需要注意两个方面的问题: 第一是系统总线频率应当尽量低。单片机内部的总电流消耗可分为两部分——运行电流和漏电流。理想的CMOS开关电路,在保持输出状态不变时,是不消耗功率的。例如,典型的CMOS反相器电路,如图2所示,当输入端为零时,输出端为1,P晶体管导通,N晶体管截止,没有电流流过。而实际上,由于N晶体管存在一定漏电流,且随集成度提高,管基越薄,漏电流会加大。温度升高,CMOS翻转阈电压会降低,而漏电流则随环境温度的增高变大。在单片机运行时,开关电路不断由“1”变“0”、由“0”变“1”,消耗的功率是由单片机运行引起的,我们称之为“运行电流”。如图2所示,在两只晶体管互相变换导通、截止状态时,由于两只管子的开关延迟时间不可能完全一致,在某一瞬间会有两只管子同时导通的情况,此时电源到地之间会有一个瞬间较大的电流,这是单片机运行电流的主要来源。可以看出,运行电流几乎是和单片机的时钟频率成正比的,因此尽量降低系统时钟的运行频率可以有效地降低系统功耗。 图2典型的CMOS反相器 第二是时钟方案,也就是是否使用锁相环、使用外部晶振还是内部晶振等问题。新一代的单片机,如飞思卡尔的HCS08系列单片机,片内带有内部晶振,可以直接作为时钟源。使用片内晶振的优点是可以省掉片外晶振,降低系统的硬件成本;缺点是片内晶振的精度不高(误差一般在25%左右,即使校准之后也可能有2%的相对误差),而且会增加系统的功耗。 现代单片机普遍采用锁相环技术,使单片机的时钟频率可由程序控制。锁相环允许用户在片外使用频率较低的晶振,可以很大地减小板级噪声;而且,由于时钟频率可由程序控制,系统时钟可以在一个很宽的范围内调整,总线频率往往能升得很高。但是,使用锁相环也会带来额外的功率消耗。 单就时钟方案来讲,使用外部晶振且不使用锁相环是功率消耗最小的一种。 2 应用软件方面的考虑 之所以使用“应用软件”的说法,是为了区分于“系统软件”或者“实时操作系统”。软件对于一个低功耗系统的重要性常常被人们忽略。一个重要的原因是,软件上的缺陷并不像硬件那样容易发现,同时也没有一个严格的标准来判断一个软件的低功耗特性。尽管如此,设计者仍需尽量将应用的低功耗特性反映在软件中,以避免那些“看不见”的功耗损失。 2.1 用“中断”代替“查询” 一个程序使用中断方式还是查询方式对于一些简单的应用并不那么重要,但在其低功耗特性上却相去甚远。使用中断方式,CPU可以什么都不做,甚至可以进入等待模式或停止模式;而查询方式下,CPU必须不停地访问I/O寄存器,这会带来很多额外的功耗。 2.2 用“宏”代替“子程序” 程序员必须清楚,读RAM会比读Flash带来更大的功耗。正是因为如此,低功耗性能突出的ARM在CPU设计上仅允许一次子程序调用。因为CPU进入子程序时,会首先将当前CPU寄存器推入堆栈(RAM),在离开时又将CPU寄存器弹出堆栈,这样至少带来两次对RAM的操作。因此,程序员可以考虑用宏定义来代替子程序调用。对于程序员,调用一个子程序还是一个宏在程序写法上并没有什么不同,但宏会在编译时展开,CPU只是顺序执行指令,避免了调用子程序。唯一的问题似乎是代码量的增加。目前,单片机的片内Flash越来越大,对于一些不在乎程序代码量大一些的应用,这种做法无疑会降低系统的功耗。 2.3 尽量减少CPU的运算量 减少CPU运算的工作可以从很多方面入手:将一些运算的结果预先算好,放在Flash中,用查表的方法替代实时的计算,减少CPU的运算工作量,可以有效地降低CPU的功耗(很多单片机都有快速有效的查表指令和寻址方式,用以优化查表算法);不可避免的实时计算,算到精度够了就结束,避免“过度”的计算;尽量使用短的数据类型,例如,尽量使用字符型的8位数据替代16位的整型数据,尽量使用分数运算而避免浮点数运算等。 2.4 让I/O模块间歇运行 不用的I/O模块或间歇使用的I/O模块要及时关掉,以节省电能。RS232的驱动需要相当的功率,可以用单片机的一个I/O引脚来控制,在不需要通信时,将驱动关掉。不用的I/O引脚要设置成输出或设置成输入,用上拉电阻拉高。因为如果引脚没有初始化,可能会增大单片机的漏电流。特别要注意有些简单封装的单片机没有把个别I/O引脚引出来,对这些看不见的I/O引脚也不应忘记初始化。 3 结论 一个成功的低功耗设计应该是硬件设计和软件设计的结合。从硬件设计开始,就应该充分意识到一个低功耗应用的特性,选择一款合适的单片机,通过对其特性的了解,设计系统方案;在软件设计上,要考虑到低功耗编程的特殊性,并尽量使用单片机的低功耗模式。 限于篇幅,仅仅讨论了低功耗设计中的一些常见问题,更多的问题只能靠设计者去实际分析和解决了。 单片机应用系统抗干扰技术(zz)1. 引言
近年来,单片机在工业自动化、生产过程控制、智能仪器仪表等领域的应用越来越广泛,大大提高了产品的质量,有效地提高了生产效率。但是,测控系统的工作环境往往复杂、比较恶劣,尤其是系统周围的电磁环境,这对系统的可靠性与安全性构成了极大的威胁。单片机测控系统必须长期稳定、可靠运行,否则将导致控制误差加大,严重时会使系统失灵,甚至造成巨大损失。下面着重分析干扰对单片机应用系统的影响,并结合亲身经验,从软、硬两个方面给出具体的解决方法。 2. 干扰对单片机应用系统的影响 影响应用系统可靠、安全运行的主要因素来自系统内部和外部的各种电磁干扰,以及系统结构设计、元器件安装、加工工艺和外部电磁环境条件等。这些因素对单片机系统造成的干扰后果主要表现在以下几个方面: (1) 测量数据误差加大 干扰侵入单片机系统测量单元模拟信号的输入通道,叠加在测量信号上,会使数据采集误差加大,甚至干扰信号淹没测量信号,特别是检测一些微弱信号,如人体的生物电信号。 (2) 影响单片机RAM存储器和E2PROM等 在单片机系统中,程序及表格、数据存在程序存储器EPROM或FLASH中,避免了这些数据受干扰破坏。但是,对于片内RAM、外扩RAM、E2PROM中的数据都有可能受到外界干扰而变化。 (3) 控制系统失灵 单片机输出的控制信号通常依赖于某些条件的状态输入信号和对这些信号的逻辑处理结果。若这些输入的状态信号受到干扰,引入虚假状态信息,将导致输出控制误差加大,甚至控制失灵。 (4) 程序运行失常 外界的干扰有时导致机器频繁复位而影响程序的正常运行。若外界干扰导致单片机程序计数器PC值的改变,则破坏了程序的正常运行。由于受干扰后的PC值是随机的,程序将执行一系列毫无意义的指令,最后进入“死循环”,这将使输出严重混乱或死机。 3. 硬件抗干扰技术 3.1 选择良好的元器件与单片机 硬件抗干扰技术是系统设计时首选的抗干扰措施,它能有效抑制干扰源,阻断干扰传输通道。常用的硬件设计抗干扰措施如下: ① 现在市场上出售的元器件种类繁多,有些元器件可用但性能不佳,有些元器件极易受到干扰,因此在选择关键元器件如译码器、键盘扫描控制器、RAM等时,最好选用性能稳定的工业级产品。 ② 单片机的选择不光考虑硬件配置、存储容量等,更要选择抗干扰性能较强的单片机,笔者在使用多种类型的单片机中认为,AVR系列单片机抗干扰能力较强。 ③ 外时钟是高频的噪声源,对系统的内外都能产生干扰,因此在满足需要的前提下,选用频率低的单片机是明智之举。 3.2 抑制电源干扰 单片机系统中的各个单元都需要使用直流电源,而直流电源一般是市电电网的交流电经过变压、整流、滤波、稳压后产生的,因此电网上的各种干扰便会引入系统。除此之外,由于交流电源共用,各电子设备之间通过电源也会产生相互干扰,因此抑制电源干扰尤其重要。电源干扰主要有以下几类: ① 电源线中的高频干扰 供电电力线相当于一个接受天线,能把雷电、电弧、广播电台等辐射的高频干扰信号通过电源变压器初级耦合到次级,形成对单片机系统的干扰; ② 感性负载产生的瞬变噪音 切断大容量感性负载时,能产生很大的电流和电压变化率,从而形成瞬变噪音干扰,成为电磁干扰的主要形式; ③ 晶闸管通断时的干扰 晶闸管通断时的电流变化率很大,使得晶闸管在导通瞬间流过一个具有高次谐波的大电流,在电源阻抗上产生很大的压降,从而使电网电压出现缺口,这种畸变了的电压波形含有高次谐波,可以向空间辐射或通过传导耦合,干扰其它设备。此外,还有电网电压波动或电压瞬时跌落产生干扰,等等。 电源干扰的抑制,通常可采用以下几种方法: ① 接地技术 实践证明,单片机系统设备的抗干扰与系统的接地方式有很大关系,接地技术往往是抑制噪音的重要手段。良好的接地可以在很大程度上抑制系统内部噪音耦合,防止外部干扰的侵入,提高系统的抗干扰能力。设备的金属外壳等要安全接地;屏蔽用的导体必须良好接地; ② 屏蔽线与双胶线传输 屏蔽线对静电干扰有强的抑制作用,而双胶线有抵消电磁感应干扰的作用。开关 信号检测线和模拟信号检测线可以使用屏蔽双胶线,来抵御静电和电磁感应干扰;特殊的干扰源也可以用屏蔽线连接,屏蔽了干扰源向外施加干扰; ③ 隔离技术 信号的隔离目的之一是从电路上把干扰源和易干扰的部分隔离出来,使监控装置与现场仅保持信号联系,但不直接发生电的联系。隔离的实质是把引进的干扰通道切断,从而达到隔离现场干扰的目的。 一般单片机应用系统既有弱电控制系统又有强电控制系统,通常实行弱电和强电隔离,是保证系统工作稳定、设备与操作人员安全的重要措施。常用的隔离方式有光电隔离、变压器隔离、继电器隔离和布线隔离等。 ④ 模拟信号采样抗干扰技术 单片机应用系统中通常要对一个或多个模拟信号进行采样,并将其通过A/D转换成数字信号进行处理。为了提高测量精度和稳定性,不仅要保证传感器本身的转换精度、传感器供电电源的稳定、测量放大器的稳定 、A/D转换基准电压的稳定,而且要防止外部电磁感应噪声的影响,如果处理不当,微弱的有用信号可能完全被无用的噪音信号淹没。在实际工作中,可以采用具有差动输入的测量放大器,采用屏蔽双胶线传输测量信号,或将电压信号改变为电流信号,以及采用阻容滤波等技术。 在许多信号变化比较慢的采样系统中,如人体生物电(心电图、脑电图)采样、地震波记录等,影响最大的是50Hz的工频干扰。因此对工频干扰信号的抑制是保证测量精度的重要措施之一。抑制和消除工频干扰,常用的方法是在A/D转换电路之前加RC滤波器,或者采用采样时间是50Hz的工频周期整数倍的双积分式A/D转换器。 3.3 数字信号传输通道的抗干扰技术 数字输出信号可作为系统被控设备的驱动信号(如继电器等),数字输入信号可作为设备的响应回答和指令信号(如行程开关、启动按钮等)。数字信号接口部分是外界干扰进入单片机系统的主要通道之一。在工程设计中,对数字信号的输入/输出过程采取的抗干扰措施有:传输线的屏蔽技术,如采用屏蔽线、双胶线等;采用信号隔离措施;合理接地,由于数字信号在电平转换过程中形成公共阻抗干扰,选择合适的接地点可以有效抑制地线噪声。 3.4 硬件监控电路 在单片机系统中,为了保证系统可靠、稳定地运行,增强抗干扰能力,需要配置硬件监控电路,硬件监控电路从功能上包括以下几个方面: ① 上电复位:保证系统加电时能正确地启动; ② 掉电复位:当电源失效或电压降到某一电压值以下时,产生复位信号对系统进行复位; ③ 数据保护:当电源或系统工作异常时,对数据进行必要的保护,如写保护、后备电池切换等; ④ 电源监测:供电电压出现异常时,给出报警指示信号或中断请求信号; ⑤ 硬件看门狗:当处理器遇到干扰或程序运行混乱产生“死锁”时,对系统进行复位。 有些著名的半导体厂商已将上述这些功能集成到一起,如MAXIM公司的MAX690、MAX706等。 3.5 印制板电路合理布线 印制电路板(PCB)是电子产品中电路元件和器件的支撑件,它提供电路元件和器件之间的电气连接。随着电子技术的飞速发展,PCB的密度越来越高,PCB设计的好坏对抗干扰能力影响很大。因此,在进行PCB设计时,必须遵守PCB设计的一般原则,并应符合抗干扰设计的要求。下面着重说明两点: ① 关键器件放置:在器件布置方面与其它逻辑电路一样,应把相互有关的器件尽量放得靠近些,这样可以获得较好的抗噪声效果。时钟发生器、晶振和CPU的时钟输入端都易产生噪声,要相互靠近些;CPU复位电路、硬件看门狗电路要尽量靠近CPU相应引脚;易产生噪声的器件、大电流电路等应尽量远离逻辑电路,如有可能,应另外做电路板。 ② D/A、A/D转换电路要特别注意地线的正确连接,否则干扰影响将很严重。D/A、A/D芯片及采样芯片均提供了数字地和模拟地,分别有相应的管脚。在线路设计中,必须将所有器件的数字地和模拟地分别相连,但数字地与模拟地仅在一点上相连。 另外,也可以采用屏蔽保护,屏蔽可用来隔离空间辐射。对噪声特别大的部件(如变频电源、开关电源)可以用金属盒罩起来以减少噪声源对单片机的干扰,对容易受干扰的部分,可以增加屏蔽罩并接地,使干扰信号被短路接地。
4. 软件抗干扰原理及方法 单片机系统中被广泛应用。 从8位、16位微控制器到ARM处理器(zz) ARM7 SoC(Systems-on-chip)价格的下调,给了那些考虑使用此种芯片的嵌入式开发人员更好的选择。降价节省的费用将在短期内和长期内得到检验,同时得到检验的还有那些因采用ARM7而对价格下降施压的其他因素。一些移植的问题也将在选择开发软件时考虑到,短期或长期使用对整个开发以及最终产品费用的影响。ARM7提供了非常好的机会推动那些原来使用8位或16位机的开发人员转而使用32位处理器。 “从经济的角度上说,他是愚蠢的!”,这句话是1992年美国大选时克林顿批评布什的非官方竞选标语,它或许能恰当的用到同时代的嵌入式系统设计中去,因为研发人员不得不从各个能想到的角度去使成本最低。国内外的竞争使得产品利润越来越低,而设计的最终期限让人期待,上市逾早,市场愈容易占领,利润也逾大。成本、性能、上市时间是铁三角关系,而这三角关系会一直困扰、折磨着产品的设计研发工程师,即使是调和三者的关系都非常的困难。 去年的嵌入式市场,基于ARM7TDMI内核的SoC(级芯片)微控制器吸引了很多人的注意。它们集成了更多的外设,价格也更具有竞争力,小型的封装,通用的外设,可配置的存储器以及快的令人瞠目的频率。本文将把注意力基本放在ARM7 SoC上,检查它对“铁三角”关系的冲击,并且讨论那些有时在目标相冲突的时候必须被加以考虑以获得最佳的利润的因素。在考虑是否会在设计中选择某一部分的时候,研发人员必须考虑短期的和长期的不同。 在短期,主要的因素是芯片价格,功能以及开发的费用。长期的因素包括潜在的芯片替代,软件维护的费用:程序缺陷的维护以及功能的扩展。我们将把注意力依次集中到这些因素,看看ARM结构是如何在价格和性能方面朝着有利的方向前进。 ARM7 SoC的性价比达到前所未有的高度,这并不是什么秘密。ARM7 SoC主要的比较对象是传统的8位、16位的微控制器。长时间占据低端市场的8位微控制器正越来越感受到ARM7 SoC的压力。例如,一片传统的8位微控制器,10 MIPS的执行速度,带有64K的Flash,4K的RAM,ADC,3个定时器,EEPROM,SPI,UART,芯片引脚在40到46之间,仅仅购买几片的话,价格大约在7.5美元。而除了RAM容量不同外,其他配置一样的ARM7 SoC,仅仅购买几片的话,价格大约在4美元到5.5美元。当然,不可能与种类繁多的8位微控制器一件一件的进行比较,但是,上面比较的是主要的部分,你或许希望有1K的EEPROM,然而ARM7 SoC是没有的。从另一方面说,那些队成本特别在意的人或许会希望ARM7内有16K的RAM。与16位的控制器比较也存在类似的情况。当采用单片机设计最终的产品,每片多花费2到3美元可导致公司在此产品退出市场前总共要多花费几万或者几十万英镑。 许多8位机的资深研发人员通常会对要阅读ARM7的手册感到头疼。相比ARM7寄存器的设置,8位机的控制寄存器的设置显得相当简单。的确,当写ARM7片内外设的驱动时,需要处理更多的寄存器。本文作者也曾试着看那些设备的驱动是否可以省时省力在合理的框架内编写,可是最终的曙光在最后被遮挡:ARM的寄存器数量有时会因设备的状态、创建和消除例子而膨胀。换言之,8位机可能有一个R/W寄存器来处理,而要达到同样的效果,ARM结构或许需要三个寄存器处理。另外一件与“寄存器膨胀”相关的是向量中断控制器(VIC),VIC拥有一些寄存器来控制优先级以及配置中断。这是学习曲线上的一次性投入,好消息是一旦研发人员熟练的写各个寄存器来设置以及清除sfr,那么对ARM外设的操作就会和8位、16位一样得心应手。 在价格的比较中,我们提到对成本特别敏感的使用者通常会希望ARM有8K、16K甚至32K的RAM,而且要比带有4KRAM的8位或16位机更加便宜。这开启了一个有趣的可能性,那就是在合并了像TCP/IP堆栈,嵌入式文件系统以及用户图形界面后,可以大大增进产品的性能。它也把使用RTOS比用8位、16位机变得更加有吸引力。聪明的读者或许要指出购买RTOS是一笔额外的费用,违反了把设置成本最小化的思想。然而事实上是所用的RTOS值的花钱,同时它在产品的维护与升级方面表现出巨大的潜力,可以省去不菲的费用。一旦如何使用RTOS的学习曲线被克服,使用这样的工具往往可以使软件设计更加的系统化。功能的外扩通常会相当的容易,而且在增加应用的时候,可以按有关要求做较少的衰减测试。简而言之,软件的开发是费力又费钱的,软件的维护更是如此,所有可以减少此种费用的方法都是很好的事情。 大多数RTOS的卖主都有白皮书或其他信息,很容易地可以帮助研发人员决定某个RTOS是否适合他们的应用。从8位、16位领域转过来的研发人员,过去习惯于在没有RTOS的情况下达到目的他们会发现大多数ARM7 SoC拥有足够的资源使用RTOS而无须担心成本底线。总之,如果你怀疑RTOS对你产品效益的长期利益,现在你可以全力以赴的用它了,因为它无须额外的存储器。 嵌入式系统另外的一个引人注目的成本是研发工具。现在有许多高水平的语言开发工具供选择,并且每天都有新的面市。这些工具从没有初始费用的GNU工具到各种不同价格不同性能的付费工具。尽管ARM7 SoC拥有良好的价格与资源配置,从8位、16位转过来的研发人员在使用这些工具几年后,将很好的回忆起所有的写出高效代码的范例。 内存仍旧是影响成本最大的因素。值得牢记的是ARM编译器实际上是两个,一个为ARM,另外一个为Thumb指令模式。拥有较高的代码密度的Thumb指令结构是节约资源以及成本的钥匙。使用Thumb模式代码紧凑程度至少等于,在许多例子还要优于8位、16位控制器所能达到的程度。 ARM7 SoC的使用者值得认真地评估编译器的效率而先不管它增加的成本,尽管编译的结果可靠,GNU编译器并非在代码优化方面做得最好。高质量的代码优化值得考虑,ARM7 SoC的一个普通应用就是典型的代表。这样的应用分别需要128K和256K字节的Flash,16K的SRAM,4通道的10位ADC,2个UART、SPI、I2C,可以在线编程以及跟踪调试,LQTP64封装 。在北美,购买5K的话,每片大约分别需要6.09美元与6.84美元,一件0.75美元的差价,如果卖出5000件那就是要多支出3750美元。经过一般编译器优化后需要256K的代码,在经过有高度优化能力的编译器编译后可以只用128K。 一旦有更多的外设集成到芯片,性价比相差就更大了。例如,带有CAN控制器的ARM芯片才多花费0.85美元。这些进一步减少编译器的花费所占的比重,这些工具每年可以节省12500美元到2000美元。 最近上市的 ARM7 SoC内带DAC,引脚加多,带有128K存储器的要比256K存储器的ARM芯片低2.52美元。这样,用量5K工具的花费更少,大约在1190片就可以收回成本,整个下来可以节省9601美元。 最后,一种内带USB控制器的新型ARM7 SoC带有128K存储器的要比256K存储器的ARM芯片低2.78美元,整个下来可以节省10900美元。当然,个别的情况会有出入,但是很清楚的是高质量的编译器不但可以节省下它自己的费用,而且从长远来看,还可以为公司增加收入。 另外,高质量编译器的使用者一般希望能够从厂家得到直接的技术支持。而如前面所述,软件已经成为整个项目中劳动密集型、最费钱的环节,编译器可以节省重复性劳动。进一步说,在竞争激烈的现在,上市时间至关重要,即便是晚上几天,几周之内损失的利益都会超过开发工具的费用。 在软件开发的预算中,调试通常占据重要的角色。有多少软件工程师就几乎有相同数量的软件调试思想与方法。不过,大多数人倾向于采用好用且准确的JTAG调试方法而不采用传统的嵌入式调试技术。因为价格与时钟频率的问题,in-circuit仿真器已经不再被采用。市场上有各种各样的JTAG调试器,在考虑采用哪个调试器时,有三种重要的因素决定着调试器的价格:速度,跟踪能力以及front-end软件特性。对于大多数ARM7 SoC来说,各种调试器的价格有几百英镑的差距可供选择。有些可以达到每秒128K比特的速度,这些调试器一般可以和同时代的编译器联合使用。跟踪调试的能力因需要跟踪宏单元执行而使调试器价格相差几千美元,它是影响调试器价格的主要因素。高级调试软件的特性,例如精确控制中断触发以及其他类似的特性,通常可以在硬件调试器上发现。大多数情况,包括ARM7 SoCs,许多研发人员倾向于使用一个物美价廉且易学易用的调试器。 如同谚语所说,所有的事情,除了死亡与纳税之外,在生命里都没有保证。然而,可以打赌的是,将来ARM结构应用将越来越广泛。ARM主要芯片厂商,Atmel , Cirrus Logic, Intel, Freescale, Oki, Philips, Samsung, Sharp, STMicroelectronics, Texas Instruments以及其他提供某种ARM结构的厂家,完全可以确保嵌入式市场。唯一可能使设计者做噩梦的是许多人预言ARM将会如现在的8051一样,曾经风光无限,早晚会淡出市场。 ARM结构另外一个非常吸引人的优点是有无尽的发展空间。ARM7的MIPS不够的话?可以换ARM9或者ARM11!精挑细选的工具集会支持这些结构。需要比讨论的更廉价的芯片码?尽管没有正式的公布,市场上强烈的暗示基于Cortex内核的运行改造的Thumb指令结构,此结构就是大家所知的Thumb-II,将要继续在芯片价格上施压。一美元可以买到一片32位CPU吗?现在还不知道,不过可以推断以当前的趋势,在不久的将来芯片的价格会达到这样的价格。 |
|
|