This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5994:ADC12 BATTMAP测量问题

Guru**** 2387830 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1100131/msp430fr5994-problem-measuring-adc12-battmap

部件号:MSP430FR5994

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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Holger,

    ,5994,但尽管两个转换之间的电压稳定,该值不时会有很大差异

    这种情况发生的频率如何?  在一分钟,一小时,一天内多次...等等?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很难说。 50次测量中可能有一次。 我改变了计算20个电池测量对差值的平均值的程序,如果它超过10个ADC步长(这已经导致错误略大于允许的0,2 %),它会显示错误。 第二天早上,3台测试仪器中的2台显示了这一错误。 然后我将此阈值更改为20个ADC步进,一夜之间就没有出现错误。 此外,它们还能在一段时间后正确检测出故障电池。 但我对这种“解决方案”并不满意。 BATTMAP -信号是否有噪音?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Holger,

    这是一个好问题。  我需要联系我们的一位设计师,他们可能会对此有所了解。

    您是否在每次采样期间尝试过反向测量BATMAP通道并比较两个连续结果?

    此外,查看代码,转换是由ADC12_B_startConversion函数中的软件启动的,这很好。  看着您的ISR,我想在从该函数返回后,您输入一个LPMx并等待中断唤醒CPU以获得结果?   您可以确认吗?  我要寻找的是,在测量BATMAP通道时,是否可能没有CPU时钟。

    可能值得设置一些简单的测试代码,使CPU保持在LPM3中,而计时器(参见数据表中的表84页)则在与您在代码中执行转换的频率相匹配的某个定期时间开始转换。  然后,CPU唤醒的唯一时间是从ADC EOC中断中获取结果。  如果您可以尝试,请告诉我,否则我可以尝试。