我的系统由3.6V LiSOCl2锂电池供电时出现问题。 这些电池有时会有一种奇怪的行为,即虽然其电压高于切断水平,但其容量却很低。 系统正在使用外部2通道ADC对照参考传感器对电阻传感器执行比例测量。 如果蓄电池存在上述问题,则在测量两个电阻器(2个ADC通道)期间,电压将下降,从而导致较大的测量误差。 为了检测此错误,我正在测量使用ADC12 BATTMAP输入转换每个通道后的蓄电池电压,并检查它们是否几乎相等。 但是,尽管两个转换之间的电压稳定,但该值不时会有显著差异。 有时超过100个广告步骤。 我想这肯定是一种时间问题,但我找不到原因
bool batFlag = false;
void ADC12_init(void)
{
while (Ref_A_isRefGenBusy(ADC12_B_BASE));
REFCTL0 |= REFVSEL_1 | REFON; // 2,0 V
ADC12_B_configureMemoryParam configureMemoryParam = {0};
configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_0;
configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_BATMAP;
configureMemoryParam.refVoltageSourceSelect = ADC12_B_VREFPOS_INTBUF_VREFNEG_VSS;
configureMemoryParam.endOfSequence = ADC12_B_NOTENDOFSEQUENCE;
configureMemoryParam.windowComparatorSelect = ADC12_B_WINDOW_COMPARATOR_DISABLE;
configureMemoryParam.differentialModeSelect = ADC12_B_DIFFERENTIAL_MODE_DISABLE;
ADC12_B_initParam initParam = {0};
initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC; // = 5 MHz MODOSC / ALT: ADC12_B_CLOCKSOURCE_ACLK _MCLK _SMCLK
initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_5; // -> 1 MHz ALT: ADC12_B_CLOCKDIVIDER_1;
initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
initParam.internalChannelMap = ADC12_B_BATTMAP; // Interner Kanal: Spannungsteiler Versorgungsspannung (1/2 AVCC
ADC12_B_init(ADC12_B_BASE, &initParam);
ADC12_B_enable(ADC12_B_BASE);
ADC12_B_setResolution(ADC12_B_BASE, ADC12_B_RESOLUTION_12BIT); //ADC12_B_RESOLUTION_8BIT);
ADC12_B_setAdcPowerMode(ADC12_B_BASE, ADC12_B_LOWPOWERMODE);
ADC12_B_setupSamplingTimer(ADC12_B_BASE,
ADC12_B_CYCLEHOLD_512_CYCLES,
ADC12_B_CYCLEHOLD_512_CYCLES,
ADC12_B_MULTIPLESAMPLESDISABLE);
ADC12_B_configureMemory(ADC12_B_BASE, &configureMemoryParam);
ADC12_B_enableInterrupt(ADC12_B_BASE, ADC12_B_IE0, 0, 0);
while(!(REFCTL0 & REFGENRDY));
}
void ADC12_measure(void)
{
ADC12_B_startConversion(ADC12_B_BASE, ADC12_B_MEMORY_0, ADC12_B_SINGLECHANNEL);
}
uint16_t ADC12_getResult(void)
{
return ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0);
}
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
switch (__even_in_range(ADC12IV, ADC12IV_ADC12RDYIFG))
{
case ADC12IV_ADC12IFG0:
batFlag = true;
__bic_SR_register_on_exit(LPM0_bits | GIE); // Exit CPU, clear interrupts
break;
default: break;
}
}
主线程将检查batFlag是否为true,并将调用ADC12_getResult函数并 返回到LPM0。 在转换外部ADC后,ADC12_Measure()的主线程将触发测量。 我已经尝试降低时钟速度并增加ADC的采样时间,但没有任何效果。 在最快的测量模式下,蓄电池电压将每秒测量6次。 可能是什么问题?