在工作中经常会用到Power Monitor监控设备的工作电流,除了进行基本的待机测试,还有一些特定的场景会启动不同的CPU核心,关注CPU跑在不同的电压和频率上引起的电流变化,需要通过改变软件的负载平衡达到最佳的功耗性能比。
主流的Power Monitor是MonSoon公司出品的,价格在7000~8000元之间,如下图。
可以设定1V~14V之间的输出电压,我们使用最多的是电流采样功能。电流精度可以到uA级别,时间精度可以到mS级别。足以应付研发测试的需求,缺点就是价格太贵了。公司只有几台这样的设备,需要用的时候经常和别人冲突,于是我考虑自己做一台Power Monitor。
首先考虑的是电压输出,网上买一个二手台式机电脑电源50元输出3.3V/5V/12V,加上一个某宝上到处都是的LDO或者DCDC调压模块,27元很便宜。XL4015就很好,最大可以输出75W,对于电池供电设备来说已经是绰绰有余了。
电压输出搞定了,下面就是考虑电流采样的设备选型了。选用的是Ti的INA240电流感应放大器,某宝上有现成的模块卖,价格56人民币。
该放大器内置Gain有50倍,输出电压可以使用STM32单片机的ADC来采样,输出电压的曲线如下图
理想是采用第二种双向采样模式,因为我希望Power Monitor能采集充电电流和放电电流。如果VCC直接连接单片机的3.3V的话,Vcc/2为1.65V,我购买的模块使用10m欧的精密电阻,GAIN为50,最大能测到的电流是1.65/(50 * 0.01) = +/- 3.3A. 考虑到STM32F407的ADC最大的分辨率是12bits (4096 levels.),但是ADC的REF是0V~3.3V,意味着我只能使用最大精度的一半量程了,于是电流的最大精度是3.3 / 2048 / (50 * 0.01) = 0.0032A,大概是3.2mA左右,我期望测试的设备的最小待机功耗在10mA左右,变动的精度< 5mA都是满足要求的,看上去可行。如果和购买的Power Monitor相比的话,还是要差一个数量级,Monsoon的PM最低可以测试uA的精度。但是我这个成本不足200元人民币,看在价格的份上还是容忍一下精度的差异。当然如果要提升精度的话,也很简单,选取更高bits的ADC模块,或者提高采样电阻的阻值,我这里是10m欧的电阻,某宝上还有更高电阻的模块(20m欧,40m欧....)可供选择。
如果采用第一种单向采样模式的话,虽然不能测试充电电流,但是电流量程却可以大幅提高,最大电流可以到3.3/(50 * 0.01) = 6.6A (0~6.6A),最大精度依然是3.2mA左右 (6.6/4096/(50 * 0.01))。
下面需要考虑的就是采样时间的最小精度了,STM32F407能提供最大2.4MSPS的采样率,对我来说是绰绰有余,作为一个验证机,我考虑使用1Khz的采样率 (1ms)来验证其可行性。
家里正好还有一块STM32F407最小系统板就无需到某宝上再去采购了。
硬件组装好后如上图,下面就是我最喜欢的软件部分了。基本的框架比较简单,分为上位机和下位机两部分。
[Sensors/Input Devices]
|
v
[ADC on STM32F407] ---> [USB Interface on STM32F407] ---> [PC]
|
v
[Power Supply]
我一般会选用FreeRTOS作为Base来开发下位机的软件模块,基本的框架如下:
ADC 任务:此任务由计时器触发,负责处理 ADC 采样。数据通过 DMA 直接传输到缓冲区,以减轻 CPU 负载。
USB RX 任务和 USB TX 任务:分别处理通过 USB 的数据接收和传输。
xQueue:用于任务间通信,使任务能够有效地传递数据或消息,同时不损失实时性能。
我在代码中直接设置为1Khz的采样率以简化代码流程。
下面是上位机部分,上位机使用QT开发为了更好的实时性。我使用了开源的SerialPlotter作为模板,简单的改了下ADC转换公式,其他大部分都直接使用了模板的代码,因为我使用的是基于CDC的USB-Serial,所以并不需要串口的设置,这一部分也做了相关的简化处理。
调节电流的时候,相应的上位机电流变化趋势。为了测试方便,使用带电流计的Power Supply来比较上位机显示电流和实际电流差异,结果还是挺MATCH的。
大家后继可以基于开源代码修改上位机界面或修改下位机的命令响应,设置不同的采样率以提高响应,或使用外置的ADC模块获取更高的精度。
对应的代码已经开源,欢迎访问:
https://gitlab.com/imwangwang/freertos_powermonitor
https://gitlab.com/imwangwang/qt_powermonitor