狄巨星,赵建光,司亚超,贾 滨, 范晶晶
(河北建筑工程学院计算机系,河北 张家口 075024)
随着计算机技术、半导体技术以及电子技术的发展,嵌入式系统以其体积小、可靠性高、功耗低、软硬件集成度高等特点广泛应用于工业制造、过程控制、通信、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费类产品等众多领域。嵌入式系统硬件设计与调试是嵌入式系统设计成功的基础,而硬件电路中电源电路的设计与调试则是系统硬件调试成功的关键[1]。本文从实际应用出发,以无线安防监控系统中嵌入式系统电源的设计与调试为例,分析讨论嵌入式系统电源的设计与调试方法。
本系统采用Samsung公司的S3C2410A微处理器作为主控芯片,安防检测端结构如图1所示,检测端由S3C2410A实现控制。其核心部分主要包括GPRS控制、GPS控制、各种报警传感器控制、以及外围接口控制。CPU内嵌PPP及TCP/IP协议栈,同时分别通过串行口UART0去控制GPRS的工作,通过串行口UART1控制GPS的运行。
图1 无线安防监控系统监控端结构
其中:(1)ARM对GPRS的控制主要是通过串口UART0发送AT命令实现。在该系统设计中,CPU可通过控制I/O口的高低电平,实现对GPRS的复位,主程序一旦运行,就不断进行GPRS模块的异常检测,发现异常情况立刻通过控制I/O口的电平实现复位[2]。
(2)ARM对GPS的控制主要通过串口UART1发送控制命令实现(GPS采样周期的设置、GPS输出数据选择、通讯波特率的设置等)。同时,通过串口UART1接收GPS数据信息[3]。
(3)ARM对其它外围接口的控制主要通过GPIO接口实现开关的输入/输出。
(4)ARM对系统整体控制:首先,ARM完成对GPS、GPRS及外围接口电路的初始化工作,并检测各种安防传感器的状态(红外对射传感、防撬压力传感等);其次,ARM不断监听GPIO的输入状态,当有报警信号输入时,启动GPS模块,开始接收定位信息,并将此信息存储在flash内;向串口UART0发送AT命令启动信息发送功能,并将GPS接收到的数据通过GPRS发送到报警主机和移动终端。
在整个安防系统中,涉及到监控中心服务器软件、安防检测端主机、底层软件。在此,仅介绍安防检测端主机软件的设计。程序框图如图2所示。
当系统完成初始化之后,即进入GPIO模块中,此模块主要读取来自I/O端口的电平信号,当有报警信号输入时此I/O端口的电平将发生变化,CPU检测到电平变化后进入GPS数据处理模块,若没有检测到电平的变化将循环检测,直到检测到电平变化;CPU检测到信号随即进入GPS数据处理模块,首先设置GPS的参数如波特率等,随后接收卫星数据,接收到数据通过串口传送到CPU,并存储到flash中,完成存储后,启动GPRS模块。在此模块中首先读取存储的卫星数据,发送AT命令启动信息发送功能,启动成功后将卫星数据作为待发送的信息内容,进行发送,发送成功后返回,并检测是否有接收的新信息,如有读取指令,CPU接收到读取的指令后进入指令处理模块进行指令分析,根据指令表采取相应措施[4]。
监控中心或者移动终端接收到报警信息后,可发送相应的紧急处理指令,发送的指令将被GPRS模块读取并传送到ARM,再根据指令表采取相应措施。
ARM有5种类型的电源引脚:VDDCORE引脚用于向内核供电,一般为1.8 V;VDDPLL、VDDOSC分别给PLL或者振荡器供电,一般为1.8 V;VDDIOP、VDDIOM分别用于给外设I/O口线、USB收发器以及外部总线接口I/O口线供电,一般为3.3 V。此外,系统的键盘、显示电路的供电电压需要+5 V电源。因此,本控制系统需要使用3组电源。通过对整个控制系统的控制要求和性能进行分析,确定本系统的负载电流大约为3 A。因此,系统电源的稳压芯片选用了ON公司的LM2576系列稳压器,把外部直流电源稳压成系统需要的+3.3 V和+5 V电源。由于系统内核电源供电要求1.8 V,因此系统应采用二级电源转换电路。本文选用TI公司的微功耗、极低压差PMOS稳压器(LDO芯片)TPS72518作为内核电源转换芯片,把+3.3 V稳压成+1.8 V,为处理器内核提供工作电源。系统电源电路如图3所示。C3、C6是稳压芯片的电解旁路电容,在电路中接入它们能使电路稳定地工作;C2、C5、C8为输出稳定电容,对于减小输出纹波、输出噪声以及负载电流变化的影响有较好的效果,根据稳压器自身的工作要求,电容分别选用10、100 μF 的电解电容。
图3 系统电源电路图
依据电路图焊接好元器件之后,仔细检查元器件是否焊接有误,电路板是否存在虚焊或焊渣短路等现象,检查无误后进行上电调试。由直流稳压电源发生器输出电源接入系统电源模块的输入端口(POW1),输入电源Vin调为+6 V,用示波器检查系统电源的1.8、3.3、5 V输出端口,没有电压输出。断电重新检查电路,发现电解电容C6已经被烧成黑色,原因是C6的正负极性接反了。换了新电容焊接正确后上电调试,1.8、5 V电压输出端正常,而3.3 V电压输出端电压不到3 V。查看稳压芯片LM2576的数据手册之后,调节输入电源Vin,同时检测三组系统电源的电压值,当三组电源输出正确时,输入电压Vin的值为6.7 V左右。由于本控制系统的负载电流大约是3 A,因此在电路中加入负载电流为3 A的负载电阻,以此来测试系统电源的稳定性。经过调试,电容、电感等元件发热正常,输出电压值正确。至此,系统电源模块调试成功[5]。
Linux支持两种电源管理标准,即APM和ACPI。APM是传统的高级电源管理方案,目前使用在许多基于Linux的便携式设备中;而ACPI(Advanced Configtlrationand Power Interface)则提供了更为灵活的电脑和设备管理接口。这两个标准不能同时运行,默认情况下Linux运行ACPI。APM可以使机器处于Suspend(悬挂)或Standby(待机)状态,并检查电池容量;而ACPI还可以使外设(如显示器、PCI)单独断电,在节省电能方面有更多的控制,其在PDA和新一代的手机中得到了广泛的应用。为了让电源管理功能生效,需要在Linux内核打开它,并且在Linux里加载必需的应用软件。电源管理活动需要对操作系统内核和设备驱动程序进行特殊的干预,在嵌入式Linux中,虽然低层电源管理驻留在操作系统内核中,但电源管理策略和机制来源于中介软件和用户应用程序代码。Linux内核中电源管理机制负责维持整个系统的电源状态,它可以看成是为驱动程序、中介软件和应用程序提供服务的元素。通过在驱动程序中实现电源管理接口,可以让驱动程序密切监控系统状态,在外部事件的驱动下,通过设定不同的状态反映设备的工作情况。为了实现设备电源管理接口,需要实现以下操作:
(1)使用pm_register对设备的每个实例(instance)进行注册;
(2)在对硬件进行操作之前调用pm_access(这样可保证设备已被唤醒,并处于ready状态);
(3)用户自己的pnl_callback函数在系统进入suspend状态,或者从suspend状态恢复的时候会被调用;
(4)当设备不使用时调用pm_dev_idle函数(这个操作是可选的,以增强设备对idle状态的监测能力);
(5)当被unload的时候,使用pm_unreggister取消设备的注册.中介程序允许用户预先定义某些策略,然后跟踪电源状态,执行特定的操作.在应用程序中,利用中介程序提供的API设立其基本的约束条件,强迫电源管理机制产生与其执行需求相匹配的变化。
Linux电源管理的实现机制包括以下API:
(1)dpm_set_OS()(内核)
(2)assert_constraint()
(3)remove_constraint()
(4)set_operatInK_state()(内核和驱动程序)
(5)set_policy()
(6)set_task_state()(经系统的用户级调用)以及/proc接口。
目前,很多嵌入式CPU都具有能降低功耗的电源工作模式,最常用的是空闲模式,此时CPU内核指令执行部分关闭,而所有外设和中断信号仍处于工作状态。由于空闲模式比CPU执行指令时的功耗要小得多,因而可以在任何时候,只要Linux检查到所有线程都处于阻塞状态(如等待中断、事件或定时时间)时,它都可以将CPU置于空闲模式。任何中断(如触摸屏事件、按下按键事件等)都能把CPU从空闲模式中唤醒,然后继续执行后面的代码。如果事件不能直接连接到外部中断,也可以用一个系统定时器定期唤醒CPU,例如在等待一个事件并且知道只要事件发生后在10 ms内能检测到,那么可以启动10 ms定时器,并把CPU置于空闲模式,每次处理定时中断时都要检查事件状态,如果状态没有变化,就立刻回到空闲。
通常,CPU的定时中断间隔为1 ms,Linux会频繁使CPU置于空闲模式,并一直维持到被中断唤醒.在这种情况下,最有可能唤醒CPU中断的是定时器中断本身,即使所有其他线程被阻塞,在其他中断、内部事件及长时间延迟之前,定时器中断也会以每秒100 Hz的频率把CPU从空闲模式中唤醒,以运行调度程序,就算调度程序确定所有线路都被阻塞,并很快将CPU回复到空闲模式。这样的频繁操作会浪费大量电源,因此,应尽可能长时问地将CPU置于空闲模式,而减少事件是解决这个问题的有效途径。
此外,通过分析代码和系统要求,可决定是否能改变处理中断的方式实现,例如,可以在进入空闲模式前关闭时隙中断信号,只有再次出现中断信号时才被唤醒,这种做法通常不太合适。尽管多数阻塞的线程可以直接或间接等待外部中断,但有些还是会依赖于定时中断,如一个驱动器会在等待外设时睡眠500 ms,此时的空闲模式下如果完全关闭系统定时器,可能意味着线程不能按时恢复工作,Linux最好能为调度程序进行可变计划超时设定。虽然Linux知道每个线程无法确定等待的是外部还是内部事件,或者计划在某特定时间再次运行,但Linux可算出第一个线程预定何时运行,并相应地在CPU置于空闲模式之前设定定时器工作。可变计划超时设定不会对调度程序造成很大的负担,但却能节省电源和处理时间。
可变计划超时设定只是减少事件的一种方法,存储器直接存取(DMA)也可让CPU长时间处于空闲模式,即使数据正在发送至外设或从外设收取。因此,只要有可能,都应在外围驱动器中使用DMA,这样做可以达到较好的省电效果。
电源特性对嵌入式产品的性能有很大的影响,通过对电源本身的设计构造进行改进以及对微操作系统和软件处理对电源进行管理,可以在系统运行过程中减小对电能的消耗,二者结合对嵌入式系统的应用会起到很好的促进作用。
[1]李丹.嵌入式系统电源特性[J].成都大学学报(自然科学版),2008,27(1):56-59.
[2]熊志昂,李红瑞.GPS技术与工程应用[M].北京:国防工业出版社,2005.
[3]HOFFS.Analysis of the general packet radio service(GPRS)of GSM as access to the Internet[J].Universal Personal Communication,1998(1):415-419.
[4]郑双,王悦,朱名日.嵌入式系统电源的设计与调试[J].经验交流,2007,10:67-68.
[5]马忠梅.ARM嵌入式处理器结构与应用基础[M].北京:北京航空航天大学出版社,2002:1-17.