我的系统由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次。 可能是什么问题?