TI MSPM0L1306 LaunchPad体验09:板载示波器?使用EnergyTrace观察动态功耗变化
[复制链接]
EnergyTrace介绍
EnergyTrace是TI用于分析功耗的工具,硬件部分已经集成在LaunchPad上搭载的XDS110调试器里,软件部分集成在CCS集成开发环境里。所以为了观察开发板的动态功耗情况,要求不高的话,就不需要外接万用表或者示波器了。
得由于MSP430等低功耗微控制器的多年发展,EnergyTrace技术也已经很成熟了,官方说明的测量范围和精度如下:
这个精度用于大部分开发应用已经足够了。
另外EnergyTrace还有个高动态范围(High Dynamic Range)版本EnergyTrace HDR,相当于有2档量程:
采样率方面,EnergyTrace和EnergyTrace HDR分别有2kSPS和256kSPS,对于一般用途的功耗跟踪完全够用。
EnergyTrace体验
LaunchPad上默认搭载了EnergyTrace的相关硬件,但新款CCS Theia 1.1.0还不支持这个功能(软件里和文档全文搜索都没有找到),需要安装传统版的CCS。
这里用一个pwm呼吸灯程序来测试EnergyTrace,由于LED亮度变化会产生显著的功耗变化,预期会看到和LED呼吸频率相同的功耗变化曲线。
效果视频:
(代码见文末)
EnergyTrace可以在CCS的Tools菜单或工具栏上找到:
主界面如下图:
需要关注的是界面右上角的一排功能按钮。
第1个红色按钮是总开关;
第2个绿色的三角是启动开关;
第3个是采集时长;
采集时长支持开始和结束的高级触发,是捕获特殊情况的利器:
采集视频:
采集结果:
除了功耗、电压、电流的统计值,还贴心的给出了电池供电时,电池的寿命。
电池的类型可在Window-Preferences里设定:
瞬时功耗曲线:
能量消耗曲线:
数据可以导出为CSV文件,便于进一步处理
小结
EnergyTrace配合LaunchPad上板载的XDS110,可以实现动态功耗的测量和统计,为电池供电的应用开发提供了完整的功耗观测方法和软件。期待这套软件系统能尽早移植到CCS Theia里。
完整代码
SysConfig参考代码
/**
* These arguments were used when this file was generated. They will be automatically applied on subsequent loads
* via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments.
*/
// @cliArgs --device "MSPM0L130X" --package "VQFN-32(RHB)" --part "Default"
// @cliArgs --board /ti/boards/LP_MSPM0L1306 --rtos nortos
/**
* Import the modules used in this configuration.
*/
const PWM = scripting.addModule("/ti/driverlib/PWM", {}, false);
const PWM1 = PWM.addInstance();
/**
* Write custom configuration values to the imported modules.
*/
PWM1.$name = "PWM_0";
PWM1.clockPrescale = 256;
PWM1.timerCount = 2000;
PWM1.timerStartTimer = true;
PWM1.interrupts = ["CC0_DN_EVENT","LOAD_EVENT"];
PWM1.ccIndex = [1];
PWM1.peripheral.$assign = "TIMG0";
PWM1.PWM_CHANNEL_1.$name = "ti_driverlib_pwm_PWMTimerCC0";
PWM1.PWM_CHANNEL_1.dutyCycle = 10;
const Board = scripting.addModule("/ti/driverlib/Board", {}, false);
const SYSCTL = scripting.addModule("/ti/driverlib/SYSCTL", {}, false);
主程序代码
#include "ti_msp_dl_config.h"
int pwm_count = 1800; // initial ccr count based on 10% duty cycle
int dc = 10; // initialized to 10 % duty cycle
int mode = 1; // 1 = up (will indicate you need to increase dc), 0 = down (will
// decrease dc)
int main(void) {
SYSCFG_DL_init();
NVIC_EnableIRQ(PWM_0_INST_INT_IRQN);
DL_TimerG_startCounter(PWM_0_INST);
while (1) {
__WFI();
}
}
void PWM_0_INST_IRQHandler(void) {
switch (DL_TimerG_getPendingInterrupt(PWM_0_INST)) {
case DL_TIMER_IIDX_LOAD:
if (dc <= 10) {
mode = 1;
} // if reached lowest dc (10%), increase dc
else if (dc >= 90) {
mode = 0;
} // if reached highest dc (90%), decrease dc
if (mode) {
pwm_count -= 20;
dc += 1;
} // up
if (!mode) {
pwm_count += 20;
dc -= 1;
} // down
DL_TimerG_setCaptureCompareValue(PWM_0_INST, pwm_count,
DL_TIMER_CC_1_INDEX); // update ccr1 value
break;
default:
break;
}
}
|