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/MSP430FR5994:如何使用 ADC 测量电压

Guru**** 2591840 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/688702/ccs-msp430fr5994-how-to-use-adc-to-measure-voltage

器件型号:MSP430FR5994

工具/软件:Code Composer Studio

下面是 FRAM 实用程序示例中的一个代码、它使用 ADC 来检测断电时间

如何修改此代码以检测器件何时降至特定电压

void initAdcMonitor(void){

/*初始化 ADC 触发的计时器。 *
TA0CCR0 =(SMCLK_FREQUENCY /ADC_MONITOR_FREQUENCY);
TA0CCR1 = TA0CCR0/2;
TA0CCTL1 = OUTMOD_3;
TA0CTL = tassel_SMCLK | MC__UP;

/*配置2.0V 内部基准电压。 *
while (REFCTL0和 REFGENBUSY);
REFCTL0 |= REFVSEL_1 | REFON;
while (!(REFCTL0 & REFGENRDY));

/*
*使用电池监控器初始化 ADC12_B 窗口比较器。
*监护仪将首先启用监护仪电压正极的高侧
0.1V、以确保电压足够高于阈值。 时间
*触发高侧中断服务例程将切换到
*低侧并等待电压降至阈值以下。 时间
*电压降至器件将调用的阈值电压以下
*通过断电关断功能进行计算以节省应用
*状态并进入器件完全关断状态。
*
ADC12CTL0 = ADC12SHT0_2 | ADC12ON;
ADC12CTL1 = ADC12SH_1 | ADC12SSEL_0 | ADC12CONSEQ_2 | ADC12SHP;
ADC12CTL3 = ADC12BATMAP;
ADC12MCTL0 = ADC12INCH_31 | ADC12VRSEL_1 | ADC12WINC;
ADC12HI =(uint16_t)(4096*((adc_monitor_threshold+0.1)/2)/(2.0));
ADC12LO =(uint16_t)(4096*(ADC_MONIT_THRESHOLD/2)/(2.0));
ADC12IFGR2 &=~(ADC12HIIFG | ADC12LOIFG);
ADC12IER2 = ADC12HIIE;
ADC12CTL0 |= ADC12ENC;
}

#pragma vector = ADC12_vector
__interrupt void ADC12_ISR (void)
{
switch (__evo_in_range (ADC12IV、ADC12IV_ADC12LOIFG)){
ADC12IV_NONE 案例: 中断; //向量0:无中断
案例 ADC12IV_ADC12OVIFG:中断; //向量2:ADC12MEMx 溢出
ADC12IV_ADC12TOVIFG 案例:中断; //向量4:转换时间溢出
ADC12IV_ADC12HIIFG 案例: //矢量6:窗口比较器高侧
/*禁用高侧并启用低侧中断。 *
ADC12IER2 &=~ADC12HIIE;
ADC12IER2 |= ADC12LOIE;
ADC12IFGR2 &=~ADC12LOIFG;
中断;
ADC12IV_ADC12LOIFG 案例: //矢量8:窗口比较器低侧
/*进入器件关断模式、超时为64ms。 *
ctpl_enterShutdown (CTPL_SHUTDOWN_TIMEOUT_64_MS);

/*禁用低侧并启用高侧中断。 *
ADC12IER2 &=~ADC12LOIE;
ADC12IER2 |= ADC12HIIE;
ADC12IFGR2 &=~ADC12HIIFG;
中断;
默认值:break;
}
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以参考此主题帖
    e2e.ti.com/.../679397
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    调整 ADC_MONITOR_THRESHOLD 是否有作用?

    根据初始化函数中的注释、它首先使用 ADC_MONIT_THRESHOLD 设置高低阈值

    然后、中断检测器件是否高于阈值、并允许器件切换至检测电压何时低于阈值

    当我尝试在电路板上测试该值时、似乎器件始终高于阈值、即使是在低功耗时也是如此

    我已经在3.0和5.0上测试了 ADC_MONIT_THRESHOLD
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好
    您可以参阅此测试代码(有关更多详细信息、请参阅 www.ti.com/.../slaa828.pdf):
    #include

    #define High_Threshold 568

    int main (空)

    WDTCTL = WDTPW | WDTHOLD; //停止 WDT
    P1REN = 0xff;
    P2REN = 0xff;
    P3REN = 0xff;
    P4REN = 0xf9;
    P5REN = 0xff;
    P6REN = 0xff;
    P7REN = 0xff;
    P8REN = 0x0F;
    P1OUT = 0;
    P2OUT = 0;
    P3OUT = 0;
    P4OUT = 0;
    P5OUT = 0;
    P6OUT = 0;
    P7OUT = 0;
    P8OUT = 0;
    P8DIR=BIT0;//P8.0 SMCLK
    P1DIR=BIT0;//P1.0 LED
    P8SEL0 |= BIT0;
    SYSCFG2 |= ADCPCTL1;
    P4SEL0 |= BIT1 | BIT2; //将 XT1引脚设置为第二功能
    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    P1OUT &=~BIT0; //清除 P1.0 LED 关闭
    操作

    CSCTL7 &=~(XT1OFFG | DCOFFG); //清除 XT1和 DCO 故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1和 OFIFG); //测试振荡器故障标志

    _bis_SR_register (SCG0); //禁用 FLL
    CSCTL3 |= SELREF_XT1CLK; //将 XT1CLK 设置为 FLL 基准源
    _DELAY_CYCLES (3);
    _BIC_SR_register (SCG0); //启用 FLL
    while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));//轮询直到 FLL 被锁定

    CSCTL4 = SELMS_DCOCLKDIV | SELA_XT1CLK;//设置 ACLK = XT1CLK = 32768Hz

    //配置 ADC10
    ADCCTL0 &=~ADCENC; //禁用 ADC
    ADCCTL0 = ADCSHT_2 | ADCON; // ADCON、S&H=16 ADC 时钟
    // ADCCTL1 = ADCSHP|ADCSSEL_1|ADCSHS_1_ADCCONSEQ_2;// SAMPLE_TIMER、ACLK、RTC、REPEAC_SINGLE
    ADCCTL1 = ADCSHP|ADCSHS_1|ADCCONSEQ_2;// SAMPLE_TIMER、MODCLK、RTC、REPEARE_SINGLE
    ADCHI =高电平阈值; //窗口比较器高阈值
    ADCMCTL0 = ADCINCH_1 | ADCSREF_0;
    ADCIE = ADCHIIE;
    ADCCTL2 = ADCRES|ADCSR;

    //配置 PMM 中的参考模块
    PMMCTL0_H = PMMPW_H; //解锁 PMM 寄存器
    PMMCTL2 |= INTREFEN; //启用内部基准
    while (!(PMMCTL2 & REFGENRDY)); //轮询直至内部基准稳定
    _DELAY_CYCLES (400); //基准趋稳延迟


    RTCMOD = 0x7; //初始化 RTC
    RTCCTL = RTCSS_3 | RTCSR | RTCPS__1000;//VLOCLK、
    ADCCTL0 |= ADCENC; //采样和转换开始
    while (1)

    //__delay_cycles (90000);
    _bis_SR_register (LPM3_bits | GIE);//输入 LPM0、ADC_ISR 将强制退出



    // ADC 中断服务例程
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=ADC_vector
    _interrupt void ADC_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((interrupt (ADC_vector))) ADC_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    switch (__evo_in_range (ADCIV、ADCIV_ADCIFG))

    案例 ADCIV_NONE:
    中断;
    ADCIV_ADCOVIFG 案例:
    中断;
    案例 ADCIV_ADCTOVIFG:
    中断;
    ADCIV_ADCHIIFG 案例:
    _DELAY_CYCLES (2);//报警
    P1OUT |= BIT0; //将 P1.0 LED 设置为打开
    _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//从 LPM 退出
    中断;
    ADCIV_ADCLOIFG 案例:
    中断;
    ADCIV_ADCINIFG 案例:
    中断;
    ADCIV_ADCIFG 案例:
    // adcResult = ADCMEM0; //读取 ADC 存储器
    //__BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);//从 LPM 退出
    中断;
    默认值:
    中断;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢这个示例、但我希望它使用 ADC12进行比较、因为它可以实现高电平和低电平、并且对我的应用很有用

    您是否知道为什么低阈值情况看起来从未发生?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需打开高阈值中断 ADC12IER2 = ADC12HIIE;您应该将其更改为 ADC12IER2 = ADC12HIIE|ADC12LOIE;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我只在初始化时打开高阈值中断

    当高阈值中断 A 发生时、我打开低阈值中断

    因此、低阈值仅在我第一次达到高阈值时才会产生影响
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好
    当您更改 VCC 电压时、您无法获得 ADC 的任何中断?
    您是否已检查 ADC 转换结果寄存器的值是否正确(VCC/2)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我只能获得高阈值中断

    我测试的每个 ADC_MONITOR_THRESHOLD 值似乎总是会返回高阈值中断

    从不发生低阈值中断

    这是一个示例代码、专门用于电路板的框架示例、因此我不知道是什么 否则问题可能是什么
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您如何改变电源? 是否确定您已超过给定的 VCC 阈值?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我现在修复了它、认为我的代码丢失了一些非常微小的东西

    我从示例中删除了代码、现在它可以正常工作、很抱歉造成了任何混淆