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.

[参考译文] CCS/MSP430FR6922:使用 Battmap 进行电池监控

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/856546/ccs-msp430fr6922-battery-monitoring-with-battmap

器件型号:MSP430FR6922

工具/软件:Code Composer Studio

您好!

我正在尝试使用 ADC12BATMAP 位监控 MSP430FR6922上的 AVCC/2值。 因此、ADC 始终为我提供4095、2.0V 或2.5V 的内部基准电压。  

这是我的 ADC12初始化函数:  

void ADC12_init (void)
{
/*选择内部基准电压= 2.0V */
while (Ref_A_isRefGenBusy (ADC12_B_B_BASE));
Ref_A_setReferenceVoltage (ADC12_B_BASE、REF_A_VREF2_5V);

ADC12_B_configureMemoryParam configureMemoryParam ={0};
configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_0;
configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_BATMAP;
configureMemoryParam.refVoltageSourceSelect = ADC12_B_VREFPS_INTBUF_VREFNEG_VSS;
configureMemoryParam.endOfSequence = ADC12_B_ENDOSEQUENCE;
configureMemoryParam.windowComparatorSelect = ADC12_B_Window_Comparator_disable;
configureMemoryParam.differialModeSelect = ADC12_B_different_mode_disable;

ADC12_B_initParam initParam ={0};

initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;
initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
initParam.internalChannelMap = ADC12_B_B_B_BATTMAP;

/*打开基准电压*/
Ref_A_enableReferenceVoltage (ADC12_B_B_BASE);

/*启用内存缓冲区*/
ADC12_B_configureMemory (ADC12_B_base、&configureMemoryParam);

/*启用 ADC12B 模块*/
ADC12_B_init (ADC12_B_B_base、&initParam);
ADC12_B_ENABLE (ADC12_B_B_BASE);

//启用存储器缓冲器0中断
ADC12_B_clearInterrupt (ADC12_B_BASE、0、ADC12_B_IFG0);
ADC12_B_enableInterrupt (ADC12_B_base、ADC12_B_IE0、0、0);

ADC12_B_setupSamplingTimer (ADC12_B_BASE、
ADC12_B_CYCLEHOLD_16_CYCLES、
ADC12_B_CYCLEHOLD_16_CYCLES、
ADC12_B_MULTIPLESAMPLESDISABLE);
} 

在这里,我们的电话是:

/*启动 ADC */
ADC12_init ();

#if (1)
_enable_interrupt ();

while (1)
{
_delay_cycles (10000);

ADC12_B_clearInterrupt (ADC12_B_BASE、0、ADC12_B_IFG0);
ADC12_B_startConversion (ADC12_B_base、ADC12_B_MEMORY_0、ADC12_B_SINGLECHANNEL);

_bis_SR_register (LPM0_bits + GIE);
__no_operation();
}
#endif 

我使用中断内部的断点:  

#pragma vector=ADC12_vector
_interrupt void ADC12_ISR (void)
{
易失 uint16 ADC = ADC12_B_getResults (ADC12_B_B_B_BASE、ADC12_B_MEMORY_0);

__no_operation();
__BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);
} 

提前感谢!

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

    你(们)好,皮泰

    您可以参考我已经测试过的演示代码

    e2e.ti.com/.../msp430fr6x7x_5F00_adc12_5F00_battery.c

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

    感谢您的代码! 有了它、我就能发现内部基准存在问题。 我不知道 ADC12_B.c 中的两个函数为什么不起作用。 以下是最终代码:  

    /*选择内部基准电压= 2.0V */
    while (Ref_A_isRefGenBusy (ADC12_B_B_BASE));
    REFCTL0 |= REFVSEL_1 | REFON;
    
    /*选择内部基准电压= 2.0V -不起作用*/
    // while (Ref_A_isRefGenBusy (ADC12_B_B_BASE));
    //Ref_A_setReferenceVoltage (ADC12_BASE、REF_A_VREF2_0V);
    //Ref_A_enableReferenceVoltage (ADC12_B_B_BASE);
    
    ADC12_B_configureMemoryParam configureMemoryParam ={0};
    configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_0;
    configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_BATMAP;
    configureMemoryParam.refVoltageSourceSelect = ADC12_B_VREFPS_INTBUF_VREFNEG_VSS;
    configureMemoryParam.endOfSequence = ADC12_B_NOTENDOSEQUENCE;
    configureMemoryParam.windowComparatorSelect = ADC12_B_Window_Comparator_disable;
    configureMemoryParam.differialModeSelect = ADC12_B_different_mode_disable;
    
    ADC12_B_initParam initParam ={0};
    initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
    initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;
    initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
    initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
    initParam.internalChannelMap = ADC12_B_B_B_BATTMAP;
    
    /*启用 ADC12B 模块*/
    ADC12_B_init (ADC12_B_B_base、&initParam);
    ADC12_B_ENABLE (ADC12_B_B_BASE);
    
    /*配置采样计时器*/
    ADC12_B_setupSamplingTimer (ADC12_B_BASE、
    ADC12_B_CYCLEHOLD_16_CYCLES、
    ADC12_B_CYCLEHOLD_16_CYCLES、
    ADC12_B_MULTIPLESAMPLESDISABLE);
    
    //启用存储器缓冲器0中断
    ADC12_B_clearInterrupt (ADC12_B_BASE、0、ADC12_B_IFG0);
    ADC12_B_enableInterrupt (ADC12_B_base、ADC12_B_IE0、0、0);
    
    /*启用内存缓冲区*/
    ADC12_B_configureMemory (ADC12_B_base、&configureMemoryParam);
    
    while (!(REFCTL0 & REFGENRDY)); //等待基准发生器 

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

    我发送给您的代码是否正常工作? 如果它正常工作、您可以将其作为参考。 我不建议您使用驱动程序库、该驱动程序库会占用更多的存储器空间、并且不易读取和调试。 您可以使用我发送给您的寄存器级演示。