邵 清,赵振宇,李广岩
(东北师范大学物理学院,吉林 长春 130024)
随着人类对自然开发的日益深入,工作在野外或者水下的信号检测设备越来越多.特别是在水下,由于电源难以通过外部供给,只能采用电池供电,因此,降低系统功耗,延长设备供电时间是系统设计与实现时必须要解决的关键问题.
目前,水下设备降低功耗的方法主要采用将微处理器间断性地设置为待机或掉电方式.文献[1]采用了MSP430F149为处理核心,利用芯片的待机与唤醒功能,实现系统低功耗运行,但是这种间断性的工作方式无法实现对信号进行连续、实时检测,不适用于值守系统;文献[2]通过低功耗芯片MSP430与TMS320C5509A处理器协同工作,实现了对水下目标信号的识别,这种方式虽然具备了实时检测信号的能力,但是MSP430和TMS320C5509A之间的工作协调较为复杂,系统正常工作时平均功耗也较高.
水下值守系统要求能够实时、不间断地监测是否存在某种频率的水声信号.为了保证信号检测的实时性和不间断性,不能将微处理器设置为待机或掉电模式,因此,如何综合软、硬件因素,在不采用待机或掉电方式下,最大限度地降低系统功耗是迫切需要解决的问题.为了实现水声信号检测功能并降低功耗,本文设计并实现了一种基于STM32L476单片机的超低功耗水下值守系统.
为了实现实时、不间断地信号监测,设计了如图1所示的水下值守系统.
图1 硬件框图
值守系统主要由水声换能器、信号调理电路、微处理器构成.水声换能器先将水声信号转换成电信号,由于水声传感器的输出信号十分微弱,为了保证信号在后续电路的处理范围内,防止引入高频干扰,需要采用信号调理电路对信号进行预处理[3];信号调理电路的预处理过程包括低通滤波、放大、限幅;微处理器利用片内ADC对信号采样,然后通过对信号进行傅里叶变换确定输入信号中是否存在设定的某种频率信号或若干种频率信号的组合,如果检测到,则输出对其他设备的唤醒信号.
待检测信号频率范围为16~100 kHz,根据奈奎斯特采样定理,ADC的采样频率至少为32 kHz[4].考虑到处理速度和内存因素,ADC的采样频率设置为32 kHz.
采样时间窗设置的越长,那么采样点数也越多,需要的内存也越大,但频谱分辨率就会越高.反之,采样时间窗短,采样点数少,占用的内存就也越少,但频谱分辨率会降低.因此,采样时间窗的选取需要权衡系统对频谱分辨率的要求以及内存和处理速度的要求.本文时间窗设置为128 ms,采集4 096个点,然后执行快速傅里叶变换(FFT)算法,可以使频谱分辨率及处理速度满足要求.
FFT算法就是不断地把长序列的DFT分解为几个短序列的DFT,并利用旋转因子的周期性和对称性来减少DFT的运算次数[5].本文采用的是时域抽取法FFT(DIT-FFT),并且在DIT-FFT的基础上采用了多类蝶形单元运算、预先计算旋转因子表、用N/2点的FFT计算一个N点实序列的DFT等措施,进一步减少了运算量.
软件流程如图2所示,首先对系统进行初始化,然后通过ADC对信号采样,并通过DMA传输数据,再执行FFT算法,进行门限判决.当FFT的运算结果中单个频点或者多个频点的数值超过门限,认为有用信号已经被检测到,微处理器将检测结果输出,若没有超过阈值,认为不是有用信号,然后循环上述过程.DMA的作用是确保微处理器在执行FFT算法的同时,依然可以对信号采样,并实时将数据转移到内存中,保证数据的完整性.
图2 软件流程
为了保证信号检测的实时性,系统要求微处理器单次执行4 096个点的FFT运算时间不能超过50 ms,并且至少具备96 kB的内存.因为微处理器的主频越高,功耗也越高,因此,微处理器的选择要考虑速度和功耗因素.目前市面上常用的微处理芯片大致有MCU、DSP、FPGA这三类.DSP和FPGA虽然能满足系统对速度和内存的要求,但是其功耗通常很高,因此,优先选择MCU作为处理核心.
由于微处理器需要实现FFT算法,因此,需要运算速度较快、内存较大且功耗低的微处理器.内核简单的微处理器虽然功耗低,但是处理速度较慢,内存较小,无法满足系统的实时性要求.
TI公司推出的MSP430系列微控制器一直是低功耗设计领域中的佼佼者.但是由于MSP430在处理速度和内存上的限制,无法满足值守系统在信号处理上的要求.目前,ST公司推出的以ARM Cortex-M系列内核的微控制器在处理速度和低功耗方面表现出色.最后,我们选择了ST公司推出的STM32L476为处理核心.
STM32L476是一款基于ARM Cortex-M4内核的32位超低功耗单片机,采用90 nm工艺制造,最高主频达到了80 MHz,并且有1 MB的Flash,128 kB的SRAM,内置FPU(浮点运算单元),支持DSP指令集,大大加快了数据处理速度[6].根据EEMBC(Embedded Microprocessor Benchmark Consortium 嵌入式微处理器基准评测协会)最新发布的标准化ULPBench超低功耗微处理器能效对比评测结果,STM32L476获得ULP-Mark 187.70分,为业内目前最高成绩[7].它是目前将性能和低功耗最完美结合到一起的微处理器.它可以满足本文执行FFT算法对内存和处理速度上的要求,也可降低系统的功耗.
单片机的供电电压一般由电池经稳压芯片提供.常见的稳压芯片的转化效率低,以AMS1117-1.8 V为例,在输入5 V电压的情况下,其转化效率只有20%,大部分的能量都被消耗在稳压芯片上.STM32L476的供电电压范围是1.71~3.6 V.目前市面上的电池,常见的电压值有1.2,1.5,3.0,3.6,7.2 V.为了尽量降低系统的供电电压和避免稳压芯片效率过低带来过多的能量浪费,我们直接用两节1.2 V高性能电池串联得到2.4 V电压.
单片机的主频越高,处理速度越快,但是功耗也越高.图3显示了温度为25℃时,在不同的运行模式下,STM32L476的工作电流随着系统频率的变化关系[8].
图3 电流随主频的变化关系
由图3可以看出,不管在哪种运行模式下,STM32L476的工作电流都随着系统频率的增加而增加.根据待检测信号的频率,考虑到ADC的转换速度和采样频率以及执行FFT时间上的要求,需要STM32L476的主频至少为24 MHz.然后在STM32L476的LPRun、Range1、Range2模式中运行,LPRun模式的最高主频为2 MHz,无法满足实时性要求,而Range1模式系统频率为24 MHz时的工作电流比Range2模式大,因此我们选择STM32L476工作在Range2模式下,主频配置为24 MHz.
另一方面,开启单片机内部的锁相环倍频模块会增加单片机的功耗,因此,采用24 MHz的外部晶振作为时钟源,并关闭了内部的锁相环模块,在保证时钟精度的同时降低了系统功耗.
在程序中,当CPU进行函数调用时,需要进行现场保护,将当前CPU寄存器的数据压入堆栈( RAM ),在函数结束时又将CPU寄存器的数据弹出堆栈.由于对RAM操作会增加系统的功耗,因此在程序设计上,要尽量减少对RAM的操作[9].为此,使用宏定义来替换函数调用.因为,宏定义会在编译时展开,CPU只会顺序执行指令,避免了子程序调用,虽然代码量会增加,但STM32L476具有1 MB的Flash可以满足需求.在STMicroelectronics公司所推出的Low Layer API固件库中,大部分函数采用宏定义的方式,因此,可以大大减少对RAM的操作,从而使其功耗降低.
未使用的片内外设或间歇使用的片内外设应该及时关掉,以节省电能.不用且悬空的I/O引脚要初始化为模拟输入[10],因为如果引脚没有初始化,可能会增大单片机的漏电流.
系统测试框图如图4所示.为了尽可能模拟真实环境,系统测试时额外添加了加法器,用于叠加正弦信号和噪声.将叠加后的模拟信号送入信号调理电路,信号调理电路对其进行滤波、放大以及限幅,然后经过预处理后的信号被送入微处理器的ADC接口,微处理器完成对信号的采样和处理,并输出检测结果.
图4 系统测试框图
在实验室条件下,通过RIGOL DG3121A信号发生器产生正弦信号和噪声信号,然后通过加法器叠加,再经过信号调理电路滤除高频噪声并放大有用信号,再送至信号检测电路的ADC接口,做相应的处理,以测试系统能否正确检测到设定频率的正弦信号.使用Tektronix DMM4050六位半台式高精度万用表测量信号检测电路工作时的电压和电流,计算系统的功耗.图5是测试电路板正面照片,STM32L476芯片被焊接在电路板背面.
图5 测试电路板
(1) 不同微处理器选择的功耗对比
选用了以下几种微处理芯片去实现信号检测功能,其供电系统、时钟方案、软件程序、I/O模式都选用常见的默认模式,未做任何优化.其功耗数据测试见表1.
表1 不同微处理器功耗数值
表 1表明,如果采用DSP或者FPGA来实现信号检测功能时,功耗都很高.采用单片机实现时,功耗会明显下降,而STM32L476的功耗又比STM32F407低.因此微处理器的选择对系统功耗有至关重要的影响.
(2) 不同供电方式功耗对比
测试条件:以STM32L476为处理核心,单片机采用外部晶振,使用锁相环,主频为80 MHz,子程序不使用宏定义,没有使用的I/O未做初始化.测试数据见表2.
表2 不同供电方式功耗数值
表2表明,微处理器的工作电压越低,功耗也越低.然而,稳压芯片转化效率通常较低,会造成能量的浪费.因此,直接使用电压合适的电池给微处理器供电会大大降低系统功耗.
(3) 不同的时钟方案
测试条件:以STM32L476为处理核心,单片机采用外部晶振,供电系统直接采用2.4 V电池供电,子程序不使用宏定义,没有使用的I/O未做初始化.测试数据表3.
表3表明,单片机的主频越高,功耗也越高,并且开启PLL(锁相环)倍频模块也会增加功耗.因此,在满足系统处理速度的前提下,单片机的主频越低越好,锁相环倍频模块也需要关闭.
表3 不同时钟方案功耗数值
(4) 用宏代替子程序
测试条件:以STM32L476为处理核心,供电系统直接采用2.4 V电池供电,直接使用外部24 MHz晶振为其提供时钟,不使用锁相环,没有使用的I/O未做初始化.测试数据见表4.
表4 不同子程序写法功耗数值
表4表明,对比函数调用的方法,采用宏定义的方式编写子程序会使功耗降低.
(5) 不同模式的I/O
测试条件:以STM32L476为处理核心,供电系统直接采用2.4 V电池供电,直接使用外部24 MHz晶振为其提供时钟,不使用锁相环,子程序使用宏定义.测试数据见表5.
表5 不同模式的I/O功耗数值
表5表明,对比I/O未做任何初始化,将未使用的I/O初始化为模拟输入,可以使功耗降低.
本设计针对水下值守系统对低功耗的要求,从硬件和软件两方面系统地分析了降低功耗的方法,并通过实际测试,验证了各种方法的有效性.本文研究对其他低功耗系统的设计具有参考价值和借鉴意义.