请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP430G2452 主题中讨论的其他部件: ENERGYTRACE, MSP430F5528
我正在尝试了解通电跟踪的脉冲计数方法,脉冲计数不是由MSP430G2452 (它完全负责DCDC操作)完成的, 而是由较大的MSP430F5528处理DCDC脉冲计数,目标VCC监控,时间戳和USB流。
此固件的源分散在MSPDebugStack_OS_Package_3_15_1_1\BIOS中,显然,一些与脉冲计数相关的操作是在hil目录中完成的,特别是在我可以看到的hil.c目录中
void hil_initTimerB0(void)
{
// Setup timer_B0 for current pulse measurement
TB0CTL = MC__STOP;
TB0CTL = TBSSEL__TBCLK + MC__CONTINUOUS + TBIE;
}
// -----------------------------------------------------------------------------
void hil_initTimerA0(void)
{
// Setup time_A0 for timestamping
TA0CTL = MC__STOP; // STOP Timer
TA0CTL = ID__8 + TASSEL__SMCLK; // Timer_A0 source:SMCLK/8 = 20 / 8 = 2.500 MHz = 1/400ns
TA0EX0 = 1; // Timer_A0 set additional divider to /2
TA0CTL |= TACLR + MC__CONTINOUS + TAIE; // START the timer in free-running mode
}
这些是脉冲计数计时器和时间戳计时器的内侧。 我可以知道时间戳计时器是2.5MHz,但脉冲计时器的时间基准是多少?
FetDcdc.c中有此校准功能,它使用TB0R
#ifdef MSP_FET
#define PULSES TB0R
#else
#define PULSES TA2R
#endif
if(_fetType == eZ_FET_WITH_DCDC_NO_FLOWCTL || _fetType == eZ_FET_WITH_DCDC ||_fetType == MSP_FET_WITH_DCDC
|| _fetType == MSP_FET_WITH_DCDC_V2x || _fetType == eZ_FET_WITH_DCDC_V2x)
{
_DINT_FET();
for(i = 0; i < count; ++i)
{
TA0CTL |= TACLR + MC__CONTINOUS + TAIE; // START the timer in free-running mode
i0 = PULSES;
t0 = TA0R;
// Sample VCCout
ADC12CTL0 &= ~ADC12ENC; // Disable conversion, write controls
ADC12MCTL0 = ADC12SREF_1 + 1; // select Vref and analog channel Ax
ADC12CTL0 |= ADC12ENC; // Enable conversions
ADC12IFG &= ~BIT0;
ADC12CTL0 |= ADC12SC; // Start conversions
while ((ADC12IFG & BIT0) == 0); // wait until conversion is done
ADC12IFG &= ~BIT0;
// Wait for some time
for(volatile unsigned long j = 0; j < DELAYCOUNT; ++j);
i1 = PULSES;
t1 = TA0R;
*time += (t1 - t0);
*ticks += (i1 - i0);
}
_EINT_FET();
}
}另第194行:
//Configure port mapper and P2 for current measuring
P2DIR &= ~BIT0;
P2SEL |= BIT0;
_DINT_FET();
PMAPKEYID = PMAPKEY;
PMAPCTL |= PMAPRECFG;
P2MAP0 = PM_TB0CLK;
PMAPKEYID = 0;
_EINT_FET();
dcdc_SetVcc(3300);STAM.c中有此项,不确定它是否是同一定时器B0
#pragma vector=TIMER2_A0_VECTOR
__interrupt void TIMER2_A0_ISR(void)
{
if(STREAM_getSharedVariable(ID_SHARED_MEMORY_TYPE_TIMER_TICK, &TimerTick))
{
(*(unsigned short*)TimerTick)++;
}
}
#pragma vector=TIMER0_B1_VECTOR
__interrupt void TIMER0_B1_ISR_(void)
{
switch (__even_in_range(TB0IV, TB0IV_TB0IFG))
{
case TB0IV_TB0IFG:
if(STREAM_getSharedVariable(ID_SHARED_MEMORY_TYPE_I_TICK, &ITick))
{
++(*(unsigned short*)ITick);
}
break;
default:
break;
}
}所以,我想知道哪种方法用于测量脉冲,它是否在计算脉冲之间的时间?
至于为什么,我将energytrace DCDC集成到测试板中,用于能源预算评估,因此我想从仪器MCU正确读取脉冲。
带有MSP430G2452的DCDC部件工作正常,我甚至添加了12位i2c DAC作为电压参考,以便我可以控制目标VCC,所有i2c命令都工作正常,DCDC性能正常。 所以现在我必须正确计算脉冲数并从这里提取数据。
如果任何人有线索,任何信息都将很有帮助。